X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fdirplex%2Fconf.c;h=e2b1481c4d3881898e8ec58747e5627542096008;hb=cd71c7f3b692849c5a1134310040dcdd8b87bbf8;hp=b90163a20a1d391130d3b7669bc777012d086673;hpb=1924fe8c26de2861744fd576631ad15da2759f51;p=ashd.git diff --git a/src/dirplex/conf.c b/src/dirplex/conf.c index b90163a..e2b1481 100644 --- a/src/dirplex/conf.c +++ b/src/dirplex/conf.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "dirplex.h" @@ -45,9 +46,16 @@ static void freerule(struct rule *rule) static void freepattern(struct pattern *pat) { struct rule **rule; + struct headmod *head; for(rule = pat->rules; *rule; rule++) freerule(*rule); + while((head = pat->headers) != NULL) { + pat->headers = head->next; + free(head->name); + free(head->value); + free(head); + } if(pat->childnm != NULL) free(pat->childnm); freeca(pat->fchild); @@ -130,6 +138,7 @@ static struct pattern *parsepattern(struct cfstate *s) { struct pattern *pat; struct rule *rule; + struct headmod *head; int sl; if(!strcmp(s->argv[0], "match")) { @@ -176,6 +185,16 @@ static struct pattern *parsepattern(struct cfstate *s) pat->childnm = sstrdup(s->argv[1]); } else if(!strcmp(s->argv[0], "fork")) { pat->fchild = cadup(s->argv + 1); + } else if(!strcmp(s->argv[0], "set")) { + if(s->argc < 3) { + flog(LOG_WARNING, "%s:%i: missing header name or pattern for `set' directive", s->file, s->lno); + continue; + } + omalloc(head); + head->name = sstrdup(s->argv[1]); + head->value = sstrdup(s->argv[2]); + head->next = pat->headers; + pat->headers = head; } else if(!strcmp(s->argv[0], "end") || !strcmp(s->argv[0], "eof")) { break; } else { @@ -263,10 +282,10 @@ struct config *getconfig(char *path) for(cf = cflist; cf != NULL; cf = cf->next) { if(!strcmp(cf->path, path)) { if(now - cf->lastck > 5) { + cf->lastck = now; if(stat(fn, &sb) || (sb.st_mtime != cf->mtime)) break; } - cf->lastck = now; return(cf); } } @@ -332,6 +351,8 @@ struct child *findchild(char *file, char *name, struct config **cf) struct config **cfs; struct child *ch; + if(cf != NULL) + *cf = NULL; cfs = getconfigs(file); for(i = 0; cfs[i] != NULL; i++) { if((ch = getchild(cfs[i], name)) != NULL) { @@ -340,6 +361,8 @@ struct child *findchild(char *file, char *name, struct config **cf) return(ch); } } + if(!strcmp(name, ".notfound")) + return(notfound); return(NULL); } @@ -398,3 +421,19 @@ struct pattern *findmatch(char *file, int trydefault, int dir) return(findmatch(file, 1, dir)); return(NULL); } + +static int donotfound(struct child *ch, struct hthead *req, int fd, void (*chinit)(void *), void *idata) +{ + simpleerror(fd, 404, "Not Found", "The requested URL has no corresponding resource."); + return(0); +} + +static struct chandler i_notfound = { + .handle = donotfound, +}; + +static struct child s_notfound = { + .name = ".notfound", + .iface = &i_notfound, +}; +struct child *notfound = &s_notfound;