xref: /plan9/sys/src/cmd/ip/httpd/init.c (revision b39189fd423aed869c5cf5189bc504918cff969b)
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