aboutsummaryrefslogtreecommitdiffstats
path: root/src/fd_util.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2010-08-03 15:55:25 +0200
committerMax Kellermann <max@duempel.org>2010-08-03 17:51:35 +0200
commitd18c1b1a0ab57d77ba823cfedf40077d24dafbd7 (patch)
tree4de2aa931b8a73e8530cc3586156c6eb7ca0524b /src/fd_util.c
parentc980fc653d0bfe1b4744e7e8364b37225ac38746 (diff)
downloadmpd-d18c1b1a0ab57d77ba823cfedf40077d24dafbd7.tar.gz
mpd-d18c1b1a0ab57d77ba823cfedf40077d24dafbd7.tar.xz
mpd-d18c1b1a0ab57d77ba823cfedf40077d24dafbd7.zip
fd_util: add function recvmsg_cloexec()
Diffstat (limited to '')
-rw-r--r--src/fd_util.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/fd_util.c b/src/fd_util.c
index d8fe166d7..b9443b03d 100644
--- a/src/fd_util.c
+++ b/src/fd_util.c
@@ -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