util: introduce {send,receive}_one_fd()
Introduce two new helpers that send/receive a single fd via a unix transport. Also make nspawn use them instead of hard-coding it. Based on a patch by Krzesimir Nowak.
This commit is contained in:
+4
-21
@@ -1264,16 +1264,7 @@ static int setup_dev_console(const char *dest, const char *console) {
|
||||
static int setup_kmsg(const char *dest, int kmsg_socket) {
|
||||
const char *from, *to;
|
||||
_cleanup_umask_ mode_t u;
|
||||
int fd, k;
|
||||
union {
|
||||
struct cmsghdr cmsghdr;
|
||||
uint8_t buf[CMSG_SPACE(sizeof(int))];
|
||||
} control = {};
|
||||
struct msghdr mh = {
|
||||
.msg_control = &control,
|
||||
.msg_controllen = sizeof(control),
|
||||
};
|
||||
struct cmsghdr *cmsg;
|
||||
int fd, r;
|
||||
|
||||
assert(kmsg_socket >= 0);
|
||||
|
||||
@@ -1298,21 +1289,13 @@ static int setup_kmsg(const char *dest, int kmsg_socket) {
|
||||
if (fd < 0)
|
||||
return log_error_errno(errno, "Failed to open fifo: %m");
|
||||
|
||||
cmsg = CMSG_FIRSTHDR(&mh);
|
||||
cmsg->cmsg_level = SOL_SOCKET;
|
||||
cmsg->cmsg_type = SCM_RIGHTS;
|
||||
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
|
||||
memcpy(CMSG_DATA(cmsg), &fd, sizeof(int));
|
||||
|
||||
mh.msg_controllen = cmsg->cmsg_len;
|
||||
|
||||
/* Store away the fd in the socket, so that it stays open as
|
||||
* long as we run the child */
|
||||
k = sendmsg(kmsg_socket, &mh, MSG_NOSIGNAL);
|
||||
r = send_one_fd(kmsg_socket, fd);
|
||||
safe_close(fd);
|
||||
|
||||
if (k < 0)
|
||||
return log_error_errno(errno, "Failed to send FIFO fd: %m");
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to send FIFO fd: %m");
|
||||
|
||||
/* And now make the FIFO unavailable as /run/kmsg... */
|
||||
(void) unlink(from);
|
||||
|
||||
Reference in New Issue
Block a user