aboutsummaryrefslogtreecommitdiff
path: root/src/progman.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-02-13 21:27:11 +0200
committerSergey Poznyakoff <gray@gnu.org>2016-02-13 21:46:32 +0200
commitc9581808b72ff25623c87cf49c471ce7f017985d (patch)
tree3b6c7143eec966561e24c05ffb87e1d55b4acf58 /src/progman.c
parent3c774556e22cd30c42304614e14218a767e4d700 (diff)
downloadpies-c9581808b72ff25623c87cf49c471ce7f017985d.tar.gz
pies-c9581808b72ff25623c87cf49c471ce7f017985d.tar.bz2
Stop disabled components when switching runlevels.
* src/prog.h (status_enabled, status_disabled): Remove. (status_stopped, status_running): New modes. All uses updated. * src/comp.c (component_finish): Disable ondemand component by default. * src/ctl.c (json_object_set_bool): New function. (pies_status_str): Update. (prog_serialize): Set "disabled" attribute. (fun_stop, fun_start): Use CF_DISABLED flag. (res_runlevel): Schedule ACTION_RELOAD. * src/pies.h (json_object_set_bool): New proto. * src/piesctl.c (status_trans): Reflect changes in modes. (print_comp): Check the "disabled" attribute. * src/progman.c (register_prog0) (prog_open_socket,prog_start,prog_stop) (progman_wake_sleeping) (prog_start_prerequisites) (react, progman_cleanup) (progman_stop_component): Update. (no_children_left): Fix. * src/sysvinit.c (enablecomp): Make CF_DISABLED flag persist for ondemand components. (runlevel_setup_prog): Use CF_DISABLED flag. (inittrans): Stop inactivated processes. * doc/pies.texi: Update.
Diffstat (limited to 'src/progman.c')
-rw-r--r--src/progman.c86
1 files changed, 45 insertions, 41 deletions
diff --git a/src/progman.c b/src/progman.c
index 2c73b2b..29b5331 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -270,11 +270,11 @@ register_prog0 (struct component *comp)
newp->facility = comp->facility;
newp->v.p.comp = comp;
newp->v.p.socket = -1;
- if (comp->flags & CF_DISABLED)
- newp->v.p.status = status_disabled;
- else if (comp->mode == pies_comp_inetd)
+ if (comp->mode == pies_comp_inetd)
newp->v.p.status = status_listener;
-
+ else
+ newp->v.p.status = status_stopped;
+
if (comp->mode != pies_comp_exec)
comp->redir[RETR_OUT].type = redir_null;
@@ -938,7 +938,8 @@ prog_open_socket (struct prog *prog)
prog->v.p.comp->umask);
if (prog->v.p.socket == -1)
{
- prog->v.p.status = status_disabled;
+ prog->v.p.status = status_stopped;
+ prog->v.p.comp->flags |= CF_DISABLED;
return 1;
}
if (listen (prog->v.p.socket, 8))
@@ -946,7 +947,8 @@ prog_open_socket (struct prog *prog)
logmsg (LOG_ERR, "listen: %s", strerror (errno));
close (prog->v.p.socket);
prog->v.p.socket = -1;
- prog->v.p.status = status_disabled;
+ prog->v.p.status = status_stopped;
+ prog->v.p.comp->flags |= CF_DISABLED;
return 1;
}
return 0;
@@ -1039,16 +1041,16 @@ prog_start (struct prog *prog)
{
if (!init_process)
{
- if (prog->v.p.status != status_disabled)
+ if (!(prog->v.p.comp->flags & CF_DISABLED))
{
logmsg (LOG_NOTICE, "disabling sysvinit component %s",
prog_tag (prog));
- prog->v.p.status = status_disabled;
+ prog->v.p.status = status_stopped;
+ prog->v.p.comp->flags |= CF_DISABLED;
}
return;
}
prog->v.p.wait = is_comp_wait (prog->v.p.comp);
- debug (1, ("ok to start %s", prog->v.p.comp->tag));
}
/* This call returns 1 in two cases: Either prog is marked as disabled,
@@ -1236,7 +1238,7 @@ prog_start (struct prog *prog)
if (redir[RETR_ERR])
close (redir[RETR_ERR]);
prog->pid = pid;
- prog->v.p.status = status_enabled;
+ prog->v.p.status = status_running;
debug (1, (_("%s started, pid=%lu"), prog_tag (prog),
(unsigned long) pid));
}
@@ -1434,11 +1436,11 @@ progman_create_sockets ()
comp->socket_type,
comp->privs.user, comp->umask);
if (fd == -1)
- prog->v.p.status = status_disabled;
+ prog->v.p.comp->flags |= CF_DISABLED;
else if (register_program_socket (comp->socket_type, fd, prog))
{
close (fd);
- prog->v.p.status = status_disabled;
+ prog->v.p.comp->flags |= CF_DISABLED;
}
else
prog->v.p.socket = fd;
@@ -1509,7 +1511,7 @@ progman_start ()
enable_socket (prog->v.p.socket);
}
}
- else if ((prog->v.p.status == status_enabled && prog->pid == 0)
+ else if (prog->v.p.status == status_stopped
|| prog->v.p.status == status_sleeping)
prog_start (prog);
}
@@ -1560,7 +1562,7 @@ progman_wake_sleeping (int onalrm)
}
else
{
- prog->v.p.status = status_enabled;
+ prog->v.p.status = status_running;
prog->v.p.failcount = 0;
prog->v.p.timestamp = 0;
prog_start (prog);
@@ -1576,9 +1578,8 @@ progman_wake_sleeping (int onalrm)
check_stopping (prog, now);
break;
- case status_enabled:
- if (prog->pid == 0)
- prog_start (prog);
+ case status_stopped:
+ prog_start (prog);
break;
default:
@@ -1597,7 +1598,7 @@ prog_start_prerequisites (struct prog *prog)
struct component *comp;
int warned = 0;
- if (prog->v.p.status == status_disabled)
+ if (prog->v.p.comp->flags & CF_DISABLED)
return 1;
for (comp = component_depmap_first (depmap_col, prog->v.p.comp->arridx, &pos);
comp;
@@ -1612,17 +1613,21 @@ prog_start_prerequisites (struct prog *prog)
debug (1, ("starting prerequisites of %s", prog_tag (prog)));
warned = 1;
}
+
+ if (comp->flags & CF_DISABLED)
+ {
+ prog->v.p.comp->flags |= CF_DISABLED;
+ return 1;
+ }
+
p = comp->prog;
switch (p->v.p.status)
{
- case status_enabled:
- if (prog->pid != 0)
- continue;
- break;
+ case status_running:
+ continue;
- case status_disabled:
- prog->v.p.status = status_disabled;
- return 1;
+ case status_stopped:
+ break;
case status_listener:
continue;
@@ -1640,8 +1645,8 @@ prog_start_prerequisites (struct prog *prog)
continue;
}
prog_start (p);
- if (p->v.p.comp->mode == pies_comp_once ||
- !(p->v.p.status == status_enabled && p->pid))
+ if (p->v.p.comp->mode == pies_comp_once
+ || p->v.p.status != status_running)//FIXME
ret = 1;
}
depmap_end (pos);
@@ -1690,7 +1695,7 @@ prog_stop (struct prog *prog, int sig)
return;
if (prog->type == TYPE_COMPONENT)
{
- if (prog->v.p.status == status_enabled)
+ if (prog->v.p.status == status_running)
{
prog->v.p.status = status_stopping;
prog->v.p.timestamp = time (NULL);
@@ -1712,7 +1717,7 @@ prog_stop_all (int sig)
debug (1, ("stopping all components (signal %d)", sig));
for (prog = progtail; prog; prog = prog->prev)
if (IS_COMPONENT (prog)
- && (prog->v.p.status == status_enabled
+ && (prog->v.p.status == status_running
|| prog->v.p.status == status_stopping))
prog_stop (prog, sig);
}
@@ -1736,7 +1741,13 @@ progman_wait_until (int (*cond) (void *), void *data)
static int
no_children_left (void *p)
{
- return proghead == NULL;
+ struct prog *prog;
+
+ for (prog = proghead; prog; prog = prog->next)
+ if (prog->pid > 0)
+ return 0;
+
+ return 1;
}
void
@@ -2227,7 +2238,7 @@ react (struct prog *prog, int status, pid_t pid)
case action_disable:
logmsg (LOG_NOTICE, _("disabling component %s"),
prog_tag (prog));
- prog->v.p.status = status_disabled;
+ prog->v.p.comp->flags |= CF_DISABLED;
/* FIXME:
if (prog->v.p.comp->mode == pies_comp_inetd)
disable_socket (prog->v.p.socket);
@@ -2313,9 +2324,7 @@ progman_cleanup (int expect_term)
sysvinit_acct (SYSV_ACCT_PROC_STOP, "",
prog_tag (prog), pid, "");
- prog->v.p.status =
- (prog->v.p.comp->flags & CF_DISABLED)
- ? status_disabled : status_enabled;
+ prog->v.p.status = status_stopped;
prog_stop_dependents (prog);
if (!expect_term)
react (prog, status, pid);
@@ -2358,20 +2367,15 @@ progman_stop_component (struct prog **progptr)
{
switch (prog->v.p.status)
{
- case status_enabled:
+ case status_running:
case status_listener:
logmsg (LOG_INFO, _("stopping component `%s'"), prog_tag (prog));
prog_stop (prog, SIGTERM);
break;
- case status_disabled:
+ case status_stopped:
if (!component_is_active (prog->v.p.comp))
destroy_prog (progptr);
- else if (!(prog->v.p.comp->flags & CF_DISABLED))
- {
- logmsg (LOG_INFO, _("enabling component `%s'"), prog_tag (prog));
- prog->v.p.status = status_enabled;
- }
break;
case status_sleeping:

Return to:

Send suggestions and report system problems to the System administrator.