]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ip/httpd/init.c
ip/tftpd: remove sunkernel hack
[plan9front.git] / sys / src / cmd / ip / httpd / init.c
1 #include <u.h>
2 #include <libc.h>
3 #include "httpd.h"
4 #include "httpsrv.h"
5
6 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*
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 }