X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Flogs-show.c;h=61c3652bd5ae32943d020f3f4e98f241071de9f9;hp=c99fc7569429d94324b1c5874baefc349591160e;hb=c50e4f95d8cfcd21bde2b0d1ff24b4de8fef4976;hpb=b6741478e7661c7e580e5dcfd6a6fccd1899c1d0 diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index c99fc7569..61c3652bd 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -1115,10 +1116,8 @@ int add_matches_for_user_unit(sd_journal *j, const char *unit, uid_t uid) { } static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { - _cleanup_free_ char *leader = NULL, *class = NULL; - _cleanup_close_pipe_ int sock[2] = { -1, -1 }; - _cleanup_close_ int nsfd = -1; - const char *p, *ns; + _cleanup_close_pipe_ int pair[2] = { -1, -1 }; + _cleanup_close_ int pidnsfd = -1, mntnsfd = -1, rootfd = -1; pid_t pid, child; siginfo_t si; char buf[37]; @@ -1131,26 +1130,15 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { if (!filename_is_safe(machine)) return -EINVAL; - p = strappenda("/run/systemd/machines/", machine); - - r = parse_env_file(p, NEWLINE, "LEADER", &leader, "CLASS", &class, NULL); + r = container_get_leader(machine, &pid); if (r < 0) return r; - if (!leader) - return -ENODATA; - if (!streq_ptr(class, "container")) - return -EIO; - r = parse_pid(leader, &pid); + + r = namespace_open(pid, &pidnsfd, &mntnsfd, &rootfd); if (r < 0) return r; - ns = procfs_file_alloca(pid, "ns/mnt"); - - nsfd = open(ns, O_RDONLY|O_NOCTTY|O_CLOEXEC); - if (nsfd < 0) - return -errno; - - if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sock) < 0) + if (socketpair(AF_UNIX, SOCK_DGRAM, 0, pair) < 0) return -errno; child = fork(); @@ -1160,10 +1148,10 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { if (child == 0) { int fd; - 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); @@ -1176,24 +1164,24 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) { if (k != 36) _exit(EXIT_FAILURE); - k = send(sock[1], buf, 36, MSG_NOSIGNAL); + k = send(pair[1], buf, 36, MSG_NOSIGNAL); if (k != 36) _exit(EXIT_FAILURE); _exit(EXIT_SUCCESS); } - close_nointr_nofail(sock[1]); - sock[1] = -1; - - k = recv(sock[0], buf, 36, 0); - if (k != 36) - return -EIO; + 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; + k = recv(pair[0], buf, 36, 0); + if (k != 36) + return -EIO; + buf[36] = 0; r = sd_id128_from_string(buf, boot_id); if (r < 0)