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