diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-02-13 21:27:11 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-02-13 21:46:32 +0200 |
commit | c9581808b72ff25623c87cf49c471ce7f017985d (patch) | |
tree | 3b6c7143eec966561e24c05ffb87e1d55b4acf58 /src/progman.c | |
parent | 3c774556e22cd30c42304614e14218a767e4d700 (diff) | |
download | pies-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.c | 86 |
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: |