xref: /plan9/sys/src/cmd/ip/httpd/init.c (revision b39189fd423aed869c5cf5189bc504918cff969b)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include "httpd.h"
480ee5cbfSDavid du Colombier #include "httpsrv.h"
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier void
usage(void)77dd7cddfSDavid du Colombier usage(void)
87dd7cddfSDavid du Colombier {
9*b39189fdSDavid du Colombier 	fprint(2, "usage: %s [-b inbuf] [-d domain] [-p localport]"
10*b39189fdSDavid du Colombier 		" [-r remoteip] [-s uri-scheme] [-w webroot]"
11*b39189fdSDavid du Colombier 		" [-L logfd0 logfd1] [-N netdir] [-R reqline]"
123b86f2f8SDavid du Colombier 		" method version uri [search]\n", argv0);
137dd7cddfSDavid du Colombier 	exits("usage");
147dd7cddfSDavid du Colombier }
157dd7cddfSDavid du Colombier 
1680ee5cbfSDavid du Colombier char	*netdir;
1780ee5cbfSDavid du Colombier char	*webroot;
1880ee5cbfSDavid du Colombier char	*HTTPLOG = "httpd/log";
197dd7cddfSDavid du Colombier 
2080ee5cbfSDavid du Colombier static	HConnect	connect;
2180ee5cbfSDavid du Colombier static	HSPriv		priv;
2280ee5cbfSDavid du Colombier 
2380ee5cbfSDavid du Colombier HConnect*
init(int argc,char ** argv)247dd7cddfSDavid du Colombier init(int argc, char **argv)
257dd7cddfSDavid du Colombier {
263b86f2f8SDavid du Colombier 	char *vs;
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier 	hinit(&connect.hin, 0, Hread);
297dd7cddfSDavid du Colombier 	hinit(&connect.hout, 1, Hwrite);
3080ee5cbfSDavid du Colombier 	hmydomain = nil;
3180ee5cbfSDavid du Colombier 	connect.replog = writelog;
32*b39189fdSDavid du Colombier 	connect.scheme = "http";
33*b39189fdSDavid du Colombier 	connect.port = "80";
3480ee5cbfSDavid du Colombier 	connect.private = &priv;
3580ee5cbfSDavid du Colombier 	priv.remotesys = nil;
3680ee5cbfSDavid du Colombier 	priv.remoteserv = nil;
379a747e4fSDavid du Colombier 	fmtinstall('D', hdatefmt);
389a747e4fSDavid du Colombier 	fmtinstall('H', httpfmt);
399a747e4fSDavid du Colombier 	fmtinstall('U', hurlfmt);
4080ee5cbfSDavid du Colombier 	netdir = "/net";
417dd7cddfSDavid du Colombier 	ARGBEGIN{
427dd7cddfSDavid du Colombier 	case 'b':
433b86f2f8SDavid du Colombier 		hload(&connect.hin, EARGF(usage()));
447dd7cddfSDavid du Colombier 		break;
457dd7cddfSDavid du Colombier 	case 'd':
463b86f2f8SDavid du Colombier 		hmydomain = EARGF(usage());
477dd7cddfSDavid du Colombier 		break;
48*b39189fdSDavid du Colombier 	case 'p':
49*b39189fdSDavid du Colombier 		connect.port = EARGF(usage());
50*b39189fdSDavid du Colombier 		break;
517dd7cddfSDavid du Colombier 	case 'r':
523b86f2f8SDavid du Colombier 		priv.remotesys = EARGF(usage());
537dd7cddfSDavid du Colombier 		break;
54*b39189fdSDavid du Colombier 	case 's':
55*b39189fdSDavid du Colombier 		connect.scheme = EARGF(usage());
56*b39189fdSDavid du Colombier 		break;
577dd7cddfSDavid du Colombier 	case 'w':
583b86f2f8SDavid du Colombier 		webroot = EARGF(usage());
597dd7cddfSDavid du Colombier 		break;
6014414594SDavid du Colombier 	case 'L':
613b86f2f8SDavid du Colombier 		logall[0] = strtol(EARGF(usage()), nil, 10);
623b86f2f8SDavid du Colombier 		logall[1] = strtol(EARGF(usage()), nil, 10);
633b86f2f8SDavid du Colombier 		break;
643b86f2f8SDavid du Colombier 	case 'N':
653b86f2f8SDavid du Colombier 		netdir = EARGF(usage());
6614414594SDavid du Colombier 		break;
6714414594SDavid du Colombier 	case 'R':
683b86f2f8SDavid du Colombier 		snprint((char*)connect.header, sizeof(connect.header), "%s",
693b86f2f8SDavid du Colombier 			EARGF(usage()));
7014414594SDavid du Colombier 		break;
717dd7cddfSDavid du Colombier 	default:
727dd7cddfSDavid du Colombier 		usage();
737dd7cddfSDavid du Colombier 	}ARGEND
747dd7cddfSDavid du Colombier 
7580ee5cbfSDavid du Colombier 	if(priv.remotesys == nil)
7680ee5cbfSDavid du Colombier 		priv.remotesys = "unknown";
7780ee5cbfSDavid du Colombier 	if(priv.remoteserv == nil)
7880ee5cbfSDavid du Colombier 		priv.remoteserv = "unknown";
7980ee5cbfSDavid du Colombier 	if(hmydomain == nil)
8080ee5cbfSDavid du Colombier 		hmydomain = "unknown";
817dd7cddfSDavid du Colombier 	if(webroot == nil)
827dd7cddfSDavid du Colombier 		webroot = "/usr/web";
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier 	/*
857dd7cddfSDavid du Colombier 	 * open all files we might need before castrating namespace
867dd7cddfSDavid du Colombier 	 */
877dd7cddfSDavid du Colombier 	time(nil);
887dd7cddfSDavid du Colombier 	syslog(0, HTTPLOG, nil);
897dd7cddfSDavid du Colombier 
907dd7cddfSDavid du Colombier 	if(argc != 4 && argc != 3)
917dd7cddfSDavid du Colombier 		usage();
927dd7cddfSDavid du Colombier 
937dd7cddfSDavid du Colombier 	connect.req.meth = argv[0];
947dd7cddfSDavid du Colombier 
957dd7cddfSDavid du Colombier 	vs = argv[1];
967dd7cddfSDavid du Colombier 	connect.req.vermaj = 0;
977dd7cddfSDavid du Colombier 	connect.req.vermin = 9;
987dd7cddfSDavid du Colombier 	if(strncmp(vs, "HTTP/", 5) == 0){
997dd7cddfSDavid du Colombier 		vs += 5;
1007dd7cddfSDavid du Colombier 		connect.req.vermaj = strtoul(vs, &vs, 10);
1017dd7cddfSDavid du Colombier 		if(*vs == '.')
1027dd7cddfSDavid du Colombier 			vs++;
1037dd7cddfSDavid du Colombier 		connect.req.vermin = strtoul(vs, &vs, 10);
1047dd7cddfSDavid du Colombier 	}
1057dd7cddfSDavid du Colombier 
1067dd7cddfSDavid du Colombier 	connect.req.uri = argv[2];
1077dd7cddfSDavid du Colombier 	connect.req.search = argv[3];
1087dd7cddfSDavid du Colombier 	connect.head.closeit = 1;
10914414594SDavid du Colombier 	connect.hpos = (uchar*)strchr((char*)connect.header, '\0');
11014414594SDavid du Colombier 	connect.hstop = connect.hpos;
11114414594SDavid du Colombier 	connect.reqtime = time(nil);	/* not quite right, but close enough */
1127dd7cddfSDavid du Colombier 	return &connect;
1137dd7cddfSDavid du Colombier }
114