Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include "httpd.h"
#include "httpsrv.h"

void
usage(void)
{
        fprint(2, "usage: %s [-b inbuf] [-d domain] [-p localport]"
                " [-r remoteip] [-s uri-scheme] [-w webroot]"
                " [-L logfd0 logfd1] [-N netdir] [-R reqline]"
                " method version uri [search]\n", argv0);
        exits("usage");
}

char    *netdir;
char    *webroot;
char    *HTTPLOG = "httpd/log";

static  HConnect        connect;
static  HSPriv          priv;

HConnect*
init(int argc, char **argv)
{
        char *vs;

        hinit(&connect.hin, 0, Hread);
        hinit(&connect.hout, 1, Hwrite);
        hmydomain = nil;
        connect.replog = writelog;
        connect.scheme = "http";
        connect.port = "80";
        connect.private = &priv;
        priv.remotesys = nil;
        priv.remoteserv = nil;
        fmtinstall('D', hdatefmt);
        fmtinstall('H', httpfmt);
        fmtinstall('U', hurlfmt);
        netdir = "/net";
        ARGBEGIN{
        case 'b':
                hload(&connect.hin, EARGF(usage()));
                break;
        case 'd':
                hmydomain = EARGF(usage());
                break;
        case 'p':
                connect.port = EARGF(usage());
                break;
        case 'r':
                priv.remotesys = EARGF(usage());
                break;
        case 's':
                connect.scheme = EARGF(usage());
                break;
        case 'w':
                webroot = EARGF(usage());
                break;
        case 'L':
                logall[0] = strtol(EARGF(usage()), nil, 10);
                logall[1] = strtol(EARGF(usage()), nil, 10);
                break;
        case 'N':
                netdir = EARGF(usage());
                break;
        case 'R':
                snprint((char*)connect.header, sizeof(connect.header), "%s",
                        EARGF(usage()));
                break;
        default:
                usage();
        }ARGEND

        if(priv.remotesys == nil)
                priv.remotesys = "unknown";
        if(priv.remoteserv == nil)
                priv.remoteserv = "unknown";
        if(hmydomain == nil)
                hmydomain = "unknown";
        if(webroot == nil)
                webroot = "/usr/web";

        /*
         * open all files we might need before castrating namespace
         */
        time(nil);
        syslog(0, HTTPLOG, nil);

        if(argc != 4 && argc != 3)
                usage();

        connect.req.meth = argv[0];

        vs = argv[1];
        connect.req.vermaj = 0;
        connect.req.vermin = 9;
        if(strncmp(vs, "HTTP/", 5) == 0){
                vs += 5;
                connect.req.vermaj = strtoul(vs, &vs, 10);
                if(*vs == '.')
                        vs++;
                connect.req.vermin = strtoul(vs, &vs, 10);
        }

        connect.req.uri = argv[2];
        connect.req.search = argv[3];
        connect.head.closeit = 1;
        connect.hpos = (uchar*)strchr((char*)connect.header, '\0');
        connect.hstop = connect.hpos;
        connect.reqtime = time(nil);    /* not quite right, but close enough */
        return &connect;
}