1 #include <u.h>
2 #include <libc.h>
3 #include "httpd.h"
4 #include "httpsrv.h"
5
6 void
usage(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*
init(int argc,char ** argv)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