char *findstdconf(char *name)
{
- char *path, *p, *p2, *t;
+ char *home, *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);
+ if((home = getenv("HOME")) != NULL) {
+ if(!access(t = sprintf2("%s/.ashd/etc/%s", home, name), R_OK))
return(t);
- }
free(t);
}
- free(path);
+ if((path = getenv("PATH")) != 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 int stdhandle(struct child *ch, struct hthead *req, int fd, void (*chinit)(void *), void *idata)
{
struct stdchild *i = ch->pdata;
+ int serr;
if(i->type == CH_SOCKET) {
if(i->fd < 0)
i->fd = stdmkchild(i->argv, chinit, idata);
if(sendreq2(i->fd, req, fd, MSG_NOSIGNAL | MSG_DONTWAIT)) {
- if((errno == EPIPE) || (errno == ECONNRESET)) {
+ serr = errno;
+ if((serr == EPIPE) || (serr == ECONNRESET)) {
/* Assume that the child has crashed and restart it. */
close(i->fd);
i->fd = stdmkchild(i->argv, chinit, idata);
if(!sendreq2(i->fd, req, fd, MSG_NOSIGNAL | MSG_DONTWAIT))
return(0);
}
- flog(LOG_ERR, "could not pass on request to child %s: %s", ch->name, strerror(errno));
- close(i->fd);
- i->fd = -1;
+ flog(LOG_ERR, "could not pass on request to child %s: %s", ch->name, strerror(serr));
+ if(serr != EAGAIN) {
+ close(i->fd);
+ i->fd = -1;
+ }
return(-1);
}
} else if(i->type == CH_FORK) {