From 833c53b1ad3338677056445c32c490cac0a08875 Mon Sep 17 00:00:00 2001 From: Nakidai Date: Tue, 6 Jan 2026 04:01:24 +0300 Subject: Add basic channels Though they don't have modes, and JOIN/PART must be able to parse comma separated list of channels --- loop.c | 74 +++++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 23 deletions(-) (limited to 'loop.c') diff --git a/loop.c b/loop.c index ba14a4d..b2430b8 100644 --- a/loop.c +++ b/loop.c @@ -29,9 +29,9 @@ #include -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; } } -- cgit 1.4.1