X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnspawn%2Fnspawn.c;h=bbb3334ba1a2cfb023f3f9451ddf2030df07e248;hb=38158b920e772ea3a7cc9dfcf705666ce3aa5ce3;hp=b59b2673cd63545116509e9bd5f4fe3cdc7878c3;hpb=a383724e4202ee9681bd31cb668c44bdbbf83638;p=elogind.git diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index b59b2673c..bbb3334ba 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -173,7 +173,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "+hD:u:C:bj", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "+hD:u:C:bM:j", options, NULL)) >= 0) { switch (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; @@ -923,7 +928,8 @@ static int setup_cgroup(const char *path) { } static int save_attributes(const char *cgroup, pid_t pid, const char *uuid, const char *directory) { - char buf[DECIMAL_STR_MAX(pid_t)], path[PATH_MAX]; + _cleanup_free_ char *path = NULL; + char buf[DECIMAL_STR_MAX(pid_t)]; int r = 0, k; assert(cgroup); @@ -933,10 +939,10 @@ static int save_attributes(const char *cgroup, pid_t pid, const char *uuid, cons #ifdef HAVE_XATTR assert_se(snprintf(buf, sizeof(buf), "%lu", (unsigned long) pid) < (int) sizeof(buf)); - r = snprintf(path, sizeof(path), "/sys/fs/cgroup/systemd/%s", cgroup); - if (r >= (int) sizeof(path)) { - log_error("cgroup name too long"); - return -EINVAL; + r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, cgroup, NULL, &path); + if (r < 0) { + log_error("Failed to get path: %s", strerror(-r)); + return r; } r = setxattr(path, "trusted.init_pid", buf, strlen(buf), XATTR_CREATE); @@ -954,7 +960,7 @@ static int save_attributes(const char *cgroup, pid_t pid, const char *uuid, cons k = setxattr(path, "trusted.root_directory", directory, strlen(directory), XATTR_CREATE); if (k < 0) { - log_warning("Failed to set %s attribute on %s: %m", "trusted.machine_id", path); + log_warning("Failed to set %s attribute on %s: %m", "trusted.root_directory", path); if (r == 0) r = k; } @@ -1211,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, *newcg = NULL; + _cleanup_free_ char *newcg = NULL; _cleanup_close_ int master = -1; int n_fd_passed; const char *console = NULL; @@ -1225,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; @@ -1291,20 +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; } - newcg = strjoin(machine_root, "/", arg_machine, NULL); - if (!newcg) { - log_error("Failed to allocate cgroup path."); - 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); @@ -1348,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); @@ -1457,8 +1463,7 @@ int main(int argc, char *argv[]) { if (setup_cgroup(newcg) < 0) goto child_fail; - close_nointr_nofail(pipefd2[1]); - close_nointr_nofail(pipefd2[0]); + close_pipe(pipefd2); /* Mark everything as slave, so that we still * receive mounts from the real root, but don't @@ -1684,8 +1689,8 @@ 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; }