Patch to handle SIGPIPE in send().
SIGPIPE behavior is not consistent even across *ix platforms. Linux
has MSG_NOSIGNAL and Mac supports SO_NOSIGPIPE. Best option is to set
SIG_IGN, but it's more of an application setting. We should document
this.
diff --git a/src/tcp_connecter.cpp b/src/tcp_connecter.cpp
index 3c82d32..e0cc760 100644
--- a/src/tcp_connecter.cpp
+++ b/src/tcp_connecter.cpp
@@ -206,6 +206,13 @@ int zmq::tcp_connecter_t::open ()
         errno_assert (rc != SOCKET_ERROR);
 #endif
 
+#ifdef SO_NOSIGPIPE
+        flag = 1;
+        rc = setsockopt (s, SOL_SOCKET, SO_NOSIGPIPE, (char *) &flag,
+                         sizeof (int));
+        errno_assert (rc != -1);
+#endif
+
         //  Connect to the remote peer.
         rc = ::connect (s, (struct sockaddr*) &addr, addr_len);
 
@@ -242,6 +249,13 @@ int zmq::tcp_connecter_t::open ()
         int rc = fcntl (s, F_SETFL, flag | O_NONBLOCK);
         errno_assert (rc != -1);
 
+#ifdef SO_NOSIGPIPE
+        flag = 1;
+        rc = setsockopt (s, SOL_SOCKET, SO_NOSIGPIPE, (char *) &flag,
+                         sizeof (int));
+        errno_assert (rc != -1);
+#endif
+
         //  Connect to the remote peer.
         rc = ::connect (s, (struct sockaddr*) &addr, sizeof (sockaddr_un));
 
diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp
index a62bc04..c6dfee6 100644
--- a/src/tcp_listener.cpp
+++ b/src/tcp_listener.cpp
@@ -328,6 +328,13 @@ zmq::fd_t zmq::tcp_listener_t::accept ()
     errno_assert (rc != -1);
 #endif
 
+#ifdef SO_NOSIGPIPE 
+    flags = 1;
+    rc = setsockopt (sock, SOL_SOCKET, SO_NOSIGPIPE, (char *) &flags,
+                     sizeof (int));
+    errno_assert (rc != -1);
+#endif
+
     struct sockaddr *sa = (struct sockaddr*) &addr;
     if (AF_UNIX != sa->sa_family) {
 
@@ -335,7 +342,7 @@ zmq::fd_t zmq::tcp_listener_t::accept ()
         int flag = 1;
         rc = setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (char*) &flag,
             sizeof (int));
-        errno_assert (rc == 0);
+        errno_assert (rc != -1);
 
 #ifdef ZMQ_HAVE_OPENVMS
         //  Disable delayed acknowledgements.
diff --git a/src/tcp_socket.cpp b/src/tcp_socket.cpp
index cc426d7..6fb537a 100644
--- a/src/tcp_socket.cpp
+++ b/src/tcp_socket.cpp
@@ -181,7 +181,13 @@ zmq::fd_t zmq::tcp_socket_t::get_fd ()
 
 int zmq::tcp_socket_t::write (const void *data, int size)
 {
-    ssize_t nbytes = send (s, data, size, 0);
+#if defined ZMQ_HAVE_LINUX && defined MSG_NOSIGNAL
+    int flags = MSG_NOSIGNAL;
+#else
+    int flags = 0;
+#endif
+
+    ssize_t nbytes = ::send (s, data, size, flags);
 
     //  Several errors are OK. When speculative write is being done we may not
     //  be able to write a single byte to the socket. Also, SIGSTOP issued
@@ -200,7 +206,7 @@ int zmq::tcp_socket_t::write (const void *data, int size)
 
 int zmq::tcp_socket_t::read (void *data, int size)
 {
-    ssize_t nbytes = recv (s, data, size, 0);
+    ssize_t nbytes = ::recv (s, data, size, 0);
 
     //  Several errors are OK. When speculative read is being done we may not
     //  be able to read a single byte to the socket. Also, SIGSTOP issued
_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to