aboutsummaryrefslogtreecommitdiff
path: root/src/sysvinit.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-02-17 08:26:42 +0200
committerSergey Poznyakoff <gray@gnu.org>2016-02-17 08:30:12 +0200
commite430f586ccf6621136089fb1d9d865ce1a351360 (patch)
treeaf09d48b994a55752f210b29cb73f147e5b7f728 /src/sysvinit.c
parentbd8bd1640c72ceefd87b46a7a3d378c78c9081f5 (diff)
downloadpies-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.c20
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;
}

Return to:

Send suggestions and report system problems to the System administrator.