From e1036b1b5133141949bea166fb2cb6cdbfec3be0 Mon Sep 17 00:00:00 2001
From: Lukas Nykryn <lnykryn@redhat.com>
Date: Fri, 12 Sep 2014 13:27:36 +0200
Subject: [PATCH] systemctl: unbreak switchroot
rhel-only patch
cad8ec5980d63253586d9f884649c45eed0667a1 backport broke it
Related: #1138546
---
src/systemctl/systemctl.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 90a80bd..ebc8caa 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -4147,8 +4147,8 @@ static int show_enviroment(DBusConnection *bus, char **args) {
}
static int switch_root(DBusConnection *bus, char **args) {
- _cleanup_free_ char *cmdline_init = NULL;
- const char *root, *init;
+ _cleanup_free_ char *init = NULL;
+ const char *root;
unsigned l;
int r;
@@ -4161,23 +4161,20 @@ static int switch_root(DBusConnection *bus, char **args) {
root = args[1];
if (l >= 3)
- init = args[2];
+ init = strdup(args[2]);
else {
r = parse_env_file("/proc/cmdline", WHITESPACE,
- "init", &cmdline_init,
+ "init", &init,
NULL);
if (r < 0)
log_debug("Failed to parse /proc/cmdline: %s", strerror(-r));
- init = cmdline_init;
+ if (!init)
+ init = strdup("");
}
- if (!init)
- return log_oom();
- if (isempty(init))
- init = NULL;
- if (init) {
+ if (!isempty(init)) {
const char *root_systemd_path = NULL, *root_init_path = NULL;
root_systemd_path = strappenda(root, "/" SYSTEMD_BINARY_PATH);
@@ -4185,10 +4182,15 @@ static int switch_root(DBusConnection *bus, char **args) {
/* If the passed init is actually the same as the
* systemd binary, then let's suppress it. */
- if (files_same(root_init_path, root_systemd_path) > 0)
- init = NULL;
+ if (files_same(root_init_path, root_systemd_path) > 0) {
+ free(init);
+ init = strdup("");
+ }
}
+ if (!init)
+ return log_oom();
+
log_debug("Switching root - root: %s; init: %s", root, strna(init));
return bus_method_call_with_reply(