aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rc/rc.c65
1 files changed, 24 insertions, 41 deletions
diff --git a/src/rc/rc.c b/src/rc/rc.c
index d1446cdb..f268bcb6 100644
--- a/src/rc/rc.c
+++ b/src/rc/rc.c
@@ -621,7 +621,7 @@ static bool runlevel_config(const char *service, const char *level)
return retval;
}
-static void do_stop_services(const char *newlevel, bool going_down, bool parallel)
+static void do_stop_services(const char *newlevel, bool parallel)
{
pid_t pid;
RC_STRING *service, *svc1, *svc2;
@@ -646,14 +646,6 @@ static void do_stop_services(const char *newlevel, bool going_down, bool paralle
continue;
}
- /* We always stop the service when in these runlevels */
- if (going_down || ! start_services) {
- pid = service_stop(service->value);
- if (pid > 0 && ! parallel)
- rc_waitpid(pid);
- continue;
- }
-
/* If we're in the start list then don't bother stopping us */
svc1 = rc_stringlist_find(start_services, service->value);
if (svc1) {
@@ -1024,34 +1016,28 @@ int main(int argc, char **argv)
/* Load our list of hotplugged services */
hotplugged_services = rc_services_in_state(RC_SERVICE_HOTPLUGGED);
- if (strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SINGLE) != 0 &&
- strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SHUTDOWN) != 0 &&
- strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_REBOOT) != 0)
- {
+ if (!going_down ||
+ strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SINGLE) == 0)
start_services = rc_services_in_runlevel(RC_LEVEL_SYSINIT);
- if (strcmp (newlevel ? newlevel : runlevel, RC_LEVEL_SYSINIT)
- != 0)
- {
- /* We need to include the boot runlevel services */
- tmplist = rc_services_in_runlevel(bootlevel);
+ if (!going_down &&
+ strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SYSINIT) != 0)
+ {
+ /* We need to include the boot runlevel services */
+ tmplist = rc_services_in_runlevel(bootlevel);
+ TAILQ_CONCAT(start_services, tmplist, entries);
+ free(tmplist);
+ if (strcmp (newlevel ? newlevel : runlevel, bootlevel) != 0) {
+ tmplist = rc_services_in_runlevel(newlevel ?
+ newlevel : runlevel);
TAILQ_CONCAT(start_services, tmplist, entries);
free(tmplist);
- if (strcmp (newlevel ? newlevel : runlevel, bootlevel)
- != 0)
- {
- tmplist = rc_services_in_runlevel(newlevel ?
- newlevel :
- runlevel);
- TAILQ_CONCAT(start_services, tmplist, entries);
- free(tmplist);
- }
+ }
- if (hotplugged_services) {
- if (!start_services)
- start_services = rc_stringlist_new();
- TAILQ_FOREACH(service, hotplugged_services, entries)
- rc_stringlist_addu(start_services, service->value);
- }
+ if (hotplugged_services) {
+ if (!start_services)
+ start_services = rc_stringlist_new();
+ TAILQ_FOREACH(service, hotplugged_services, entries)
+ rc_stringlist_addu(start_services, service->value);
}
}
@@ -1059,7 +1045,7 @@ int main(int argc, char **argv)
/* Now stop the services that shouldn't be running */
if (stop_services)
- do_stop_services(newlevel, going_down, parallel);
+ do_stop_services(newlevel, parallel);
/* Wait for our services to finish */
wait_for_services();
@@ -1089,13 +1075,6 @@ int main(int argc, char **argv)
applet, HALTSH, strerror(errno));
}
- /* Single user is done now */
- if (strcmp(runlevel, RC_LEVEL_SINGLE) == 0) {
- if (exists(INTERACTIVE))
- unlink(INTERACTIVE);
- sulogin(false);
- }
-
mkdir(RC_STARTING, 0755);
rc_plugin_run(RC_HOOK_RUNLEVEL_START_IN, runlevel);
hook_out = RC_HOOK_RUNLEVEL_START_OUT;
@@ -1159,5 +1138,9 @@ int main(int argc, char **argv)
if (regen && strcmp(runlevel, bootlevel) == 0)
unlink(RC_DEPTREE_CACHE);
+ /* Single user is done now */
+ if (strcmp(runlevel, RC_LEVEL_SINGLE) == 0)
+ sulogin(false);
+
return EXIT_SUCCESS;
}