6 #include <sys/socket.h>
11 #include <ashd/mtio.h>
13 #include "statserve.h"
15 static struct source *sources = NULL;
17 static struct source *parsesource(char *arg)
19 if(arg[strlen(arg) - 1] == '/') {
22 return(mkdbsrc(arg, NULL));
26 static void serve(struct muth *muth, va_list args)
28 vavar(struct hthead *, req);
35 for(src = sources; src != NULL; src = src->next) {
36 f = src->serve(src, req->rest);
41 simpleerror(fd, 404, "Resource not found", "The resource %s was not found", htmlquote(req->rest));
44 out = mtstdopen(fd, 1, 60, "r+");
45 fprintf(out, "HTTP/1.1 200 OK\n");
46 fprintf(out, "Content-Type: %s\n", f.ctype);
47 fprintf(out, "Content-Length: %zi\n", f.sz);
48 fprintf(out, "Last-Modified: %s\n", fmthttpdate(f.mtime));
50 fwrite(f.data, 1, f.sz, out);
61 static void usage(FILE *out)
63 fprintf(out, "usage: statserve [-h] [-P PAGESIZE] SOURCE...\n");
66 static void listenloop(struct muth *muth, va_list args)
75 if((fd = recvreq(lfd, &req)) < 0) {
77 flog(LOG_ERR, "recvreq: %s", strerror(errno));
80 mustart(serve, req, fd);
81 for(src = sources; src != NULL; src = src->next) {
88 static void sigterm(int sig)
90 shutdown(0, SHUT_RDWR);
93 static void closeall(void)
97 for(src = sources; src != NULL; src = src->next) {
103 int main(int argc, char **argv)
106 struct source *last, *src;
108 while((c = getopt(argc, argv, "+hP:")) >= 0) {
111 dbpagesize = atoi(optarg);
122 while(optind < argc) {
123 if((src = parsesource(argv[optind++])) == NULL) {
138 mustart(listenloop, 0);
139 signal(SIGINT, sigterm);
140 signal(SIGTERM, sigterm);