X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fnspawn%2Fnspawn.c;h=50f2c5911100acfd70c83fd4b45c649e397aea09;hp=71cdd3f39f27e23ab248dc84058ccf437f2f7399;hb=3a74cea5e4cea6d6f852a2a7118efe0e339b78c7;hpb=eaeb18dba95403b5f619d192c5a915546b5ace47 diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 71cdd3f39..50f2c5911 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -101,8 +101,9 @@ static int parse_argv(int argc, char *argv[]) { case 'D': free(arg_directory); - if (!(arg_directory = strdup(optarg))) { - log_error("Failed to duplicate root directory."); + arg_directory = canonicalize_file_name(optarg); + if (!arg_directory) { + log_error("Failed to canonicalize root directory."); return -ENOMEM; } @@ -474,6 +475,28 @@ finish: return r; } +static int setup_hostname(void) { + char *hn; + int r = 0; + + hn = file_name_from_path(arg_directory); + if (hn) { + hn = strdup(hn); + if (!hn) + return -ENOMEM; + + hostname_cleanup(hn); + + if (!isempty(hn)) + if (sethostname(hn, strlen(hn)) < 0) + r = -errno; + + free(hn); + } + + return r; +} + static int drop_capabilities(void) { static const unsigned long retain[] = { CAP_CHOWN, @@ -872,7 +895,6 @@ int main(int argc, char *argv[]) { if (pid == 0) { /* child */ - const char *hn; const char *home = NULL; uid_t uid = (uid_t) -1; gid_t gid = (gid_t) -1; @@ -1000,8 +1022,7 @@ int main(int argc, char *argv[]) { goto child_fail; } - if ((hn = file_name_from_path(arg_directory))) - sethostname(hn, strlen(hn)); + setup_hostname(); if (argc > optind) execvpe(argv[optind], argv + optind, (char**) envp);