diff options
| -rw-r--r-- | channel.c | 28 | ||||
| -rw-r--r-- | config.h | 2 | ||||
| -rw-r--r-- | handle.c | 4 | ||||
| -rw-r--r-- | ircd.h | 12 | ||||
| -rw-r--r-- | user.c | 12 | ||||
| -rw-r--r-- | writef.c | 10 |
6 files changed, 36 insertions, 32 deletions
diff --git a/channel.c b/channel.c index 94b0d6c..21a777a 100644 --- a/channel.c +++ b/channel.c @@ -28,12 +28,12 @@ size_t channels_c; int channel_join(struct Channel *channel, struct Peer *peer) { - if (channel->users_c == lengthof(channel->users) + if (channel->peers_c == lengthof(channel->peers) || peer->channels_c == lengthof(peer->channels)) return 1; peer->channels[peer->channels_c++] = channel; - channel->users[channel->users_c++] = peer; + channel->peers[channel->peers_c++].p = peer; writechanf( 0, channel, @@ -51,11 +51,11 @@ channel_exit(struct Channel *channel, struct Peer *peer) { size_t i; - for (i = 0; i < channel->users_c; ++i) - if (channel->users[i]->fd == peer->fd) + for (i = 0; i < channel->peers_c; ++i) + if (channel->peers[i].p->fd == peer->fd) break; - ensure(i != channel->users_c, (void)0, 1); - channel->users[i] = channel->users[--channel->users_c]; + ensure(i != channel->peers_c, (void)0, 1); + channel->peers[i] = channel->peers[--channel->peers_c]; for (i = 0; i < peer->channels_c; ++i) if (!strcmp(peer->channels[i]->name, channel->name)) @@ -65,7 +65,7 @@ channel_exit(struct Channel *channel, struct Peer *peer) ), 1) peer->channels[i] = peer->channels[--peer->channels_c]; - if (!channel->users_c) + if (!channel->peers_c) { for (i = 0; i < channels_c; ++i) if (!strcmp(channels[i].name, channel->name)) @@ -86,24 +86,24 @@ channel_remove(size_t cid) size_t i, j; tofix = &channels[channels_c-1]; - for (i = 0; i < tofix->users_c; ++i) + for (i = 0; i < tofix->peers_c; ++i) { - for (j = 0; j < tofix->users[i]->channels_c; ++j) - if (!strcmp(tofix->users[i]->channels[j]->name, tofix->name)) + for (j = 0; j < tofix->peers[i].p->channels_c; ++j) + if (!strcmp(tofix->peers[i].p->channels[j]->name, tofix->name)) break; - if (j == tofix->users[i]->channels_c) + if (j == tofix->peers[i].p->channels_c) { warnx( "channel_remove(): %s doesn't belong to %s@%s, " "though they believe in the opposite", tofix->name, - getnick(tofix->users[i]), - tofix->users[i]->host + getnick(tofix->peers[i].p), + tofix->peers[i].p->host ); continue; } - tofix->users[i]->channels[j] = &channels[cid]; + tofix->peers[i].p->channels[j] = &channels[cid]; } channels[cid] = channels[--channels_c]; diff --git a/config.h b/config.h index 965d835..ec49704 100644 --- a/config.h +++ b/config.h @@ -27,7 +27,7 @@ #define OPERS_MAX 8 #define CHANNELS_MAX 100 -#define CHANNEL_USERS_MAX 100 +#define CHANNEL_PEERS_MAX 100 #define CHANNEL_MODES_MAX 50 #define CHANNEL_NAME_MAX 64 diff --git a/handle.c b/handle.c index c760144..75d42a9 100644 --- a/handle.c +++ b/handle.c @@ -124,9 +124,9 @@ names(struct Message *msg, struct Peer *peer) continue; memset(buf, 0, sizeof(buf)); - for (j = 0; j < peer->channels[i]->users_c; ++j) + for (j = 0; j < peer->channels[i]->peers_c; ++j) { - strlcat(buf, peer->channels[i]->users[j]->nick, sizeof(buf)); + strlcat(buf, peer->channels[i]->peers[j].p->nick, sizeof(buf)); if (strlen(buf) >= MESSAGE_MAX - 4*PEER_NICK_MAX) { reply(peer, 353, peer->channels[i]->name, buf); diff --git a/ircd.h b/ircd.h index d05614c..0959d12 100644 --- a/ircd.h +++ b/ircd.h @@ -66,11 +66,13 @@ struct Channel enum { GLOBAL, LOCAL, MODELESS, SAFE } type; char name[CHANNEL_NAME_MAX]; struct { - char mode; - char param[MESSAGE_MAX - 1]; - } modes[CHANNEL_MODES_MAX]; - struct Peer *users[CHANNEL_USERS_MAX]; - size_t modes_c, users_c; + struct Peer *p; + enum ChannelPeerMode { + BIT(CHANNEL_OPER), + BIT(CHANNEL_VOICE), + } modes; + } peers[CHANNEL_PEERS_MAX]; + size_t modes_c, peers_c; }; struct Oper diff --git a/user.c b/user.c index 719c60e..5d9bc15 100644 --- a/user.c +++ b/user.c @@ -88,17 +88,19 @@ skip: void user_remove(size_t pid) { + struct Peer *last; size_t i, j; for (i = 0; i < peers[pid].channels_c; ++i) channel_exit(peers[pid].channels[i], &peers[pid]); - for (i = 0; i < peers[peers_c-1].channels_c; ++i) + last = &peers[peers_c-1]; + for (i = 0; i < last->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) + for (j = 0; j < last->channels[i]->peers_c; ++j) + if (last->channels[i]->peers[j].p->fd == last->fd) break; - if (j == peers[peers_c-1].channels[i]->users_c) + if (j == last->channels[i]->peers_c) { warnx( "user_unlink(): %s@%s doesn't belong to %s, " @@ -110,7 +112,7 @@ user_remove(size_t pid) continue; } - peers[peers_c-1].channels[i]->users[j] = &peers[pid]; + last->channels[i]->peers[j].p = &peers[pid]; } peers[pid] = peers[--peers_c]; diff --git a/writef.c b/writef.c index 51346d9..a2283b9 100644 --- a/writef.c +++ b/writef.c @@ -59,9 +59,9 @@ writechanf(const struct Peer *except, const struct Channel *channel, const char va_end(args); count = 0; - for (i = 0; i < channel->users_c; ++i) - if (!except || channel->users[i]->fd != except->fd) - count += write(channel->users[i]->fd, buf, written) == written; + for (i = 0; i < channel->peers_c; ++i) + if (!except || channel->peers[i].p->fd != except->fd) + count += write(channel->peers[i].p->fd, buf, written) == written; return count; } @@ -83,8 +83,8 @@ announce(struct Peer *peer, const char *fmt, ...) } for (i = 0; i < peer->channels_c; ++i) - for (j = 0; j < peer->channels[i]->users_c; ++j) - peer->channels[i]->users[j]->flags |= ANNOUNCE; + for (j = 0; j < peer->channels[i]->peers_c; ++j) + peer->channels[i]->peers[j].p->flags |= ANNOUNCE; for (i = 0; i < peers_c; ++i) if (peers[i].flags & ANNOUNCE) |