summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2014-08-09 22:57:29 +0200
committerPřemysl Janouch <p.janouch@gmail.com>2014-08-09 23:10:35 +0200
commit266626584d386680177add4ec2c35e69add2fc03 (patch)
tree5a1cda906836f2296f71958eadc3aa26c78d85ca /src
parent9d86d81851ae5a66a5465bb5e65b5083591f20ab (diff)
downloadxK-266626584d386680177add4ec2c35e69add2fc03.tar.gz
xK-266626584d386680177add4ec2c35e69add2fc03.tar.xz
xK-266626584d386680177add4ec2c35e69add2fc03.zip
kike: fix `struct channel_user'
Storing the nickname instead of a reference to `struct client' didn't play well with nickname changes. The client needs to be unlinked from any channels before his object can be deleted, anyway.
Diffstat (limited to 'src')
-rw-r--r--src/kike.c35
1 files changed, 15 insertions, 20 deletions
diff --git a/src/kike.c b/src/kike.c
index 2ffdadd..18a906f 100644
--- a/src/kike.c
+++ b/src/kike.c
@@ -349,7 +349,7 @@ struct channel_user
LIST_HEADER (channel_user)
unsigned modes;
- char nickname[];
+ struct client *c;
};
struct channel
@@ -554,17 +554,16 @@ static struct channel_user *
channel_get_user (const struct channel *chan, const struct client *c)
{
for (struct channel_user *iter = chan->users; iter; iter = iter->next)
- if (!irc_strcmp (iter->nickname, c->nickname))
+ if (iter->c == c)
return iter;
return NULL;
}
static struct channel_user *
-channel_add_user (struct channel *chan, const struct client *c)
+channel_add_user (struct channel *chan, struct client *c)
{
- size_t nick_len = strlen (c->nickname);
- struct channel_user *link = xcalloc (1, sizeof *link + nick_len + 1);
- memcpy (link->nickname, c->nickname, nick_len + 1);
+ struct channel_user *link = xcalloc (1, sizeof *link);
+ link->c = c;
LIST_PREPEND (chan->users, link);
return link;
}
@@ -665,8 +664,8 @@ client_send_to_roommates (struct client *c, const char *message)
// When we're unregistering, the str_map_find() will return zero,
// which will prevent sending the QUIT message to ourselves.
for (struct channel_user *iter = chan->users; iter; iter = iter->next)
- str_map_set (&targets, iter->nickname,
- str_map_find (&c->ctx->users, iter->nickname));
+ str_map_set (&targets, iter->c->nickname,
+ str_map_find (&c->ctx->users, iter->c->nickname));
}
str_map_iter_init (&iter, &targets);
@@ -1333,9 +1332,8 @@ irc_channel_multicast (struct channel *chan, const char *message,
{
for (struct channel_user *iter = chan->users; iter; iter = iter->next)
{
- struct client *c = str_map_find (&chan->ctx->users, iter->nickname);
- if (c != except)
- irc_send (c, "%s", message);
+ if (iter->c != except)
+ irc_send (iter->c, "%s", message);
}
}
@@ -1496,7 +1494,7 @@ irc_handle_chan_mode_change (struct client *c,
else if (irc_modify_mode (&target_user->modes, (mode), adding)) \
{ \
str_append_c (output, mode_char); \
- str_vector_add (output_params, target_user->nickname); \
+ str_vector_add (output_params, client->nickname); \
}
#define HANDLE_LIST(list, list_msg, end_msg) \
@@ -1842,8 +1840,7 @@ irc_send_rpl_namreply (struct client *c, const struct channel *chan)
bool on_channel = channel_get_user (chan, c);
for (struct channel_user *iter = chan->users; iter; iter = iter->next)
{
- struct client *target = str_map_find (&c->ctx->users, iter->nickname);
- if (!on_channel && (target->mode & IRC_USER_MODE_INVISIBLE))
+ if (!on_channel && (iter->c->mode & IRC_USER_MODE_INVISIBLE))
continue;
struct str result;
@@ -1852,7 +1849,7 @@ irc_send_rpl_namreply (struct client *c, const struct channel *chan)
str_append_c (&result, '@');
else if (iter->modes & IRC_CHAN_MODE_VOICE)
str_append_c (&result, '+');
- str_append (&result, target->nickname);
+ str_append (&result, iter->c->nickname);
str_vector_add_owned (&nicks, str_steal (&result));
}
@@ -1989,11 +1986,9 @@ irc_handle_who (const struct irc_message *msg, struct client *c)
for (struct channel_user *iter = chan->users;
iter; iter = iter->next)
{
- struct client *target =
- str_map_find (&c->ctx->users, iter->nickname);
- if ((on_chan || !(target->mode & IRC_USER_MODE_INVISIBLE))
- && (!only_ops || (target->mode & IRC_USER_MODE_OPERATOR)))
- irc_send_rpl_whoreply (c, chan, target);
+ if ((on_chan || !(iter->c->mode & IRC_USER_MODE_INVISIBLE))
+ && (!only_ops || (iter->c->mode & IRC_USER_MODE_OPERATOR)))
+ irc_send_rpl_whoreply (c, chan, iter->c);
}
}
else