summary refs log tree commit diff
path: root/bounce.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-10-31 17:51:27 -0400
committerJune McEnroe <june@causal.agency>2019-10-31 17:51:27 -0400
commit0e4973936b8d0884f7ab4bc3a2c3e68aba371e46 (patch)
tree68fba322c3194f73ef11d548a508f5a06c5cd81e /bounce.c
parentClear passwords from memory with memset_s (diff)
downloadpounce-0e4973936b8d0884f7ab4bc3a2c3e68aba371e46.tar.gz
pounce-0e4973936b8d0884f7ab4bc3a2c3e68aba371e46.zip
Iterator over pollfds in reverse
This has two advantages:

1. When removing a client, we don't need to break the loop, since the
   swap-remove will replace the current pollfd with one we've already
   handled and we can safely move on to the next (previous) one.
2. If a new client connects for the same consumer (for example if the
   previous one is going to time out), it will start consuming messages
   for that consumer, rather than them being sent to the old client.
Diffstat (limited to 'bounce.c')
-rw-r--r--bounce.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/bounce.c b/bounce.c
index cc6b34f..18b205e 100644
--- a/bounce.c
+++ b/bounce.c
@@ -232,7 +232,7 @@ int main(int argc, char *argv[]) {
 		}
 
 		if (nfds < 0) continue;
-		for (size_t i = 0; i < event.len; ++i) {
+		for (size_t i = event.len - 1; i < event.len; --i) {
 			short revents = event.fds[i].revents;
 			if (!revents) continue;
 
@@ -268,7 +268,6 @@ int main(int argc, char *argv[]) {
 				close(event.fds[i].fd);
 				eventRemove(i);
 				if (!--clients) serverFormat("AWAY :%s\r\n", away);
-				break;
 			}
 		}