aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/mach/hurd/bits/socket.h5
-rw-r--r--sysdeps/mach/hurd/recvmsg.c4
2 files changed, 7 insertions, 2 deletions
diff --git a/sysdeps/mach/hurd/bits/socket.h b/sysdeps/mach/hurd/bits/socket.h
index 2d78a91..c2392be 100644
--- a/sysdeps/mach/hurd/bits/socket.h
+++ b/sysdeps/mach/hurd/bits/socket.h
@@ -197,8 +197,11 @@ enum
#define MSG_WAITALL MSG_WAITALL
MSG_DONTWAIT = 0x80, /* This message should be nonblocking. */
#define MSG_DONTWAIT MSG_DONTWAIT
- MSG_NOSIGNAL = 0x0400 /* Do not generate SIGPIPE on EPIPE. */
+ MSG_NOSIGNAL = 0x0400, /* Do not generate SIGPIPE on EPIPE. */
#define MSG_NOSIGNAL MSG_NOSIGNAL
+ MSG_CMSG_CLOEXEC = 0x40000 /* Atomically set close-on-exec flag
+ for file descriptors in SCM_RIGHTS. */
+#define MSG_CMSG_CLOEXEC MSG_CMSG_CLOEXEC
};
diff --git a/sysdeps/mach/hurd/recvmsg.c b/sysdeps/mach/hurd/recvmsg.c
index 90fd269..e06b0fe 100644
--- a/sysdeps/mach/hurd/recvmsg.c
+++ b/sysdeps/mach/hurd/recvmsg.c
@@ -197,11 +197,13 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags)
for (j = 0; j < nfds; j++)
{
+ int fd_flags = (flags & MSG_CMSG_CLOEXEC) ? O_CLOEXEC : 0;
err = reauthenticate (ports[i], &newports[newfds]);
if (err)
goto cleanup;
fds[j] = opened_fds[newfds] = _hurd_intern_fd (newports[newfds],
- fds[j], 0);
+ fds[j] | fd_flags,
+ 0);
if (fds[j] == -1)
{
err = errno;