X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fcf.c;h=fd53c54991c2972ee7c524f1dc5a4d83adee07f3;hb=f2df7a1b1aeeb0cec2309aeb62fae051fd3c687c;hp=3314e4a7198568c82762c4de6a199b90a3da6ae4;hpb=c3b910928f34306f34ee6a9c3c13debbf8ff67f4;p=ashd.git diff --git a/lib/cf.c b/lib/cf.c index 3314e4a..fd53c54 100644 --- a/lib/cf.c +++ b/lib/cf.c @@ -221,6 +221,27 @@ void freecfparser(struct cfstate *s) free(s); } +char *findstdconf(char *name) +{ + char *path, *p, *p2, *t; + + if((path = getenv("PATH")) == NULL) + return(NULL); + path = sstrdup(path); + for(p = strtok(path, ":"); p != NULL; p = strtok(NULL, ":")) { + if((p2 = strrchr(p, '/')) == NULL) + continue; + *p2 = 0; + if(!access(t = sprintf2("%s/etc/%s", p, name), R_OK)) { + free(path); + return(t); + } + free(t); + } + free(path); + return(NULL); +} + static struct child *newchild(char *name, int type) { struct child *ch; @@ -305,16 +326,16 @@ struct child *parsechild(struct cfstate *s) return(ch); } -int childhandle(struct child *ch, struct hthead *req, int fd) +int childhandle(struct child *ch, struct hthead *req, int fd, void (*chinit)(void *), void *idata) { if(ch->type == CH_SOCKET) { if(ch->fd < 0) - ch->fd = stdmkchild(ch->argv); + ch->fd = stdmkchild(ch->argv, chinit, idata); if(sendreq(ch->fd, req, fd)) { - if(errno == EPIPE) { + if((errno == EPIPE) || (errno == ECONNRESET)) { /* Assume that the child has crashed and restart it. */ close(ch->fd); - ch->fd = stdmkchild(ch->argv); + ch->fd = stdmkchild(ch->argv, chinit, idata); if(!sendreq(ch->fd, req, fd)) return(0); } @@ -324,7 +345,7 @@ int childhandle(struct child *ch, struct hthead *req, int fd) return(-1); } } else if(ch->type == CH_FORK) { - if(stdforkserve(ch->argv, req, fd) < 0) + if(stdforkserve(ch->argv, req, fd, chinit, idata) < 0) return(-1); } return(0);