forked from pool/multipath-tools
59 lines
1.5 KiB
Plaintext
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
|
|
|