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. --- loop.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'loop.c') diff --git a/loop.c b/loop.c index 81ff25d..9e91438 100644 --- a/loop.c +++ b/loop.c @@ -123,19 +123,18 @@ loop: 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 - ); + if (peers[i].type) + 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) + if (peers[i].type) 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) @@ -143,17 +142,16 @@ loop: { writef( peers[j].fd, - "%s!%s@%s QUIT", + ":%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]; + user_remove(i); i = 0; } goto loop; -- cgit 1.4.1