diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-02-17 08:26:42 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-02-17 08:30:12 +0200 |
commit | e430f586ccf6621136089fb1d9d865ce1a351360 (patch) | |
tree | af09d48b994a55752f210b29cb73f147e5b7f728 /src/sysvinit.c | |
parent | bd8bd1640c72ceefd87b46a7a3d378c78c9081f5 (diff) | |
download | pies-e430f586ccf6621136089fb1d9d865ce1a351360.tar.gz pies-e430f586ccf6621136089fb1d9d865ce1a351360.tar.bz2 |
Fix state transitions
* src/pies.c (main): Move call to pies_schedule_children
to inittrans.
* src/progman.c (progman_cleanup): Minor change.
* src/sysvinit.c (enablecomp): Change prog status
to stopped when leaving its runlevel.
(sysvinit_set_runlevel): Raise SIGALRM instead of calling
inittrans directly.
(inittrans): Fix wait logic.
Diffstat (limited to 'src/sysvinit.c')
-rw-r--r-- | src/sysvinit.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/sysvinit.c b/src/sysvinit.c index 625fd7b..7fad00b 100644 --- a/src/sysvinit.c +++ b/src/sysvinit.c @@ -250,7 +250,7 @@ enablecomp (struct prog *prog, void *data) case pies_comp_powerfailnow: case pies_comp_kbrequest: return s && (s->mask & PIES_COMP_MASK (comp->mode)); - + default: break; } @@ -260,7 +260,11 @@ enablecomp (struct prog *prog, void *data) return -1; if (!strchr (comp->runlevels, runlevel)) - return 0; + { + if (prog->v.p.status == status_finished && comp->mode != pies_comp_once) + prog->v.p.status = status_stopped; + return 0; + } if (prog->v.p.status == status_finished) return -1; @@ -438,7 +442,7 @@ sysvinit_set_runlevel (int newlevel) else { dfl_level = newlevel; - inittrans (); + raise (SIGALRM); } } return 0; @@ -765,9 +769,9 @@ cond_running_disabled (struct prog *prog, void *data) } static int -running_disabled (void *data) +no_disabled_running (void *data) { - return progman_foreach (cond_running_disabled, NULL); + return !progman_foreach (cond_running_disabled, NULL); } static int @@ -846,12 +850,14 @@ inittrans () /* Stop disabled programs */ sig = SIGTERM; progman_foreach (terminate_disabled, &sig); - if (progman_wait_until (running_disabled, NULL)) + if (progman_wait_until (no_disabled_running, NULL)) { sig = SIGKILL; progman_foreach (terminate_disabled, &sig); - progman_wait_until (running_disabled, NULL); + progman_wait_until (no_disabled_running, NULL); } + + pies_schedule_children (PIES_CHLD_WAKEUP); } return trans; } |