libmultipath, multipathd: Rework SIGPIPE handling
authorBart Van Assche <bart.vanassche@sandisk.com>
Tue, 16 Aug 2016 20:08:03 +0000 (13:08 -0700)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Mon, 29 Aug 2016 07:21:38 +0000 (09:21 +0200)
The behavior we want is as follows:
* If stdout or stderr is closed then SIGPIPE causes termination.
* Sending data to a socket that has been closed by the receiver
  does not cause multipathd to stop.

Hence unblock SIGPIPE and use MSG_NOSIGNAL when sending data over
a socket.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Benjamin Marzinski <bmarzins@redhat.com>
Cc: Gris Ge <fge@redhat.com>
libmpathcmd/mpath_cmd.c
libmultipath/uxsock.c
multipathd/main.c

index c058479..667a2dc 100644 (file)
@@ -33,7 +33,7 @@ static ssize_t read_all(int fd, void *buf, size_t len, unsigned int timeout)
                        return -1;
                } else if (!pfd.revents & POLLIN)
                        continue;
-               n = read(fd, buf, len);
+               n = recv(fd, buf, len, 0);
                if (n < 0) {
                        if ((errno == EINTR) || (errno == EAGAIN))
                                continue;
@@ -56,7 +56,7 @@ static size_t write_all(int fd, const void *buf, size_t len)
        size_t total = 0;
 
        while (len) {
-               ssize_t n = write(fd, buf, len);
+               ssize_t n = send(fd, buf, len, MSG_NOSIGNAL);
                if (n < 0) {
                        if ((errno == EINTR) || (errno == EAGAIN))
                                continue;
index 775e278..880257f 100644 (file)
@@ -81,7 +81,7 @@ size_t write_all(int fd, const void *buf, size_t len)
        size_t total = 0;
 
        while (len) {
-               ssize_t n = write(fd, buf, len);
+               ssize_t n = send(fd, buf, len, MSG_NOSIGNAL);
                if (n < 0) {
                        if ((errno == EINTR) || (errno == EAGAIN))
                                continue;
@@ -138,20 +138,7 @@ ssize_t read_all(int fd, void *buf, size_t len, unsigned int timeout)
  */
 int send_packet(int fd, const char *buf)
 {
-       int ret = 0;
-       sigset_t set, old;
-
-       /* Block SIGPIPE */
-       sigemptyset(&set);
-       sigaddset(&set, SIGPIPE);
-       pthread_sigmask(SIG_BLOCK, &set, &old);
-
-       ret = mpath_send_cmd(fd, buf);
-
-       /* And unblock it again */
-       pthread_sigmask(SIG_SETMASK, &old, NULL);
-
-       return ret;
+       return mpath_send_cmd(fd, buf);
 }
 
 /*
index 001eb8c..b3b3f7d 100644 (file)
@@ -2120,18 +2120,12 @@ sigusr2 (int sig)
 static void
 signal_init(void)
 {
-       sigset_t set;
-
-       sigemptyset(&set);
-       sigaddset(&set, SIGPIPE);
-       pthread_sigmask(SIG_SETMASK, &set, NULL);
-
        signal_set(SIGHUP, sighup);
        signal_set(SIGUSR1, sigusr1);
        signal_set(SIGUSR2, sigusr2);
        signal_set(SIGINT, sigend);
        signal_set(SIGTERM, sigend);
-       signal(SIGPIPE, SIG_IGN);
+       signal_set(SIGPIPE, sigend);
 }
 
 static void