[systemd-devel] [RFC][PATCH 2/2] systemctl: switch-root - read init= from /proc/cmdline

Tom Gundersen teg at jklm.no
Tue Nov 27 16:30:18 PST 2012


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 at redhat.com>
Cc: Dave Reisner <dreisner at archlinux.org>
---
 src/systemctl/systemctl.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 7a19d06..fc1db1a 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -3323,7 +3323,9 @@ finish:
 
 static int switch_root(DBusConnection *bus, char **args) {
         unsigned l;
-        const char *root, *init;
+        int r;
+        const char *root;
+        char *init = NULL;
 
         l = strv_length(args);
         if (l < 2 || l > 3) {
@@ -3332,9 +3334,22 @@ static int switch_root(DBusConnection *bus, char **args) {
         }
 
         root = args[1];
-        init = l >= 3 ? args[2] : "";
 
-        return bus_method_call_with_reply (
+        if (l >= 3) {
+                init = strdup(args[2]);
+        } else {
+                parse_env_file("/proc/cmdline", WHITESPACE,
+                               "init", &init,
+                               NULL);
+
+                if (!init)
+                        init = strdup("");
+
+        }
+
+        log_debug("switching root - root: %s; init: %s", root, init);
+
+        r = bus_method_call_with_reply (
                         bus,
                         "org.freedesktop.systemd1",
                         "/org/freedesktop/systemd1",
@@ -3345,6 +3360,10 @@ static int switch_root(DBusConnection *bus, char **args) {
                         DBUS_TYPE_STRING, &root,
                         DBUS_TYPE_STRING, &init,
                         DBUS_TYPE_INVALID);
+
+        free(init);
+
+        return r;
 }
 
 static int set_environment(DBusConnection *bus, char **args) {
-- 
1.8.0.1



More information about the systemd-devel mailing list