X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmachine%2Fmachinectl.c;h=b3a70188a468130703bcea24fef2ce3d22e00aa8;hb=ca7b42c81652c342288a3e0a10abd885c66ac5b2;hp=7bb7086056a051e6d2dadce399753bd77111133d;hpb=4f8f66cb4236783cd3cbee97fefc9aaa8469ac08;p=elogind.git diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 7bb708605..b3a70188a 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -304,10 +304,8 @@ static int show(sd_bus *bus, char **args, unsigned n) { /* If no argument is specified, inspect the manager * itself */ r = show_properties(bus, "/org/freedesktop/machine1", &new_line); - if (r < 0) { - log_error("Failed to query properties: %s", strerror(-r)); + if (r < 0) return r; - } } for (i = 1; i < n; i++) { @@ -398,8 +396,8 @@ static int terminate_machine(sd_bus *bus, char **args, unsigned n) { } static int openpt_in_namespace(pid_t pid, int flags) { - _cleanup_close_ int nsfd = -1, rootfd = -1; - _cleanup_close_pipe_ int sock[2] = { -1, -1 }; + _cleanup_close_pipe_ int pair[2] = { -1, -1 }; + _cleanup_close_ int pidnsfd = -1, mntnsfd = -1, rootfd = -1; union { struct cmsghdr cmsghdr; uint8_t buf[CMSG_SPACE(sizeof(int))]; @@ -410,23 +408,14 @@ static int openpt_in_namespace(pid_t pid, int flags) { }; struct cmsghdr *cmsg; int master = -1, r; - char *ns, *root; pid_t child; siginfo_t si; - ns = procfs_file_alloca(pid, "ns/mnt"); - - nsfd = open(ns, O_RDONLY|O_NOCTTY|O_CLOEXEC); - if (nsfd < 0) - return -errno; - - root = procfs_file_alloca(pid, "root"); - - rootfd = open(root, O_RDONLY|O_NOCTTY|O_CLOEXEC|O_DIRECTORY); - if (rootfd < 0) - return -errno; + r = namespace_open(pid, &pidnsfd, &mntnsfd, &rootfd); + if (r < 0) + return r; - if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sock) < 0) + if (socketpair(AF_UNIX, SOCK_DGRAM, 0, pair) < 0) return -errno; child = fork(); @@ -434,19 +423,13 @@ static int openpt_in_namespace(pid_t pid, int flags) { return -errno; if (child == 0) { - close_nointr_nofail(sock[0]); - sock[0] = -1; + close_nointr_nofail(pair[0]); + pair[0] = -1; - r = setns(nsfd, CLONE_NEWNS); + r = namespace_enter(pidnsfd, mntnsfd, rootfd); if (r < 0) _exit(EXIT_FAILURE); - if (fchdir(rootfd) < 0) - _exit(EXIT_FAILURE); - - if (chroot(".") < 0) - _exit(EXIT_FAILURE); - master = posix_openpt(flags); if (master < 0) _exit(EXIT_FAILURE); @@ -459,18 +442,22 @@ static int openpt_in_namespace(pid_t pid, int flags) { mh.msg_controllen = cmsg->cmsg_len; - r = sendmsg(sock[1], &mh, MSG_NOSIGNAL); - close_nointr_nofail(master); - if (r < 0) + if (sendmsg(pair[1], &mh, MSG_NOSIGNAL) < 0) _exit(EXIT_FAILURE); _exit(EXIT_SUCCESS); } - close_nointr_nofail(sock[1]); - sock[1] = -1; + close_nointr_nofail(pair[1]); + pair[1] = -1; + + r = wait_for_terminate(child, &si); + if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS) { + + return r < 0 ? r : -EIO; + } - if (recvmsg(sock[0], &mh, MSG_NOSIGNAL|MSG_CMSG_CLOEXEC) < 0) + if (recvmsg(pair[0], &mh, MSG_NOSIGNAL|MSG_CMSG_CLOEXEC) < 0) return -errno; for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) @@ -489,14 +476,8 @@ static int openpt_in_namespace(pid_t pid, int flags) { master = fds[0]; } - r = wait_for_terminate(child, &si); - if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS || master < 0) { - - if (master >= 0) - close_nointr_nofail(master); - - return r < 0 ? r : -EIO; - } + if (master < 0) + return -EIO; return master; }