diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-20 22:25:08 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-20 22:25:08 +0000 |
commit | db7f4d2c1ef70334af4cb8c1980f47d8a9f69249 (patch) | |
tree | 4d878ef25e634be9b9ae2b870905a548603ecc50 /src/libunixonacid/unixmessage_receive.c | |
parent | 0d82edd9f8bebb396a9154d4e1003340dbf6b967 (diff) | |
download | skalibs-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.c | 21 |
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) ; |