diff options
| author | Nakidai <nakidai@disroot.org> | 2026-01-06 04:01:24 +0300 |
|---|---|---|
| committer | Nakidai <nakidai@disroot.org> | 2026-01-06 04:01:24 +0300 |
| commit | 833c53b1ad3338677056445c32c490cac0a08875 (patch) | |
| tree | 24e60715c46ff89c26c5efc254e036b84aebcb13 /loop.c | |
| parent | 78426afe18d9ce730a4d92033ca261f9b2f173a0 (diff) | |
| download | libreircd-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.c | 74 |
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; } } |