about summary refs log tree commit diff
path: root/loop.c
diff options
context:
space:
mode:
authorNakidai <nakidai@disroot.org>2026-01-06 04:01:24 +0300
committerNakidai <nakidai@disroot.org>2026-01-06 04:01:24 +0300
commit833c53b1ad3338677056445c32c490cac0a08875 (patch)
tree24e60715c46ff89c26c5efc254e036b84aebcb13 /loop.c
parent78426afe18d9ce730a4d92033ca261f9b2f173a0 (diff)
downloadlibreircd-833c53b1ad3338677056445c32c490cac0a08875.tar.gz
libreircd-833c53b1ad3338677056445c32c490cac0a08875.zip
Add basic channels
Though they don't have modes, and JOIN/PART must be able to parse
comma separated list of channels
Diffstat (limited to 'loop.c')
-rw-r--r--loop.c74
1 files changed, 51 insertions, 23 deletions
diff --git a/loop.c b/loop.c
index ba14a4d..b2430b8 100644
--- a/loop.c
+++ b/loop.c
@@ -29,9 +29,9 @@
 #include <sys/types.h>
 
 
-struct Peer peers[PEERS_MAX];
 static struct pollfd pfd[PEERS_MAX + 1];
-static size_t remove_schedule[PEERS_MAX];
+struct Peer peers[PEERS_MAX];
+size_t peers_c;
 
 const char *host;
 int port;
@@ -39,7 +39,7 @@ int port;
 void
 ircd(void)
 {
-	size_t i, schedulei, connected, pid;
+	size_t i, j, k;
 	struct sockaddr_in addr, clientaddr;
 	int res, sfd, client;
 	nfds_t passed;
@@ -51,9 +51,7 @@ ircd(void)
 	res = inet_pton(AF_INET, host, &addr.sin_addr);
 	if (res == -1)
 		err(1, "inet_pton()");
-
-	sfd = socket(AF_INET, SOCK_STREAM, 0);
-	if (sfd == -1)
+	sfd = socket(AF_INET, SOCK_STREAM, 0); if (sfd == -1)
 		err(1, "socket()");
 
 	res = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
@@ -69,27 +67,27 @@ ircd(void)
 		err(1, "listen()");
 
 	signal(SIGPIPE, SIG_IGN);
-	for (connected = 0;;schedulei = 0)
+	for (peers_c = channels_c = 0;;)
 	{
-		pfd[connected] = (struct pollfd){ .fd = sfd, .events = POLLIN };
-		for (i = 0; i < connected; ++i)
+		pfd[peers_c] = (struct pollfd){ .fd = sfd, .events = POLLIN };
+		for (i = 0; i < peers_c; ++i)
 			pfd[i] = (struct pollfd)
 			{
 				.fd = peers[i].fd,
 				.events = POLLIN,
 			};
-		res = poll(pfd, (passed = connected) + 1, -1);
+		res = poll(pfd, (passed = peers_c) + 1, -1);
 		if (res == -1)
 			err(1, "poll()");
 
-		if (pfd[connected].revents & POLLIN)
+		if (pfd[peers_c].revents & POLLIN)
 		{
 			client = accept(sfd, (void *)&clientaddr, &(int){sizeof(clientaddr)});
 			if (client == -1)
 			{
-				warn("accept(sfd)");
+				warn("accept(%d)", sfd);
 			}
-			else if (connected == PEERS_MAX)
+			else if (peers_c == PEERS_MAX)
 			{
 				/*
 				 * TODO: maybe send 005 or smth?
@@ -98,9 +96,9 @@ ircd(void)
 			}
 			else
 			{
-				peers[connected++] = (struct Peer){ .fd = client };
+				peers[peers_c++] = (struct Peer){ .fd = client };
 				strlcpy(
-					peers[connected - 1].host,
+					peers[peers_c - 1].host,
 					inet_ntoa(clientaddr.sin_addr),
 					sizeof(peers->host)
 				);
@@ -119,16 +117,46 @@ ircd(void)
 			);
 			peers[i].recvd += recvd;
 			if (recvd == -1 || !recvd || handle(&peers[i]))
-				remove_schedule[schedulei++] = i;
+				peers[i].flags |= DELETE;
 		}
-		for (i = 0; i < schedulei; ++i)
+		for (i = 0; i < peers_c; ++i)
 		{
-			pid = remove_schedule[i];
-			/* TODO: announce_quit(&peers[pid]); */
-			writef(peers[pid].fd, "ERROR :Closing Link: %s", peers[pid].host);
-			close(peers[pid].fd);
-			peers[pid] = peers[--connected];
+			if (!(peers[i].flags & DELETE))
+				continue;
+
+			if (!peers[i].type)
+				goto skip;
+			writef(
+				peers[i].fd,
+				":%s!%s@%s QUIT",
+				getnick(&peers[i]),
+				peers[i].user,
+				peers[i].host
+			);
+			for (j = 0; j < peers[i].channels_c; ++j)
+			{
+				channel_exit(peers[i].channels[j], &peers[i]);
+				for (k = 0; k < peers[i].channels[j]->users_c; ++k)
+					peers[i].channels[j]->users[k]->
+						flags |= ANNOUNCE;
+			}
+			for (j = 0; j < peers_c; ++j)
+				if (peers[j].flags & ANNOUNCE)
+				{
+					writef(
+						peers[j].fd,
+						"%s!%s@%s QUIT",
+						getnick(&peers[i]),
+						peers[i].user,
+						peers[i].host
+					);
+					peers[j].flags &= ~ANNOUNCE;
+				}
+skip:
+			writef(peers[i].fd, "ERROR :Closing Link: %s", peers[i].host);
+			close(peers[i].fd);
+			peers[i] = peers[--peers_c];
+			i = 0;
 		}
-		schedulei = 0;
 	}
 }