diff options
-rw-r--r-- | hurd/hurd/fd.h | 13 | ||||
-rw-r--r-- | sysdeps/mach/hurd/recv.c | 2 | ||||
-rw-r--r-- | sysdeps/mach/hurd/recvfrom.c | 4 | ||||
-rw-r--r-- | sysdeps/mach/hurd/recvmsg.c | 4 | ||||
-rw-r--r-- | sysdeps/mach/hurd/send.c | 2 | ||||
-rw-r--r-- | sysdeps/mach/hurd/sendmsg.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/bsd/bsd4.4/bits/socket.h | 4 |
7 files changed, 23 insertions, 8 deletions
diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h index 08d4407e88..d1aa867cbf 100644 --- a/hurd/hurd/fd.h +++ b/hurd/hurd/fd.h @@ -27,6 +27,7 @@ #include <hurd/hurd_types.h> #include <hurd/port.h> +#include <sys/socket.h> /* Structure representing a file descriptor. */ @@ -179,6 +180,18 @@ __hurd_dfail (int fd, error_t err) errno = _hurd_fd_error (fd, err); return -1; } + +/* Likewise, but do not raise SIGPIPE on EPIPE if flags contain + MSG_NOSIGNAL. */ + +_HURD_FD_H_EXTERN_INLINE int +__hurd_sockfail (int fd, int flags, error_t err) +{ + if (!(flags & MSG_NOSIGNAL) || err != EPIPE) + err = _hurd_fd_error (fd, err); + errno = err; + return -1; +} /* Set up *FD to have PORT its server port, doing appropriate ctty magic. Does no locking or unlocking. */ diff --git a/sysdeps/mach/hurd/recv.c b/sysdeps/mach/hurd/recv.c index b001729d18..a01e6090d3 100644 --- a/sysdeps/mach/hurd/recv.c +++ b/sysdeps/mach/hurd/recv.c @@ -48,7 +48,7 @@ __recv (fd, buf, n, flags) &cdata, &clen, &flags, n))) - return __hurd_dfail (fd, err); + return __hurd_sockfail (fd, flags, err); __mach_port_deallocate (__mach_task_self (), addrport); __vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen); diff --git a/sysdeps/mach/hurd/recvfrom.c b/sysdeps/mach/hurd/recvfrom.c index d5c73f4441..d30bc40c06 100644 --- a/sysdeps/mach/hurd/recvfrom.c +++ b/sysdeps/mach/hurd/recvfrom.c @@ -52,7 +52,7 @@ __recvfrom (fd, buf, n, flags, addrarg, addr_len) &cdata, &clen, &flags, n))) - return __hurd_dfail (fd, err); + return __hurd_sockfail (fd, flags, err); /* Get address data for the returned address port if requested. */ if (addr != NULL) @@ -74,7 +74,7 @@ __recvfrom (fd, buf, n, flags, addrarg, addr_len) if (err) { __mach_port_deallocate (__mach_task_self (), addrport); - return __hurd_dfail (fd, err); + return __hurd_sockfail (fd, flags, err); } if (*addr_len > buflen) diff --git a/sysdeps/mach/hurd/recvmsg.c b/sysdeps/mach/hurd/recvmsg.c index c6874e8bd8..15f9fb14d6 100644 --- a/sysdeps/mach/hurd/recvmsg.c +++ b/sysdeps/mach/hurd/recvmsg.c @@ -63,7 +63,7 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags) &ports, &nports, &cdata, &clen, &message->msg_flags, amount))) - return __hurd_dfail (fd, err); + return __hurd_sockfail (fd, flags, err); if (message->msg_name != NULL) { @@ -84,7 +84,7 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags) if (err) { __mach_port_deallocate (__mach_task_self (), aport); - return __hurd_dfail (fd, err); + return __hurd_sockfail (fd, flags, err); } if (message->msg_namelen > buflen) diff --git a/sysdeps/mach/hurd/send.c b/sysdeps/mach/hurd/send.c index 4810cd68c3..bb45c50696 100644 --- a/sysdeps/mach/hurd/send.c +++ b/sysdeps/mach/hurd/send.c @@ -38,7 +38,7 @@ __send (fd, buf, n, flags) NULL, MACH_MSG_TYPE_COPY_SEND, 0, NULL, 0, &wrote)); - return err ? __hurd_dfail (fd, err) : wrote; + return err ? __hurd_sockfail (fd, flags, err) : wrote; } libc_hidden_def (__send) weak_alias (__send, send) diff --git a/sysdeps/mach/hurd/sendmsg.c b/sysdeps/mach/hurd/sendmsg.c index 5fdfd734ec..a9d1c8c1d4 100644 --- a/sysdeps/mach/hurd/sendmsg.c +++ b/sysdeps/mach/hurd/sendmsg.c @@ -149,7 +149,7 @@ __libc_sendmsg (int fd, const struct msghdr *message, int flags) if (dealloc) __vm_deallocate (__mach_task_self (), data.addr, len); - return err ? __hurd_dfail (fd, err) : amount; + return err ? __hurd_sockfail (fd, flags, err) : amount; } weak_alias (__libc_sendmsg, sendmsg) diff --git a/sysdeps/unix/bsd/bsd4.4/bits/socket.h b/sysdeps/unix/bsd/bsd4.4/bits/socket.h index 67db4d8469..2ccd01d011 100644 --- a/sysdeps/unix/bsd/bsd4.4/bits/socket.h +++ b/sysdeps/unix/bsd/bsd4.4/bits/socket.h @@ -171,8 +171,10 @@ enum #define MSG_CTRUNC MSG_CTRUNC MSG_WAITALL = 0x40, /* Wait for full request or error. */ #define MSG_WAITALL MSG_WAITALL - MSG_DONTWAIT = 0x80 /* This message should be nonblocking. */ + MSG_DONTWAIT = 0x80, /* This message should be nonblocking. */ #define MSG_DONTWAIT MSG_DONTWAIT + MSG_NOSIGNAL = 0x0400 /* Do not generate SIGPIPE on EPIPE. */ +#define MSG_NOSIGNAL MSG_NOSIGNAL }; |