From 63c0a8860459c0c9bf3b66d4d4ec631ece4bf56e Mon Sep 17 00:00:00 2001 From: Nakidai Date: Wed, 7 Jan 2026 00:26:37 +0300 Subject: Fix user quit When user A leaves, last user in the peer list B is copied into the space left by leaving A. But, besides that it also important to not forget that there can be channels containing B: they store a link to every user belonging. So, it's important to adjust all links to B iterating every channel B belongs to. --- user.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'user.c') diff --git a/user.c b/user.c index e37452b..f856f6c 100644 --- a/user.c +++ b/user.c @@ -16,8 +16,11 @@ #include "ircd.h" +#include #include +#include + const char * getnick(const struct Peer *peer) @@ -40,3 +43,31 @@ user_reg(struct Peer *peer, const char *nick, const char *user, const char *real reply(peer, 1); } } + +void +user_remove(size_t pid) +{ + size_t i, j; + + for (i = 0; i < peers[peers_c-1].channels_c; ++i) + { + for (j = 0; j < peers[peers_c-1].channels[i]->users_c; ++j) + if (peers[peers_c-1].channels[i]->users[j]->fd == peers[peers_c-1].fd) + break; + if (j == peers[peers_c-1].channels[i]->users_c) + { + warnx( + "user_unlink(): %s@%s doesn't belong to %s, " + "though they believe in the opposite", + getnick(&peers[peers_c-1]), + peers[peers_c-1].host, + peers[peers_c-1].channels[i]->name + ); + continue; + } + + peers[peers_c-1].channels[i]->users[j] = &peers[pid]; + } + + peers[pid] = peers[--peers_c]; +} -- cgit 1.4.1