/* * Copyright (c) 2026 Nakidai Perumenei * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "ircd.h" #include #include #include #include #include const char * getnick(const struct Peer *peer) { return *peer->nick ? peer->nick : "*"; } enum PeerMode user_mode(char m) { switch (m) { case 'a': return AWAY; case 'i': return INVISIBLE; case 'w': return WALLOPS; case 'r': return RESTRICTED; case 'o': return OPER; case 'O': return LOCALOPER; case 's': return SNOTICE; default: return 0; } } void user_reg(struct Peer *peer, const char *nick, const char *user, const char *real, const char *mode) { unsigned long m; const char *p; if (nick) strlcpy(peer->nick, nick, sizeof(peer->nick)); if (user) strlcpy(peer->user, user, sizeof(peer->user)); if (real) strlcpy(peer->real, real, sizeof(peer->real)); if (mode) { errno = 0; m = strtoul(mode, &p, 10); if (errno || *p) goto skip; if (m & 8) peer->modes |= INVISIBLE; if (m & 4) peer->modes |= WALLOPS; } skip: if (*peer->nick && *peer->user && *peer->real) { peer->type = CLIENT; 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]; }