#include #include #include #include #define VHOST_ROOT "/var/www" #define CGI "cgi-bin" #define SERVER "epochttpd/2.0 (Unix)" void standard_headers() { printf("Server: %s\n",SERVER); } int main(int argc,char *argv[]) { int fd; char *name[10]; int s,n; short in; char *method; char *page; char *version; char *get_param; char line[getpagesize()]; fgets(line,sizeof(line)-1,stdin); if(!strchr(line,'\n')) { printf("HTTP/1.1 413 Entity Too Large\r\n"); standard_headers(); printf("Content-type: text/plain\r\n\r\n"); printf("use smaller (<%d bytes) headers.\n",getpagesize()); return 0; } if(strchr(line,'\r')) *strchr(line,'\r')=0; method=strdup(line); if((page=strchr(method,' '))) { *page=0; page++; if((version=strchr(page,' '))) { *version=0; version++; } if((get_param=strchr(page,'?'))) { *get_param=0; get_param++; setenv("QUERY_STRING",get_param); } } while(fgets(line,sizeof(line)-1,stdin)) { if(!strchr(line,'\n')) { printf("HTTP/1.1 413 Entity Too Large\r\n"); standard_headers(); printf("Content-type: text/plain\r\n\r\n"); printf("use smaller (<%d bytes) headers.\n",getpagesize()); return 0; } if(strchr(line,'\r')) *strchr(line,'\r')=0; if(!strncasecmp(line,"Host: ",6)) { setenv("HTTP_HOST",line+6); } if(!strcmp(line,"")) { break; } } //TODO: sanitize this. chdir(VHOST_ROOT); chdir((char*)getenv("HTTP_HOST")); if(strncmp(page,"/cgi-bin/",9)) { for(;*page == '/';page++); if(page[strlen(page)-1] == '/') { printf("HTTP/1.1 302 Moved Permanently\r\n"); standard_headers(); printf("Location: /%sindex.html\r\n\r\n",page); return 0; } if(fd=open(page,O_RDONLY) != -1) {//need to check that the file isn't a directory. :P printf("HTTP/1.1 200 OK\r\n"); standard_headers(); name[0]="/usr/local/bin/mime-type"; name[1]=page; name[2]=0; printf("Content-type: "); fflush(stdout); switch(fork()) { case 0://child execv(name[0],name); break; case -1://error printf("fork failed.\n"); break; default://parent break; } wait(&s); fflush(stdout); printf("\r\n"); while((n=read(fd,line,sizeof(line))) > 0) { write(1,line,n); } } else { printf("HTTP/1.1 404 Not Found\r\n"); standard_headers(); printf("Content-type: text/plain\r\n\r\n"); printf("Can't open that page.\n"); } } else { //attempt to run this bastard! chdir(CGI); page+=strlen("/cgi-bin/"); for(;*page == '/';page++); name[0]=page; name[1]=0; printf("HTTP/1.1 200 OK\r\n"); standard_headers(); fflush(stdout); execv(name[0],name); } return 0; }