diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-31 16:27:44 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-31 16:27:44 +0000 |
commit | 131a18f68dc73f208bb76a944fc6d42c86cfad3b (patch) | |
tree | 3f0d007b4d2932d2131723796289a70bf630d3ff /src/libunixonacid/unixmessage_receive.c | |
parent | 9d417556de94429896d5496190b15caac659597e (diff) | |
download | skalibs-131a18f68dc73f208bb76a944fc6d42c86cfad3b.tar.xz |
Safe wrappers around sendmsg and recvmsg in unixmessage primitives
Diffstat (limited to 'src/libunixonacid/unixmessage_receive.c')
-rw-r--r-- | src/libunixonacid/unixmessage_receive.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/libunixonacid/unixmessage_receive.c b/src/libunixonacid/unixmessage_receive.c index d25195b..21491fa 100644 --- a/src/libunixonacid/unixmessage_receive.c +++ b/src/libunixonacid/unixmessage_receive.c @@ -49,7 +49,7 @@ static int unixmessage_receiver_fill (unixmessage_receiver_t *b) .msg_controllen = sizeof(ancilbuf) } ; unsigned int auxlen ; - int r ; + int r = -1 ; if (cbuffer_isfull(&b->mainb) || cbuffer_isfull(&b->auxb)) return (errno = ENOBUFS, -1) ; { @@ -57,8 +57,11 @@ static int unixmessage_receiver_fill (unixmessage_receiver_t *b) cbuffer_wpeek(&b->mainb, v) ; iovec_from_siovec(iov, v, 2) ; } - r = recvmsg(b->fd, &msghdr, awesomeflags) ; - if (r <= 0) return r ; + while (r < 0) + { + r = recvmsg(b->fd, &msghdr, awesomeflags) ; + if (!r || (r < 0 && errno != EINTR)) return r ; + } { struct cmsghdr *c = CMSG_FIRSTHDR(&msghdr) ; if (c) |