X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnspawn%2Fnspawn.c;h=e907a1daa7f31549d45bca1747fc4523e3990780;hb=a5f5f8a07743bb9aa31fa361c90fce8d4a62388e;hp=a49cbc2238cf142de9adcd6b0929407794e2a3bb;hpb=d7e011e5bfa3361faf52b7b2dbacd11373d7fb86;p=elogind.git diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index a49cbc223..e907a1daa 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -222,6 +222,11 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_UUID: + if (!id128_is_valid(optarg)) { + log_error("Invalid UUID: %s", optarg); + return -EINVAL; + } + arg_uuid = optarg; break; @@ -1212,7 +1217,7 @@ finish: int main(int argc, char *argv[]) { pid_t pid = 0; int r = EXIT_FAILURE, k; - _cleanup_free_ char *machine_root = NULL, *name = NULL, *escaped = NULL, *newcg = NULL; + _cleanup_free_ char *newcg = NULL; _cleanup_close_ int master = -1; int n_fd_passed; const char *console = NULL; @@ -1226,9 +1231,13 @@ int main(int argc, char *argv[]) { log_parse_environment(); log_open(); - r = parse_argv(argc, argv); - if (r <= 0) + k = parse_argv(argc, argv); + if (k < 0) goto finish; + else if (k == 0) { + r = EXIT_SUCCESS; + goto finish; + } if (arg_directory) { char *p; @@ -1292,32 +1301,14 @@ int main(int argc, char *argv[]) { fdset_close_others(fds); log_open(); - k = cg_get_machine_path(&machine_root); + k = cg_get_machine_path(arg_machine, &newcg); if (k < 0) { log_error("Failed to determine machine cgroup path: %s", strerror(-k)); goto finish; } - name = strappend(arg_machine, ".nspawn"); - if (!name) { - log_oom(); - goto finish; - } - - escaped = cg_escape(name); - if (!escaped) { - log_oom(); - goto finish; - } - - newcg = strjoin(machine_root, "/", escaped, NULL); - if (!newcg) { - log_oom(); - goto finish; - } - - r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, newcg, false); - if (r <= 0 && r != -ENOENT) { + k = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, newcg, true); + if (k <= 0 && k != -ENOENT) { log_error("Container already running."); free(newcg); @@ -1361,6 +1352,8 @@ int main(int argc, char *argv[]) { goto finish; } + sd_notify(0, "READY=1"); + assert_se(sigemptyset(&mask) == 0); sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1); assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0); @@ -1696,16 +1689,16 @@ int main(int argc, char *argv[]) { if (saved_attr_valid) tcsetattr(STDIN_FILENO, TCSANOW, &saved_attr); - r = wait_for_terminate(pid, &status); - if (r < 0) { + k = wait_for_terminate(pid, &status); + if (k < 0) { r = EXIT_FAILURE; break; } if (status.si_code == CLD_EXITED) { + r = status.si_status; if (status.si_status != 0) { log_error("Container failed with error code %i.", status.si_status); - r = status.si_status; break; }