nspawn: Print attempted execv() path on failure (#5199)

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.
This commit is contained in:
Philip Withnall 2017-02-01 13:36:16 +00:00 committed by Zbigniew Jędrzejewski-Szmek
parent b5267219dd
commit 1a68e1e543

View 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) {