From a4a76a4d7a7281fff4a8b4ad8b1a3e5e39d51c49 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Fri, 25 Oct 2019 18:23:30 -0400 Subject: Clean up event loop --- bounce.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'bounce.c') diff --git a/bounce.c b/bounce.c index ad346a0..a167cea 100644 --- a/bounce.c +++ b/bounce.c @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -120,10 +121,7 @@ int main(int argc, char *argv[]) { int server = serverConnect(host, port); serverLogin(pass, auth, nick, user, real); - - while (!stateReady()) { - serverRecv(); - } + while (!stateReady()) serverRecv(); if (join) serverFormat("JOIN :%s\r\n", join); for (size_t i = 0; i < binds; ++i) { @@ -135,22 +133,30 @@ int main(int argc, char *argv[]) { while (0 < poll(event.fds, event.len, -1)) { for (size_t i = 0; i < event.len; ++i) { - if (!event.fds[i].revents) continue; + short revents = event.fds[i].revents; + if (!revents) continue; + if (i < binds) { int fd; struct tls *tls = listenAccept(&fd, event.fds[i].fd); eventAdd(fd, clientAlloc(tls)); continue; } + if (!event.clients[i]) { - serverRecv(); + if (revents & POLLIN) { + serverRecv(); + } else { + errx(EX_UNAVAILABLE, "server hung up"); + } continue; } - short revents = event.fds[i].revents; + struct Client *client = event.clients[i]; if (revents & POLLIN) clientRecv(client); if (revents & POLLOUT) clientConsume(client); if (clientError(client) || revents & (POLLHUP | POLLERR)) { + // TODO: Set AWAY if no more clients remain. clientFree(client); close(event.fds[i].fd); eventRemove(i); @@ -158,8 +164,8 @@ int main(int argc, char *argv[]) { } } - for (size_t i = 0; i < event.len; ++i) { - if (!event.clients[i]) continue; + 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 { -- cgit 1.4.1