From 13068da8b0b27bc56f0c5b245e5dbaa3dcd102d9 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Wed, 21 Nov 2012 23:22:03 +0100 Subject: [PATCH] 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 --- src/systemctl/systemctl.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) 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, -- 2.30.2