From f47f9d10f8aa3ace1f2d93d0aa6ab090f782328b Mon Sep 17 00:00:00 2001 From: Nakidai Date: Sun, 1 Feb 2026 18:09:54 +0300 Subject: Add ping system Now users will be kicked for inactivity o.o --- loop.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'loop.c') diff --git a/loop.c b/loop.c index fdb2e66..46c585c 100644 --- a/loop.c +++ b/loop.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ ircd(void) int res, sfd, client; nfds_t passed; ssize_t recvd; + time_t now; addr.sin_family = PF_INET; addr.sin_port = htons(port); @@ -75,7 +77,7 @@ loop: .fd = peers[i].fd, .events = POLLIN, }; - res = poll(pfd, (passed = peers_c) + 1, -1); + res = poll(pfd, (passed = peers_c) + 1, POLL_TIMEOUT); if (res == -1) err(1, "poll()"); @@ -95,7 +97,7 @@ loop: } else { - peers[peers_c++] = (struct Peer){ .fd = client }; + peers[peers_c++] = (struct Peer){ .fd = client, .last = time(NULL) }; strlcpy( peers[peers_c - 1].host, inet_ntoa(clientaddr.sin_addr), @@ -109,6 +111,7 @@ loop: if (!(pfd[i].revents & POLLIN)) continue; + time(&peers[i].last); recvd = read( peers[i].fd, peers[i].buf + peers[i].recvd, @@ -120,13 +123,31 @@ loop: } for (i = 0; i < peers_c; ++i) { - if (!(peers[i].flags & DELETE)) - continue; - - writef(peers[i].fd, "ERROR :Closing Link: %s", peers[i].host); - close(peers[i].fd); - user_remove(i); - --i; + time(&now); + if (!peers[i].ping && now - peers[i].last > PEER_PINGTIMEOUT) + { + writef(peers[i].fd, "PING :%s", hostname); + peers[i].ping = now; + } + if (peers[i].ping && now - peers[i].ping > PEER_PONGTIMEOUT) + { + announce( + &peers[i], + ":%s!%s@%s QUIT :Ping Timeout (%llu seconds)", + getnick(&peers[i]), + peers[i].user, + peers[i].host, + now - peers[i].ping + ); + peers[i].flags |= DELETE; + } + if (peers[i].flags & DELETE) + { + writef(peers[i].fd, "ERROR :Closing Link: %s", peers[i].host); + close(peers[i].fd); + user_remove(i); + --i; + } } goto loop; } -- cgit 1.4.1