Commit d18c1b1a authored by Max Kellermann's avatar Max Kellermann

fd_util: add function recvmsg_cloexec()

parent c980fc65
......@@ -246,6 +246,33 @@ accept_cloexec_nonblock(int fd, struct sockaddr *address,
return ret;
}
#ifndef WIN32
ssize_t
recvmsg_cloexec(int sockfd, struct msghdr *msg, int flags)
{
#ifdef MSG_CMSG_CLOEXEC
flags |= MSG_CMSG_CLOEXEC;
#endif
ssize_t result = recvmsg(sockfd, msg, flags);
if (result >= 0) {
struct cmsghdr *cmsg = CMSG_FIRSTHDR(msg);
while (cmsg != NULL) {
if (cmsg->cmsg_type == SCM_RIGHTS) {
int fd = *(const int *)CMSG_DATA(cmsg);
fd_set_cloexec(fd, true);
}
cmsg = CMSG_NXTHDR(msg, cmsg);
}
}
return result;
}
#endif
#ifdef HAVE_INOTIFY_INIT
int
......
......@@ -39,6 +39,14 @@
#include <stdbool.h>
#include <stddef.h>
#ifndef WIN32
#if !defined(_GNU_SOURCE) && (defined(HAVE_PIPE2) || defined(HAVE_ACCEPT4))
#define _GNU_SOURCE
#endif
#include <sys/types.h>
#endif
struct sockaddr;
/**
......@@ -91,6 +99,20 @@ int
accept_cloexec_nonblock(int fd, struct sockaddr *address,
size_t *address_length_r);
#ifndef WIN32
struct msghdr;
/**
* Wrapper for recvmsg(), which sets the CLOEXEC flag (atomically if
* supported by the OS).
*/
ssize_t
recvmsg_cloexec(int sockfd, struct msghdr *msg, int flags);
#endif
/**
* Wrapper for inotify_init(), which sets the CLOEXEC flag (atomically
* if supported by the OS).
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment