From e6ca38288f38707fda5f29f5308d089a54551110 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Mon, 11 May 2020 16:36:31 -0400 Subject: Check signals after handling ready sockets In the case where a signal arrives while handling a ready socket, it should be handled as soon as possible, rather than waiting for poll to return again. Signals will still be handled immediately if poll returns -1 due to EINTR. --- bounce.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/bounce.c b/bounce.c index 1aae7a3..21355ea 100644 --- a/bounce.c +++ b/bounce.c @@ -458,26 +458,19 @@ int main(int argc, char *argv[]) { eventAdd(server, NULL); for (;;) { - int nfds = poll(event.fds, event.len, -1); - if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll"); - if (signals[SIGINT] || signals[SIGTERM]) break; - - if (signals[SIGINFO]) { - ringInfo(); - signals[SIGINFO] = 0; + for (size_t i = binds + 1; i < event.len; ++i) { + assert(event.clients[i]); + if (clientDiff(event.clients[i])) { + event.fds[i].events |= POLLOUT; + } else { + event.fds[i].events &= ~POLLOUT; + } } - if (signals[SIGUSR1]) { - cert = splitOpen(certSplit); - priv = splitOpen(privSplit); - localConfig(cert, priv, localCA, !clientPass); - fclose(cert); - fclose(priv); - signals[SIGUSR1] = 0; - } + int nfds = poll(event.fds, event.len, -1); + if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll"); - if (nfds < 0) continue; - for (size_t i = event.len - 1; i < event.len; --i) { + for (size_t i = event.len - 1; nfds > 0 && i < event.len; --i) { short revents = event.fds[i].revents; if (!revents) continue; @@ -514,13 +507,20 @@ int main(int argc, char *argv[]) { } } - for (size_t i = binds + 1; i < event.len; ++i) { - assert(event.clients[i]); - if (clientDiff(event.clients[i])) { - event.fds[i].events |= POLLOUT; - } else { - event.fds[i].events &= ~POLLOUT; - } + if (signals[SIGINT] || signals[SIGTERM]) break; + + if (signals[SIGINFO]) { + ringInfo(); + signals[SIGINFO] = 0; + } + + if (signals[SIGUSR1]) { + cert = splitOpen(certSplit); + priv = splitOpen(privSplit); + localConfig(cert, priv, localCA, !clientPass); + fclose(cert); + fclose(priv); + signals[SIGUSR1] = 0; } } -- cgit 1.4.1