From 2c909b78d8226d4d76f53df1091af40ec5fc54a1 Mon Sep 17 00:00:00 2001 From: Ryan McCabe Date: Thu, 25 May 2017 13:34:05 -0400 Subject: [PATCH] fence_virtd: Fix select logic in listener plugins Don't fail causing the daemon to exit when select() fails with errors that indicate we should retry. Signed-off-by: Ryan McCabe --- common/fdops.c | 8 +++++--- server/mcast.c | 10 ++-------- server/serial.c | 4 +--- server/tcp.c | 2 +- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/common/fdops.c b/common/fdops.c index bff8bec..3d89ba1 100644 --- a/common/fdops.c +++ b/common/fdops.c @@ -41,9 +41,11 @@ _select_retry(int fdmax, fd_set * rfds, fd_set * wfds, fd_set * xfds, while (1) { rv = select(fdmax, rfds, wfds, xfds, timeout); - if ((rv == -1) && (errno == EINTR)) - /* return on EBADF/EINVAL/ENOMEM; continue on EINTR */ - continue; + if (rv == -1) { + /* return on EBADF/EINVAL/ENOMEM; continue on EINTR/EAGAIN/ENOMEM */ + if (errno == EINTR || errno == EAGAIN || errno == ENOMEM) + continue; + } return rv; } } diff --git a/server/mcast.c b/server/mcast.c index f6181aa..8f58fa6 100644 --- a/server/mcast.c +++ b/server/mcast.c @@ -350,16 +350,10 @@ mcast_dispatch(listener_context_t c, struct timeval *timeout) FD_ZERO(&rfds); FD_SET(info->mc_sock, &rfds); - n = select((info->mc_sock)+1, &rfds, NULL, NULL, timeout); - if (n < 0) + n = _select_retry((info->mc_sock)+1, &rfds, NULL, NULL, timeout); + if (n <= 0) return n; - /* - * If no requests, we're done - */ - if (n == 0) - return 0; - slen = sizeof(sin); len = recvfrom(info->mc_sock, &data, sizeof(data), 0, (struct sockaddr *)&sin, &slen); diff --git a/server/serial.c b/server/serial.c index 558292a..70eb22b 100644 --- a/server/serial.c +++ b/server/serial.c @@ -272,10 +272,8 @@ serial_dispatch(listener_context_t c, struct timeval *timeout) if (info->wake_fd > max) max = info->wake_fd; - n = select(max+1, &rfds, NULL, NULL, timeout); + n = _select_retry(max+1, &rfds, NULL, NULL, timeout); if (n < 0) { - if (errno == ETIMEDOUT || errno == EINTR || errno == EAGAIN) - return 0; dbg_printf(2, "select: %s\n", strerror(errno)); return n; } diff --git a/server/tcp.c b/server/tcp.c index fc9caca..0002e8f 100644 --- a/server/tcp.c +++ b/server/tcp.c @@ -276,7 +276,7 @@ tcp_dispatch(listener_context_t c, struct timeval *timeout) FD_ZERO(&rfds); FD_SET(info->listen_sock, &rfds); - n = select(info->listen_sock + 1, &rfds, NULL, NULL, timeout); + n = _select_retry(info->listen_sock + 1, &rfds, NULL, NULL, timeout); if (n <= 0) return n;