1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "httpd.h" 5 6 void 7 usage(void) 8 { 9 fprint(2, "usage: httpd [-b inbuf] [-d domain] [-r remoteip] [-w webroot] [-N netdir] [-R reqline] [-L logfd0 logfd1] method version uri [search]\n"); 10 exits("usage"); 11 } 12 13 static Connect connect; 14 15 Connect* 16 init(int argc, char **argv) 17 { 18 char *s, *vs; 19 20 hinit(&connect.hin, 0, Hread); 21 hinit(&connect.hout, 1, Hwrite); 22 mydomain = nil; 23 connect.remotesys = nil; 24 fmtinstall('D', dateconv); 25 fmtinstall('H', httpconv); 26 fmtinstall('U', urlconv); 27 strcpy(netdir, "/net"); 28 ARGBEGIN{ 29 case 'b': 30 s = ARGF(); 31 if(s != nil) 32 hload(&connect.hin, s); 33 break; 34 case 'd': 35 mydomain = ARGF(); 36 break; 37 case 'r': 38 connect.remotesys = ARGF(); 39 break; 40 case 'w': 41 webroot = ARGF(); 42 break; 43 case 'N': 44 s = ARGF(); 45 if(s != nil) 46 strcpy(netdir, s); 47 break; 48 case 'L': 49 s = ARGF(); 50 if(s == nil) 51 usage(); 52 logall[0] = strtol(s, nil, 10); 53 s = ARGF(); 54 if(s == nil) 55 usage(); 56 logall[1] = strtol(s, nil, 10); 57 break; 58 case 'R': 59 s = ARGF(); 60 if(s == nil) 61 usage(); 62 snprint((char*)connect.header, sizeof(connect.header), "%s", s); 63 break; 64 default: 65 usage(); 66 }ARGEND 67 68 if(connect.remotesys == nil) 69 connect.remotesys = "unknown"; 70 if(mydomain == nil) 71 mydomain = "unknown"; 72 if(webroot == nil) 73 webroot = "/usr/web"; 74 75 /* 76 * open all files we might need before castrating namespace 77 */ 78 time(nil); 79 syslog(0, HTTPLOG, nil); 80 81 if(argc != 4 && argc != 3) 82 usage(); 83 84 connect.req.meth = argv[0]; 85 86 vs = argv[1]; 87 connect.req.vermaj = 0; 88 connect.req.vermin = 9; 89 if(strncmp(vs, "HTTP/", 5) == 0){ 90 vs += 5; 91 connect.req.vermaj = strtoul(vs, &vs, 10); 92 if(*vs == '.') 93 vs++; 94 connect.req.vermin = strtoul(vs, &vs, 10); 95 } 96 97 connect.req.uri = argv[2]; 98 connect.req.search = argv[3]; 99 connect.head.closeit = 1; 100 connect.hpos = (uchar*)strchr((char*)connect.header, '\0'); 101 connect.hstop = connect.hpos; 102 connect.reqtime = time(nil); /* not quite right, but close enough */ 103 return &connect; 104 } 105