From: Tom Gundersen Date: Wed, 21 Nov 2012 22:22:03 +0000 (+0100) Subject: systemctl: switch-root - read init= from /proc/cmdline X-Git-Tag: v197~87 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=13068da8b0b27bc56f0c5b245e5dbaa3dcd102d9 systemctl: switch-root - read init= from /proc/cmdline If the path to init is not specified as an argumnt to systemctl, but init= is given on the kernel commandline, use that. This means the initrd does not need glue code to parse the kernel commandline before passing on init= to systemctl. Cc: Harald Hoyer Cc: Dave Reisner --- diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 876e782e7..463c72f65 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -3324,7 +3324,8 @@ finish: static int switch_root(DBusConnection *bus, char **args) { unsigned l; - const char *root, *init; + const char *root; + _cleanup_free_ char *init = NULL; l = strv_length(args); if (l < 2 || l > 3) { @@ -3333,7 +3334,23 @@ static int switch_root(DBusConnection *bus, char **args) { } root = args[1]; - init = l >= 3 ? args[2] : ""; + + if (l >= 3) + init = strdup(args[2]); + else { + parse_env_file("/proc/cmdline", WHITESPACE, + "init", &init, + NULL); + + if (!init) + init = strdup(""); + + if (!init) + return log_oom(); + + } + + log_debug("switching root - root: %s; init: %s", root, init); return bus_method_call_with_reply ( bus,