block SIGPIPE before writing to a pipe
authorHannes Reinecke <hare@suse.de>
Wed, 30 Apr 2008 09:01:04 +0000 (11:01 +0200)
committerChristophe Varoqui <christophe.varoqui@free.fr>
Wed, 30 Apr 2008 11:25:15 +0000 (13:25 +0200)
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.

Signed-off-by: Hannes Reinecke <hare@suse.de>
libmultipath/uxsock.c

index abb9f85..7f3530d 100644 (file)
@@ -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;
 }
 
 /*