From e66ecb226ed6991d0c39a0daf7730e65fe555c6c Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 2 Jul 2008 09:53:29 +0000 Subject: 2008-07-01 Samuel Thibault * sysdeps/unix/bsd/bsd4.4/bits/socket.h: Define MSG_NOSIGNAL. * hurd/hurd/fd.h (__hurd_sockfail): Add extern inline function. * sysdeps/mach/hurd/recv.c (__recv): Use __hurd_sockfail instead of __hurd_dfail. * sysdeps/mach/hurd/recvfrom.c (__recvfrom): Likewise * sysdeps/mach/hurd/recvmsg.c (__recvmsg): Likewise * sysdeps/mach/hurd/send.c (__send): Likewise * sysdeps/mach/hurd/sendfrom.c (__sendfrom): Likewise * sysdeps/mach/hurd/sendmsg.c (__sendmsg): Likewise --- hurd/hurd/fd.h | 13 +++++++++++++ sysdeps/mach/hurd/recv.c | 2 +- sysdeps/mach/hurd/recvfrom.c | 4 ++-- sysdeps/mach/hurd/recvmsg.c | 4 ++-- sysdeps/mach/hurd/send.c | 2 +- sysdeps/mach/hurd/sendmsg.c | 2 +- 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 08d4407..d1aa867 100644 --- a/hurd/hurd/fd.h +++ b/hurd/hurd/fd.h @@ -27,6 +27,7 @@ #include #include +#include /* 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 b001729..a01e609 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 d5c73f4..d30bc40 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 c6874e8..15f9fb1 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 4810cd6..bb45c50 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 5fdfd73..a9d1c8c 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 67db4d8..2ccd01d 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 }; -- cgit v1.1