mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-07 15:29:02 +00:00
af_unix: add lxc_abstract_unix_recv_fds_iov()
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
e1726045d4
commit
dc85e31eca
@ -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);
|
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,
|
static int lxc_abstract_unix_recv_fds_iov(int fd, int *recvfds, int num_recvfds,
|
||||||
void *data, size_t size)
|
struct iovec *iov, size_t iovlen)
|
||||||
{
|
{
|
||||||
__do_free char *cmsgbuf = NULL;
|
__do_free char *cmsgbuf = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
struct iovec iov;
|
|
||||||
struct cmsghdr *cmsg = NULL;
|
struct cmsghdr *cmsg = NULL;
|
||||||
char buf[1] = {0};
|
char buf[1] = {0};
|
||||||
size_t cmsgbufsize = CMSG_SPACE(sizeof(struct ucred)) +
|
size_t cmsgbufsize = CMSG_SPACE(sizeof(struct ucred)) +
|
||||||
CMSG_SPACE(num_recvfds * sizeof(int));
|
CMSG_SPACE(num_recvfds * sizeof(int));
|
||||||
|
|
||||||
memset(&msg, 0, sizeof(msg));
|
memset(&msg, 0, sizeof(msg));
|
||||||
memset(&iov, 0, sizeof(iov));
|
|
||||||
|
|
||||||
cmsgbuf = malloc(cmsgbufsize);
|
cmsgbuf = malloc(cmsgbufsize);
|
||||||
if (!cmsgbuf) {
|
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_control = cmsgbuf;
|
||||||
msg.msg_controllen = cmsgbufsize;
|
msg.msg_controllen = cmsgbufsize;
|
||||||
|
|
||||||
iov.iov_base = data ? data : buf;
|
msg.msg_iov = iov;
|
||||||
iov.iov_len = data ? size : sizeof(buf);
|
msg.msg_iovlen = iovlen;
|
||||||
msg.msg_iov = &iov;
|
|
||||||
msg.msg_iovlen = 1;
|
|
||||||
|
|
||||||
again:
|
again:
|
||||||
ret = recvmsg(fd, &msg, 0);
|
ret = recvmsg(fd, &msg, 0);
|
||||||
@ -271,6 +267,17 @@ out:
|
|||||||
return ret;
|
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)
|
int lxc_abstract_unix_send_credential(int fd, void *data, size_t size)
|
||||||
{
|
{
|
||||||
struct msghdr msg = {0};
|
struct msghdr msg = {0};
|
||||||
|
Loading…
Reference in New Issue
Block a user