implement Handler; include "sys.m"; sys: Sys; sprint: import sys; include "arg.m"; arg: Arg; include "bufio.m"; include "http.m"; http: Http; HConn: import http; stderr: ref Sys->FD; wfile: string; whandler: Handler; wargs: list of string; mtime: int; lastcheck: int; init(m: Http, args: list of string) { sys = load Sys Sys->PATH; arg = load Arg Arg->PATH; http = m; stderr = sys->fildes(2); arg->init(args); arg->setusage(sprint("%s handler [args ...]", arg->progname())); args = arg->argv(); if(len args < 1) arg->usage(); wfile = hd args; wargs = args; dissfx := 0; if(len wfile >= 4 && wfile[len wfile - 4:] == ".dis") dissfx = 1; if((whandler = load Handler wfile) == nil && !dissfx) wfile += ".dis"; if((whandler = load Handler wfile) == nil) wfile = "/dis/" + wfile; if((whandler = load Handler wfile) == nil) { sys->fprint(sys->fildes(2), "%s: loadhandler %s\n", arg->progname(), hd args); raise "fail:loadhandler"; } lastcheck = sys->millisec(); mtime = getmtime(); whandler->init(http, wargs); } log(s: string) { sys->fprint(stderr, "reload: %s\n", s); } getmtime(): int { (fail, dir) := sys->stat(wfile); if(fail) return 0; return dir.mtime; } reload(): int { now := sys->millisec(); if(now > lastcheck + 2000 && (m := getmtime()) != mtime) { mtime = m; tmp := load Handler wfile; if(tmp == nil) { log(wfile + " failed"); return -1; } tmp->init(http, wargs); whandler = tmp; log(wfile); } lastcheck = now; return 0; } handle(h: ref HConn) { reload(); whandler->handle(h); }