summary refs log tree commit diff
path: root/loop.c
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2026-02-01 19:01:04 +0300
committerNakidai <nakidai@disroot.org>2026-02-01 19:05:43 +0300
commitac52bbe3427cda3bd2098ee35e06163885b21836 (patch)
tree51387c4d5f8ebd56c19a345b2e34361c979579c8 /loop.c
parent32e81cb7a0d4f4b1b24674439e5a948b39725f2e (diff)
downloadlibreircd-ac52bbe3427cda3bd2098ee35e06163885b21836.tar.gz
libreircd-ac52bbe3427cda3bd2098ee35e06163885b21836.zip
Refactor QUIT message sending
After seeing same announcing code second time I decided it should be
done before an actual quit in loop.c. Plus, channel exiting is now done
in user_remove().
Diffstat (limited to 'loop.c')
-rw-r--r--loop.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/loop.c b/loop.c
index 46c585c..c568c6f 100644
--- a/loop.c
+++ b/loop.c
@@ -16,11 +16,11 @@
 
 #include "ircd.h"
 
-#include <string.h>
-
 #include <err.h>
 #include <poll.h>
 #include <signal.h>
+#include <stdio.h>
+#include <string.h>
 #include <time.h>
 #include <unistd.h>
 
@@ -131,19 +131,31 @@ loop:
 		}
 		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,
+			snprintf(
+				peers[i].quit,
+				sizeof(PEER_QUIT_MAX),
+				"Ping Timeout (%llu seconds)",
 				now - peers[i].ping
 			);
 			peers[i].flags |= DELETE;
 		}
 		if (peers[i].flags & DELETE)
 		{
-			writef(peers[i].fd, "ERROR :Closing Link: %s", peers[i].host);
+			if (peers[i].type)
+				announce(
+					&peers[i],
+					":%s!%s@%s QUIT :%s",
+					getnick(&peers[i]),
+					peers[i].user,
+					peers[i].host,
+					peers[i].quit
+				);
+			writef(
+				peers[i].fd,
+				"ERROR :Closing Link: %s (%s)",
+				peers[i].host,
+				peers[i].quit
+			);
 			close(peers[i].fd);
 			user_remove(i);
 			--i;