diff options
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; } |