X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fcf.c;h=b809d331e051db3255c43b666997052743b2d8cc;hb=7d1e14f405f389656604c68e18a381feabcd3d4a;hp=aae8485054912592177c2018d2665e61eaaa5292;hpb=9d82f27c53c5fb79ceee52904b996edefb27628a;p=ashd.git diff --git a/lib/cf.c b/lib/cf.c index aae8485..b809d33 100644 --- a/lib/cf.c +++ b/lib/cf.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #ifdef HAVE_CONFIG_H @@ -44,6 +45,7 @@ struct stdchild { char **envp; int fd; int agains; + time_t lastrep; }; static int parsefile(struct cfstate *s, FILE *in); @@ -326,8 +328,10 @@ static char **expandargs(struct stdchild *sd) for(p2 = sd->argv[i]; p != NULL; p2 = np, p = strchr(np, '$')) { bufcat(exp, p2, p - p2); if(p[1] == '{') { - if((p3 = strchr((p += 2), '}')) == NULL) + if((p3 = strchr((p += 2), '}')) == NULL) { + np = p; break; + } np = p3 + 1; } else { for(p3 = ++p; *p3; p3++) { @@ -380,7 +384,7 @@ static int stdhandle(struct child *ch, struct hthead *req, int fd, void (*chinit struct sidata idat; if(sd->type == CH_SOCKET) { - idat = (struct sidata) {.sd = sd, .sinit = chinit, sdata = sdata}; + idat = (struct sidata) {.sd = sd, .sinit = chinit, .sdata = sdata}; if(sd->fd < 0) { args = expandargs(sd); sd->fd = stdmkchild(args, stdinit, &idat); @@ -399,8 +403,10 @@ static int stdhandle(struct child *ch, struct hthead *req, int fd, void (*chinit serr = errno; } if(serr == EAGAIN) { - if(sd->agains++ == 0) + if(sd->agains++ == 0) { flog(LOG_WARNING, "request to child %s denied due to buffer overload", ch->name); + sd->lastrep = time(NULL); + } } else { flog(LOG_ERR, "could not pass on request to child %s: %s", ch->name, strerror(serr)); close(sd->fd); @@ -409,7 +415,7 @@ static int stdhandle(struct child *ch, struct hthead *req, int fd, void (*chinit return(-1); } ok: - if(sd->agains > 0) { + if((sd->agains > 0) && ((time(NULL) - sd->lastrep) > 10)) { flog(LOG_WARNING, "%i requests to child %s were denied due to buffer overload", sd->agains, ch->name); sd->agains = 0; }