diff options
author | Epoch Qwert <epoch@53flpnlls43fcguy.onion> | 2014-10-21 12:49:50 -0500 |
---|---|---|
committer | Epoch Qwert <epoch@53flpnlls43fcguy.onion> | 2014-10-21 12:53:12 -0500 |
commit | 12201178a5950eecd9537e642b1246011490b499 (patch) | |
tree | b606b8f77af7d8b77a92ef5a3f7c905d66b97ad9 /src/libexec | |
parent | 1852f2d7d63c39d0fd97a2774d1bd16bf53ec67d (diff) | |
download | misc-12201178a5950eecd9537e642b1246011490b499.tar.gz misc-12201178a5950eecd9537e642b1246011490b499.zip |
updated rebuild.sh to work better with libexec and bin instead of just bin.
added epochttpd 2
Diffstat (limited to 'src/libexec')
-rw-r--r-- | src/libexec/httpd.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/libexec/httpd.c b/src/libexec/httpd.c new file mode 100644 index 0000000..4b14269 --- /dev/null +++ b/src/libexec/httpd.c @@ -0,0 +1,117 @@ +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> + +#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; +} |