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