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