diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-11-23 16:28:57 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2009-11-23 16:28:57 +0200 |
commit | 2d3d121453b19003c6454e7c6b4ed98164e7d531 (patch) | |
tree | 65393ed5a53f2a56b4d6ac6ac327bfb533d8b81d /src/progman.c | |
parent | 8a7cf4b45431bbead62b2ae390f49caedf702fe5 (diff) | |
download | pies-2d3d121453b19003c6454e7c6b4ed98164e7d531.tar.gz pies-2d3d121453b19003c6454e7c6b4ed98164e7d531.tar.bz2 |
Limit number of instances for inetd-style components.
* src/pies.c (component_keywords): New keyword
`max-instances'.
* src/pies.h (struct component): New member:
max_instances.
* src/progman.c (struct prog): Rename count to
failcount. All uses changed.
New members num_instances and listener.
(progman_accept): Keep track of the number of
instances. Deny connection if it is greater than
max_instances (unless the latter is 0).
(progman_cleanup): Keep track of the number of
instances in inetd listeners.
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/progman.c b/src/progman.c index 801a75c..3263172 100644 --- a/src/progman.c +++ b/src/progman.c @@ -51,8 +51,12 @@ struct prog int socket; struct prog *redir[2]; /* Pointers to redirectors */ time_t timestamp; /* Time of last startup */ - size_t count; /* Number of failed starts since timestamp */ + size_t failcount; /* Number of failed starts since timestamp */ enum prog_status status; /* Current component status */ + /* If status == status_listener: */ + size_t num_instances; /* Number of running instances */ + /* If comp->type == pies_comp_inetd && status == status_enabled */ + struct prog *listener; } p; struct @@ -616,14 +620,14 @@ prog_start (struct prog *prog) time (&now); if (prog->v.p.timestamp + TESTTIME > now) - prog->v.p.count++; + prog->v.p.failcount++; else { - prog->v.p.count = 0; + prog->v.p.failcount = 0; prog->v.p.timestamp = now; } - if (prog->v.p.count > MAXSPAWN) + if (prog->v.p.failcount > MAXSPAWN) { logmsg (LOG_NOTICE, ngettext ( "%s is respawning too fast, disabled for %d minute", @@ -707,6 +711,7 @@ prog_start (struct prog *prog) if (debug_level >= 4) { int i; + logmsg_printf (LOG_DEBUG, "environment: "); for (i = 0; environ[i]; i++) logmsg_printf (LOG_DEBUG, "%s ", environ[i]); logmsg_printf (LOG_DEBUG, "\n"); @@ -835,7 +840,7 @@ int progman_accept (int socket) { int fd; - struct prog *p; + struct prog *p, *pinst; union { struct sockaddr s_in; @@ -873,11 +878,26 @@ progman_accept (int socket) return 1; } - p = register_prog0 (p->v.p.comp, -1); - p->v.p.socket = fd; - prog_start (p); + if (p->v.p.comp->max_instances && + p->v.p.num_instances >= p->v.p.comp->max_instances) + { + char *s = sockaddr_to_astr ((struct sockaddr *)&addr, addrlen); + logmsg (LOG_ERR, + _("%s: too many instances running, access from %s denied"), + p->tag, s); + free (s); + close (fd); + return 1; + } + + pinst = register_prog0 (p->v.p.comp, -1); + pinst->v.p.socket = fd; + pinst->v.p.listener = p; + prog_start (pinst); close (fd); - p->v.p.socket = -1; + pinst->v.p.socket = -1; + + p->v.p.num_instances++; return 0; } @@ -1146,7 +1166,7 @@ progman_wake_sleeping (int onalrm) struct prog *prog; time_t now = time (NULL); - debug (1, ("Managing sleeping/stopping components")); + debug (1, (_("managing sleeping/stopping components"))); for (prog = proghead; prog; prog = prog->next) if (IS_COMPONENT (prog)) @@ -1157,7 +1177,7 @@ progman_wake_sleeping (int onalrm) if (now - prog->v.p.timestamp >= SLEEPTIME) { prog->v.p.status = status_enabled; - prog->v.p.count = 0; + prog->v.p.failcount = 0; prog->v.p.timestamp = 0; prog_start (prog); } @@ -1687,6 +1707,7 @@ progman_cleanup (int expect_term) print_status (prog->tag, pid, status, expect_term); if (prog->v.p.comp->mode == pies_comp_inetd) { + prog->v.p.listener->v.p.num_instances--; prog_stop_redirectors (prog); destroy_prog (&prog); } @@ -1801,7 +1822,7 @@ progman_stop_component (const char *name) break; case status_sleeping: - prog->v.p.count = 0; + prog->v.p.failcount = 0; break; default: |