if((p2 = strrchr(p, '/')) == NULL)
continue;
*p2 = 0;
- if(!access(t = sprintf3("%s/etc/%s", p, name), R_OK)) {
+ if(!access(t = sprintf2("%s/etc/%s", p, name), R_OK)) {
free(path);
- return(sstrdup(t));
+ return(t);
}
+ free(t);
}
free(path);
return(NULL);
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);
}
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);