From 9c15b6662a2cf05c70175e8afcbde5a98fe12639 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke 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 --- 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 #include #include +#include #include #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