From: Christian Brauner Date: Tue, 9 Jul 2019 10:17:42 +0000 (+0200) Subject: af_unix: add lxc_abstract_unix_recv_fds_iov() X-Git-Tag: lxc-3.2.0~9^2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc85e31eca140c9b760fc75e811d748e74f920d8;p=thirdparty%2Flxc.git af_unix: add lxc_abstract_unix_recv_fds_iov() Signed-off-by: Christian Brauner --- diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c index 7ab499a4f..f70eca333 100644 --- a/src/lxc/af_unix.c +++ b/src/lxc/af_unix.c @@ -212,20 +212,18 @@ int lxc_unix_send_fds(int fd, int *sendfds, int num_sendfds, void *data, return lxc_abstract_unix_send_fds(fd, sendfds, num_sendfds, data, size); } -int lxc_abstract_unix_recv_fds(int fd, int *recvfds, int num_recvfds, - void *data, size_t size) +static int lxc_abstract_unix_recv_fds_iov(int fd, int *recvfds, int num_recvfds, + 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(sizeof(struct ucred)) + CMSG_SPACE(num_recvfds * sizeof(int)); memset(&msg, 0, sizeof(msg)); - memset(&iov, 0, sizeof(iov)); cmsgbuf = malloc(cmsgbufsize); if (!cmsgbuf) { @@ -236,10 +234,8 @@ int lxc_abstract_unix_recv_fds(int fd, int *recvfds, int num_recvfds, msg.msg_control = cmsgbuf; msg.msg_controllen = cmsgbufsize; - 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 = recvmsg(fd, &msg, 0); @@ -271,6 +267,17 @@ out: return ret; } +int lxc_abstract_unix_recv_fds(int fd, int *recvfds, int num_recvfds, + 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_recv_fds_iov(fd, recvfds, num_recvfds, &iov, 1); +} + int lxc_abstract_unix_send_credential(int fd, void *data, size_t size) { struct msghdr msg = {0};