X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fcf.c;h=9d3fb766c2b44babe008f0e3448eb9fb63d1cd88;hb=32bcaa06f65eba5d0d12cb99aa8c3982708b6f34;hp=aae8485054912592177c2018d2665e61eaaa5292;hpb=9d82f27c53c5fb79ceee52904b996edefb27628a;p=ashd.git diff --git a/lib/cf.c b/lib/cf.c index aae8485..9d3fb76 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); @@ -380,7 +382,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 +401,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 +413,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; }