diff options
Diffstat (limited to 'src/sysvinit.c')
-rw-r--r-- | src/sysvinit.c | 66 |
1 files changed, 54 insertions, 12 deletions
diff --git a/src/sysvinit.c b/src/sysvinit.c index 9e918c7..c9447ff 100644 --- a/src/sysvinit.c +++ b/src/sysvinit.c @@ -219,7 +219,6 @@ static int enablecomp (struct prog *prog, void *data) { struct enstate *s = data; - int rc; struct component *comp = prog->v.p.comp; switch (boot_state) @@ -240,7 +239,8 @@ enablecomp (struct prog *prog, void *data) return 0; case pies_comp_ondemand: - return prog->v.p.status == status_enabled; + /* Disabled flag persists: */ + return !(prog->v.p.comp->flags & CF_DISABLED); case pies_comp_powerfail: case pies_comp_powerwait: @@ -253,11 +253,13 @@ enablecomp (struct prog *prog, void *data) break; } } - rc = !!strchr (comp->runlevels, runlevel); - if (!rc) - return rc; + + if (!strchr (comp->runlevels, runlevel)) + return 0; + if (prog->v.p.status == status_finished) return -1; + if (s && s->mask & PIES_COMP_WAIT) { if (comp->mode == pies_comp_wait) @@ -267,7 +269,8 @@ enablecomp (struct prog *prog, void *data) } return 0; } - return rc; + + return 1; } static int @@ -279,12 +282,12 @@ runlevel_setup_prog (struct prog *prog, void *data) if (rc < 0) return 0; if (rc) - prog->v.p.status = status_enabled; + prog->v.p.comp->flags &= ~CF_DISABLED; else - prog->v.p.status = status_disabled; - debug (1, ("%s: %s", prog_tag (prog), - prog->v.p.status == status_enabled ? - "enabled" : "disabled")); + prog->v.p.comp->flags |= CF_DISABLED; + debug (2, ("%s: %s", prog_tag (prog), + prog->v.p.comp->flags & CF_DISABLED ? + "disabled" : "enabled")); } return 0; } @@ -313,7 +316,7 @@ demand_prog (struct prog *prog, void *data) && comp->runlevels && strchr (comp->runlevels, *rl)) { - prog->v.p.status = status_enabled; + prog->v.p.comp->flags &= ~CF_DISABLED; debug (1, ("%s: %s", prog_tag (prog), "enabled")); } return 0; @@ -708,6 +711,31 @@ sysvinit_begin () sysvinit_sysdep_begin (); } +#define IS_RUNNING_DISABLED_PROG(prog) \ + (IS_COMPONENT (prog) \ + && prog->v.p.status == status_running \ + && prog->v.p.comp->flags & CF_DISABLED) \ + +static int +cond_running_disabled (struct prog *prog, void *data) +{ + return IS_RUNNING_DISABLED_PROG (prog); +} + +static int +running_disabled (void *data) +{ + return progman_foreach (cond_running_disabled, NULL); +} + +static int +terminate_disabled (struct prog *prog, void *data) +{ + if (IS_RUNNING_DISABLED_PROG (prog)) + prog_stop (prog, *(int*)data); + return 0; +} + int inittrans () { @@ -769,6 +797,8 @@ inittrans () trans = 1; if (trans) { + int sig; + envsetup (); if (wait == 0) { @@ -777,6 +807,18 @@ inittrans () return 1; } sysvinit_runlevel_setup (PIES_COMP_DEFAULT, NULL); + + /* Stop disabled programs */ + sig = SIGTERM; + progman_foreach (terminate_disabled, &sig); + if (progman_wait_until (running_disabled, NULL)) + { + sig = SIGKILL; + progman_foreach (terminate_disabled, &sig); + progman_wait_until (running_disabled, NULL); + } + + /* Clear the wait flag */ wait = 0; } return trans; |