Dolda2000 GitWeb
/
ashd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
python3: Make pooled threads start exit when wait-pool is large for some time.
[ashd.git]
/
lib
/
cf.c
diff --git
a/lib/cf.c
b/lib/cf.c
index
aae8485
..
b809d33
100644
(file)
--- a/
lib/cf.c
+++ b/
lib/cf.c
@@
-24,6
+24,7
@@
#include <glob.h>
#include <libgen.h>
#include <sys/socket.h>
#include <glob.h>
#include <libgen.h>
#include <sys/socket.h>
+#include <time.h>
#include <errno.h>
#ifdef HAVE_CONFIG_H
#include <errno.h>
#ifdef HAVE_CONFIG_H
@@
-44,6
+45,7
@@
struct stdchild {
char **envp;
int fd;
int agains;
char **envp;
int fd;
int agains;
+ time_t lastrep;
};
static int parsefile(struct cfstate *s, FILE *in);
};
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] == '{') {
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;
break;
+ }
np = p3 + 1;
} else {
for(p3 = ++p; *p3; p3++) {
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) {
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);
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) {
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);
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);
} 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:
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;
}
flog(LOG_WARNING, "%i requests to child %s were denied due to buffer overload", sd->agains, ch->name);
sd->agains = 0;
}