From: Lennart Poettering Date: Mon, 13 Sep 2010 23:56:14 +0000 (+0200) Subject: initctl: properly use isolate when activating runlevels X-Git-Tag: v10~4 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=ac83842a55fc0f68cb81d9cad4c57df29ed3758f initctl: properly use isolate when activating runlevels --- diff --git a/src/initctl.c b/src/initctl.c index 10db2dda1..53eac5754 100644 --- a/src/initctl.c +++ b/src/initctl.c @@ -68,27 +68,32 @@ struct Fifo { LIST_FIELDS(Fifo, fifo); }; -static const char *translate_runlevel(int runlevel) { +static const char *translate_runlevel(int runlevel, bool *isolate) { static const struct { const int runlevel; const char *special; + bool isolate; } table[] = { - { '0', SPECIAL_POWEROFF_TARGET }, - { '1', SPECIAL_RESCUE_TARGET }, - { 's', SPECIAL_RESCUE_TARGET }, - { 'S', SPECIAL_RESCUE_TARGET }, - { '2', SPECIAL_RUNLEVEL2_TARGET }, - { '3', SPECIAL_RUNLEVEL3_TARGET }, - { '4', SPECIAL_RUNLEVEL4_TARGET }, - { '5', SPECIAL_RUNLEVEL5_TARGET }, - { '6', SPECIAL_REBOOT_TARGET }, + { '0', SPECIAL_POWEROFF_TARGET, false }, + { '1', SPECIAL_RESCUE_TARGET, true }, + { 's', SPECIAL_RESCUE_TARGET, true }, + { 'S', SPECIAL_RESCUE_TARGET, true }, + { '2', SPECIAL_RUNLEVEL2_TARGET, true }, + { '3', SPECIAL_RUNLEVEL3_TARGET, true }, + { '4', SPECIAL_RUNLEVEL4_TARGET, true }, + { '5', SPECIAL_RUNLEVEL5_TARGET, true }, + { '6', SPECIAL_REBOOT_TARGET, false }, }; unsigned i; + assert(isolate); + for (i = 0; i < ELEMENTSOF(table); i++) - if (table[i].runlevel == runlevel) + if (table[i].runlevel == runlevel) { + *isolate = table[i].isolate; return table[i].special; + } return NULL; } @@ -97,17 +102,23 @@ static void change_runlevel(Server *s, int runlevel) { const char *target; DBusMessage *m = NULL, *reply = NULL; DBusError error; - const char *replace = "replace"; + const char *mode; + bool isolate = false; assert(s); dbus_error_init(&error); - if (!(target = translate_runlevel(runlevel))) { + if (!(target = translate_runlevel(runlevel, &isolate))) { log_warning("Got request for unknown runlevel %c, ignoring.", runlevel); goto finish; } + if (isolate) + mode = "isolate"; + else + mode = "replace"; + log_debug("Running request %s", target); if (!(m = dbus_message_new_method_call("org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartUnit"))) { @@ -117,7 +128,7 @@ static void change_runlevel(Server *s, int runlevel) { if (!dbus_message_append_args(m, DBUS_TYPE_STRING, &target, - DBUS_TYPE_STRING, &replace, + DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID)) { log_error("Could not attach target and flag information to message."); goto finish;