chiark / gitweb /
systemctl: switch-root - read init= from /proc/cmdline
authorTom Gundersen <teg@jklm.no>
Wed, 21 Nov 2012 22:22:03 +0000 (23:22 +0100)
committerTom Gundersen <teg@jklm.no>
Fri, 28 Dec 2012 22:37:18 +0000 (23:37 +0100)
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 <harald@redhat.com>
Cc: Dave Reisner <dreisner@archlinux.org>
src/systemctl/systemctl.c

index 876e782e7dc83b886df0ebde27a8b26633f73d5c..463c72f65994f9dfb1dc169eef3275d7182f33a7 100644 (file)
@@ -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,