diff options
| author | Nakidai <nakidai@disroot.org> | 2026-02-01 18:09:54 +0300 |
|---|---|---|
| committer | Nakidai <nakidai@disroot.org> | 2026-02-01 18:09:54 +0300 |
| commit | f47f9d10f8aa3ace1f2d93d0aa6ab090f782328b (patch) | |
| tree | 44e49c0f2a98e6ba90d7ec79591e51bfd7719a93 /loop.c | |
| parent | 62869d341d2a4e959b60865076287701694859dd (diff) | |
| download | libreircd-f47f9d10f8aa3ace1f2d93d0aa6ab090f782328b.tar.gz libreircd-f47f9d10f8aa3ace1f2d93d0aa6ab090f782328b.zip | |
Add ping system
Now users will be kicked for inactivity o.o
Diffstat (limited to 'loop.c')
| -rw-r--r-- | loop.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/loop.c b/loop.c index fdb2e66..46c585c 100644 --- a/loop.c +++ b/loop.c @@ -21,6 +21,7 @@ #include <err.h> #include <poll.h> #include <signal.h> +#include <time.h> #include <unistd.h> #include <arpa/inet.h> @@ -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; } |