summaryrefslogtreecommitdiff
path: root/src/libunixonacid/unixmessage_receive.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2014-12-20 22:25:08 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2014-12-20 22:25:08 +0000
commitdb7f4d2c1ef70334af4cb8c1980f47d8a9f69249 (patch)
tree4d878ef25e634be9b9ae2b870905a548603ecc50 /src/libunixonacid/unixmessage_receive.c
parent0d82edd9f8bebb396a9154d4e1003340dbf6b967 (diff)
downloadskalibs-db7f4d2c1ef70334af4cb8c1980f47d8a9f69249.tar.xz
Found the BSD unixmessage bug. recvmsg(..., MSG_WAITALL) blocks
until buffer full or socket shutdown on BSD, *even if the socket is nonblocking*. So I added an "okwaitall" sysdeps, and won't set MSG_WAITALL on retarded systems.
Diffstat (limited to 'src/libunixonacid/unixmessage_receive.c')
-rw-r--r--src/libunixonacid/unixmessage_receive.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/libunixonacid/unixmessage_receive.c b/src/libunixonacid/unixmessage_receive.c
index a86ae10..502b523 100644
--- a/src/libunixonacid/unixmessage_receive.c
+++ b/src/libunixonacid/unixmessage_receive.c
@@ -1,6 +1,5 @@
/* ISC license. */
-#define _XPG4_2
#include <skalibs/sysdeps.h>
#include <skalibs/nonposix.h>
#include <errno.h>
@@ -15,6 +14,20 @@
#include <skalibs/siovec.h>
#include <skalibs/unixmessage.h>
+#ifdef SKALIBS_HASOKWAITALL
+# ifdef SKALIBS_HASCMSGCLOEXEC
+# define RECV(fd, hdr) recvmsg(fd, (hdr), MSG_WAITALL | MSG_CMSG_CLOEXEC)
+# else
+# define RECV(fd, hdr) recvmsg(fd, (hdr), MSG_WAITALL)
+# endif
+#else
+# ifdef SKALIBS_HASCMSGCLOEXEC
+# define RECV(fd, hdr) recvmsg(fd, (hdr), MSG_CMSG_CLOEXEC)
+# else
+# define RECV(fd, hdr) recvmsg(fd, (hdr), 0)
+# endif
+#endif
+
static int unixmessage_receiver_fill (unixmessage_receiver_t *b)
{
char ancilbuf[CMSG_SPACE(b->auxb.a - 1)] ;
@@ -38,11 +51,7 @@ static int unixmessage_receiver_fill (unixmessage_receiver_t *b)
cbuffer_wpeek(&b->mainb, v) ;
iovec_from_siovec(iov, v, 2) ;
}
-#ifdef SKALIBS_HASCMSGCLOEXEC
- r = recvmsg(b->fd, &msghdr, MSG_WAITALL | MSG_CMSG_CLOEXEC) ;
-#else
- r = recvmsg(b->fd, &msghdr, MSG_WAITALL) ;
-#endif
+ r = RECV(b->fd, &msghdr) ;
if (r <= 0) return r ;
{
struct cmsghdr *c = CMSG_FIRSTHDR(&msghdr) ;