X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fdirplex%2Fdirplex.c;h=358d0b1c67732c050bedfc2408b96054bdac1d32;hb=240d9bcdcd247c14555d204e471b4fee095dd47a;hp=7f2a12d2bde3dd0144431a9624b1ce0493234918;hpb=da75c835b71b9ed9cf1d2c8fcbcfb7631dd24a05;p=ashd.git diff --git a/src/dirplex/dirplex.c b/src/dirplex/dirplex.c index 7f2a12d..358d0b1 100644 --- a/src/dirplex/dirplex.c +++ b/src/dirplex/dirplex.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #ifdef HAVE_CONFIG_H @@ -217,9 +218,34 @@ static int checkentry(struct hthead *req, int fd, char *path, char *rest, char * return(0); } +static int checkdir(struct hthead *req, int fd, char *path, char *rest) +{ + char *cpath; + struct config *cf, *ccf; + struct child *ch; + + cf = getconfig(path); + if(cf->capture != NULL) { + cpath = sprintf2("%s/", path); + if((ch = findchild(cpath, cf->capture, &ccf)) == NULL) { + free(cpath); + flog(LOG_ERR, "child %s requested for capture, but was not declared", cf->capture); + simpleerror(fd, 500, "Configuration Error", "The server is erroneously configured. Handler %s was requested, but not declared.", cf->capture); + return(1); + } + free(cpath); + if(*rest == '/') + rest++; + replrest(req, rest); + if(childhandle(ch, req, fd, chinit, ccf->path)) + simpleerror(fd, 500, "Server Error", "The request handler crashed."); + return(1); + } + return(0); +} + static int checkpath(struct hthead *req, int fd, char *path, char *rest) { - struct config *cf; char *p, *el; int rv; @@ -228,7 +254,8 @@ static int checkpath(struct hthead *req, int fd, char *path, char *rest) if(!strncmp(path, "./", 2)) path += 2; - cf = getconfig(path); + if(checkdir(req, fd, path, rest)) + return(1); if((p = strchr(rest, '/')) == NULL) { el = unquoteurl(rest); @@ -253,7 +280,8 @@ static int checkpath(struct hthead *req, int fd, char *path, char *rest) if(!*el) { replrest(req, rest); handledir(req, fd, path); - return(1); + rv = 1; + goto out; } rv = checkentry(req, fd, path, rest, el); @@ -270,6 +298,19 @@ static void serve(struct hthead *req, int fd) simpleerror(fd, 404, "Not Found", "The requested URL has no corresponding resource."); } +static void chldhandler(int sig) +{ + pid_t pid; + + do { + pid = waitpid(-1, NULL, WNOHANG); + } while(pid > 0); +} + +static void sighandler(int sig) +{ +} + static void usage(FILE *out) { fprintf(out, "usage: dirplex [-hN] [-c CONFIG] DIR\n"); @@ -329,7 +370,8 @@ int main(int argc, char **argv) flog(LOG_ERR, "could not change directory to %s: %s", argv[optind], strerror(errno)); exit(1); } - signal(SIGCHLD, SIG_IGN); + signal(SIGCHLD, chldhandler); + signal(SIGPIPE, sighandler); while(1) { if((fd = recvreq(0, &req)) < 0) { if(errno != 0)