From e1726045d4ccd493e32e9b7c926ad8b6090734e2 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Thu, 4 Jul 2019 09:17:04 +0200 Subject: [PATCH 1/1] af_unix: add lxc_abstract_unix_send_fds_iov Signed-off-by: Wolfgang Bumiller --- src/lxc/af_unix.c | 25 ++++++++++++++++--------- src/lxc/af_unix.h | 3 +++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c index c688a8746..7ab499a4f 100644 --- a/src/lxc/af_unix.c +++ b/src/lxc/af_unix.c @@ -153,19 +153,16 @@ int lxc_abstract_unix_connect(const char *path) return fd; } -int lxc_abstract_unix_send_fds(int fd, int *sendfds, int num_sendfds, - void *data, size_t size) +int lxc_abstract_unix_send_fds_iov(int fd, int *sendfds, int num_sendfds, + struct iovec *iov, size_t iovlen) { __do_free char *cmsgbuf = NULL; int ret; struct msghdr msg; - struct iovec iov; struct cmsghdr *cmsg = NULL; - char buf[1] = {0}; size_t cmsgbufsize = CMSG_SPACE(num_sendfds * sizeof(int)); memset(&msg, 0, sizeof(msg)); - memset(&iov, 0, sizeof(iov)); cmsgbuf = malloc(cmsgbufsize); if (!cmsgbuf) { @@ -185,10 +182,8 @@ int lxc_abstract_unix_send_fds(int fd, int *sendfds, int num_sendfds, memcpy(CMSG_DATA(cmsg), sendfds, num_sendfds * sizeof(int)); - iov.iov_base = data ? data : buf; - iov.iov_len = data ? size : sizeof(buf); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; + msg.msg_iov = iov; + msg.msg_iovlen = iovlen; again: ret = sendmsg(fd, &msg, MSG_NOSIGNAL); @@ -199,6 +194,18 @@ again: return ret; } +int lxc_abstract_unix_send_fds(int fd, int *sendfds, int num_sendfds, + void *data, size_t size) +{ + char buf[1] = {0}; + struct iovec iov = { + .iov_base = data ? data : buf, + .iov_len = data ? size : sizeof(buf), + }; + return lxc_abstract_unix_send_fds_iov(fd, sendfds, num_sendfds, &iov, + 1); +} + int lxc_unix_send_fds(int fd, int *sendfds, int num_sendfds, void *data, size_t size) { diff --git a/src/lxc/af_unix.h b/src/lxc/af_unix.h index 8a068d920..9f4729c0b 100644 --- a/src/lxc/af_unix.h +++ b/src/lxc/af_unix.h @@ -35,6 +35,9 @@ extern void lxc_abstract_unix_close(int fd); extern int lxc_abstract_unix_connect(const char *path); extern int lxc_abstract_unix_send_fds(int fd, int *sendfds, int num_sendfds, void *data, size_t size); +extern int lxc_abstract_unix_send_fds_iov(int fd, int *sendfds, + int num_sendfds, struct iovec *iov, + size_t iovlen); extern int lxc_unix_send_fds(int fd, int *sendfds, int num_sendfds, void *data, size_t size); extern int lxc_abstract_unix_recv_fds(int fd, int *recvfds, int num_recvfds, -- 2.39.2