1
0
multipath-tools/multipath-tools-block-SIGPIPE

59 lines
1.5 KiB
Plaintext

From 9c15b6662a2cf05c70175e8afcbde5a98fe12639 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 29 Apr 2008 12:59:07 +0200
Subject: [PATCH] [libmultipath] 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.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
libmultipath/uxsock.c | 23 ++++++++++++++++++++---
1 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/libmultipath/uxsock.c b/libmultipath/uxsock.c
index abb9f85..cdc3dbc 100644
--- a/libmultipath/uxsock.c
+++ b/libmultipath/uxsock.c
@@ -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;
}
/*
--
1.5.2.4