Skip to contentSkip to conversation

block SIGPIPE before writing to a pipe

PATCH New Hannes Reinecke 1 participant 1 message Apr 30, 2008 Device mapper

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 block SIGPIPE before writing to a pipe

We have to block SIGPIPE before we're writing to the communication pipe otherwise the daemon will be killed if the listening program terminates prematurely.

---
 libmultipath/uxsock.c |   23 ++++++++++++++++++++---
 1 files changed, 20 insertions(+), 3 deletions(-)
libmultipath/uxsock.c +20 -3
index abb9f85..cdc3dbc 100644
@@ -14,6 +14,7 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/poll.h>
+#include <signal.h>
 #include <errno.h>
 
 #include "memory.h"
@@ -127,9 +128,25 @@ size_t read_all(int fd, void *buf, size_t len)
  */
 int send_packet(int fd, const char *buf, size_t len)
 {
-	if (write_all(fd, &len, sizeof(len)) != sizeof(len)) return -1;
-	if (write_all(fd, buf, len) != len) return -1;	
-	return 0;
+	int ret = 0;
+#ifdef DAEMON
+	sigset_t set, old;
+
+	/* Block SIGPIPE */
+	sigemptyset(&set);
+	sigaddset(&set, SIGPIPE);
+	pthread_sigmask(SIG_BLOCK, &set, &old);
+#endif	
+	if (write_all(fd, &len, sizeof(len)) != sizeof(len)) 
+		ret = -1;
+	if (!ret && write_all(fd, buf, len) != len)
+		ret = -1;	
+
+#ifdef DAEMON
+	/* And unblock it again */
+	pthread_sigmask(SIG_SETMASK, &old, NULL);
+#endif	
+	return ret;
 }
 
 /*
Signature · 1 line
1.5.2.4