lib: Check for ECONNRESET as well to detect crashed children.
[ashd.git] / lib / cf.c
index 3314e4a..fd53c54 100644 (file)
--- 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);