summary refs log tree commit diff
path: root/loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'loop.c')
-rw-r--r--loop.c39
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;
 }