]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
nspawn: Print attempted execv() path on failure (#5199)
authorPhilip Withnall <philip@tecnocode.co.uk>
Wed, 1 Feb 2017 13:36:16 +0000 (13:36 +0000)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 1 Feb 2017 13:36:16 +0000 (08:36 -0500)
The failure message is typically currently:
   execv() failed: No such file or directory
which is not very useful because it doesn’t tell you which file or
directory it was trying to exec.

src/nspawn/nspawn.c

index 4913907b69d3c31941e66ed3a2a48d043ed46d23..0474f61d437eedc31cac5829f0d4d70b034ba81a 100644 (file)
@@ -2130,6 +2130,7 @@ static int inner_child(
                 NULL, /* NOTIFY_SOCKET */
                 NULL
         };
+        const char *exec_target;
 
         _cleanup_strv_free_ char **env_use = NULL;
         int r;
@@ -2316,28 +2317,32 @@ static int inner_child(
                 memcpy_safe(a + 1, arg_parameters, m * sizeof(char*));
                 a[1 + m] = NULL;
 
-                a[0] = (char*) "/usr/lib/systemd/systemd";
+                exec_target = a[0] = (char*) "/usr/lib/systemd/systemd";
                 execve(a[0], a, env_use);
 
-                a[0] = (char*) "/lib/systemd/systemd";
+                exec_target = a[0] = (char*) "/lib/systemd/systemd";
                 execve(a[0], a, env_use);
 
-                a[0] = (char*) "/sbin/init";
+                exec_target = a[0] = (char*) "/sbin/init";
                 execve(a[0], a, env_use);
-        } else if (!strv_isempty(arg_parameters))
+        } else if (!strv_isempty(arg_parameters)) {
+                exec_target = arg_parameters[0];
                 execvpe(arg_parameters[0], arg_parameters, env_use);
-        else {
+        else {
                 if (!arg_chdir)
                         /* If we cannot change the directory, we'll end up in /, that is expected. */
                         (void) chdir(home ?: "/root");
 
+                exec_target = "/bin/bash";
                 execle("/bin/bash", "-bash", NULL, env_use);
+
+                exec_target = "/bin/sh";
                 execle("/bin/sh", "-sh", NULL, env_use);
         }
 
         r = -errno;
         (void) log_open();
-        return log_error_errno(r, "execv() failed: %m");
+        return log_error_errno(r, "execv(%s) failed: %m", exec_target);
 }
 
 static int setup_sd_notify_child(void) {