Blame SOURCES/bz1766993-fence_virtd-2-return-mainloop-on-interrupt.patch

9d9c20
From 958c0035aa6a69149c1a0fa218863c26e755d9e6 Mon Sep 17 00:00:00 2001
9d9c20
From: Ryan McCabe <rmccabe@redhat.com>
9d9c20
Date: Fri, 19 Jan 2018 11:04:22 -0500
9d9c20
Subject: [PATCH] fence_virtd: Return control to main loop on select
9d9c20
 interruption
9d9c20
9d9c20
Return control to the dispatch loop if select is interrupted by a
9d9c20
signal. The code that retried the select without breaking out of the
9d9c20
dispatch loop caused the daemon to not be able to be killed cleanly.
9d9c20
9d9c20
Resolves: https://github.com/ClusterLabs/fence-virt/issues/10
9d9c20
9d9c20
Signed-off-by: Ryan McCabe <rmccabe@redhat.com>
9d9c20
---
9d9c20
 server/mcast.c  |  9 +++++++--
9d9c20
 server/serial.c |  9 ++++++---
9d9c20
 server/tcp.c    |  9 +++++++--
9d9c20
 4 files changed, 28 insertions(+), 9 deletions(-)
9d9c20
9d9c20
diff --git a/server/mcast.c b/server/mcast.c
9d9c20
index 0336823..e103675 100644
9d9c20
--- a/server/mcast.c
9d9c20
+++ b/server/mcast.c
9d9c20
@@ -350,9 +350,14 @@ mcast_dispatch(listener_context_t c, struct timeval *timeout)
9d9c20
 	FD_ZERO(&rfds);
9d9c20
 	FD_SET(info->mc_sock, &rfds);
9d9c20
 
9d9c20
-	n = _select_retry((info->mc_sock)+1, &rfds, NULL, NULL, timeout);
9d9c20
-	if (n <= 0)
9d9c20
+	n = select((info->mc_sock)+1, &rfds, NULL, NULL, timeout);
9d9c20
+	if (n <= 0) {
9d9c20
+		if (errno == EINTR || errno == EAGAIN)
9d9c20
+			n = 0;
9d9c20
+		else
9d9c20
+			dbg_printf(2, "select: %s\n", strerror(errno));
9d9c20
 		return n;
9d9c20
+	}
9d9c20
 	
9d9c20
 	slen = sizeof(sin);
9d9c20
 	len = recvfrom(info->mc_sock, &data, sizeof(data), 0,
9d9c20
diff --git a/server/serial.c b/server/serial.c
9d9c20
index 70eb22b..23d143d 100644
9d9c20
--- a/server/serial.c
9d9c20
+++ b/server/serial.c
9d9c20
@@ -272,9 +272,12 @@ serial_dispatch(listener_context_t c, struct timeval *timeout)
9d9c20
 	if (info->wake_fd > max)
9d9c20
 		max = info->wake_fd;
9d9c20
 
9d9c20
-	n = _select_retry(max+1, &rfds, NULL, NULL, timeout);
9d9c20
-	if (n < 0) {
9d9c20
-		dbg_printf(2, "select: %s\n", strerror(errno));
9d9c20
+	n = select(max+1, &rfds, NULL, NULL, timeout);
9d9c20
+	if (n <= 0) {
9d9c20
+		if (errno == EINTR || errno == EAGAIN)
9d9c20
+			n = 0;
9d9c20
+		else
9d9c20
+			dbg_printf(2, "select: %s\n", strerror(errno));
9d9c20
 		return n;
9d9c20
 	}
9d9c20
 
9d9c20
diff --git a/server/tcp.c b/server/tcp.c
9d9c20
index 09366b7..bbd347e 100644
9d9c20
--- a/server/tcp.c
9d9c20
+++ b/server/tcp.c
9d9c20
@@ -278,9 +278,14 @@ tcp_dispatch(listener_context_t c, struct timeval *timeout)
9d9c20
 	FD_ZERO(&rfds);
9d9c20
 	FD_SET(info->listen_sock, &rfds);
9d9c20
 
9d9c20
-	n = _select_retry(info->listen_sock + 1, &rfds, NULL, NULL, timeout);
9d9c20
-	if (n <= 0)
9d9c20
+	n = select(info->listen_sock + 1, &rfds, NULL, NULL, timeout);
9d9c20
+	if (n <= 0) {
9d9c20
+		if (errno == EINTR || errno == EAGAIN)
9d9c20
+			n = 0;
9d9c20
+		else
9d9c20
+			dbg_printf(2, "select: %s\n", strerror(errno));
9d9c20
 		return n;
9d9c20
+	}
9d9c20
 	
9d9c20
 	client_fd = accept(info->listen_sock, NULL, NULL);
9d9c20
 	if (client_fd < 0) {