From ffcdd17d15ed7ca1ad4346f81bc96f8584ed3c9c Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Tue, 10 Apr 2018 15:21:06 -0700 Subject: fixes #338 possible SIGPIPE on Linux --- src/platform/posix/posix_pipedesc.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/platform/posix/posix_pipedesc.c b/src/platform/posix/posix_pipedesc.c index d3c46f2d..aebea4b8 100644 --- a/src/platform/posix/posix_pipedesc.c +++ b/src/platform/posix/posix_pipedesc.c @@ -67,17 +67,20 @@ nni_posix_pipedesc_dowrite(nni_posix_pipedesc *pd) nni_aio *aio; while ((aio = nni_list_first(&pd->writeq)) != NULL) { - unsigned i; - int n; - int niov; - unsigned naiov; - nni_iov *aiov; + unsigned i; + int n; + int niov; + unsigned naiov; + nni_iov * aiov; + struct msghdr hdr; #ifdef NNG_HAVE_ALLOCA struct iovec *iovec; #else struct iovec iovec[16]; #endif + memset(&hdr, 0, sizeof(hdr)); + nni_aio_get_iov(aio, &naiov, &aiov); #ifdef NNG_HAVE_ALLOCA @@ -101,7 +104,14 @@ nni_posix_pipedesc_dowrite(nni_posix_pipedesc *pd) } } - n = writev(pd->node.fd, iovec, niov); +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + + hdr.msg_iovlen = niov; + hdr.msg_iov = iovec; + + n = sendmsg(pd->node.fd, &hdr, MSG_NOSIGNAL); if (n < 0) { if ((errno == EAGAIN) || (errno == EINTR)) { // Can't write more right now. We're done -- cgit v1.2.3-70-g09d2