diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2017-02-01 13:36:16 +0000 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2017-02-01 08:36:16 -0500 |
commit | 1a68e1e543fd8f899503bec00585a16ada296ef7 (patch) | |
tree | 7e8d1d9ff89f50266c222e9fafd86d97a2542ce6 /src | |
parent | b5267219ddd327207128b3e311f29eac232c6dde (diff) |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/nspawn/nspawn.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 4913907b69..0474f61d43 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -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) { |