aboutsummaryrefslogtreecommitdiff
path: root/src/progman.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2009-11-23 16:28:57 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2009-11-23 16:28:57 +0200
commit2d3d121453b19003c6454e7c6b4ed98164e7d531 (patch)
tree65393ed5a53f2a56b4d6ac6ac327bfb533d8b81d /src/progman.c
parent8a7cf4b45431bbead62b2ae390f49caedf702fe5 (diff)
downloadpies-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.c45
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:

Return to:

Send suggestions and report system problems to the System administrator.