]> git.proxmox.com Git - mirror_lxc.git/commitdiff
af_unix: add lxc_abstract_unix_recv_fds_iov()
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 9 Jul 2019 10:17:42 +0000 (12:17 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 9 Jul 2019 10:25:10 +0000 (12:25 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/af_unix.c

index 7ab499a4f4ede7229e9b793055dd820891ff092c..f70eca33320ef29cc8f05b3d5035edc78d8cb332 100644 (file)
@@ -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};