chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
core: when an already abandoned unit gets abandoned again generate a clean error
[elogind.git]
/
src
/
shared
/
logs-show.c
diff --git
a/src/shared/logs-show.c
b/src/shared/logs-show.c
index c99fc7569429d94324b1c5874baefc349591160e..61c3652bd5ae32943d020f3f4e98f241071de9f9 100644
(file)
--- a/
src/shared/logs-show.c
+++ b/
src/shared/logs-show.c
@@
-23,6
+23,7
@@
#include <assert.h>
#include <errno.h>
#include <sys/poll.h>
#include <assert.h>
#include <errno.h>
#include <sys/poll.h>
+#include <sys/socket.h>
#include <string.h>
#include <fcntl.h>
#include <string.h>
#include <fcntl.h>
@@
-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) {
}
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];
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;
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 (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;
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();
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;
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);
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);
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);
}
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;
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)
buf[36] = 0;
r = sd_id128_from_string(buf, boot_id);
if (r < 0)