From: Entrope Date: Wed, 10 Mar 2004 17:03:30 +0000 (+0000) Subject: Further cleanups and bugfixes X-Git-Tag: v1.4.0-rc1~251 X-Git-Url: http://git.pk910.de/?a=commitdiff_plain;h=aade06878c014cae4f34d5ab1e63789faf51c6a2;p=srvx.git Further cleanups and bugfixes * Remove "TODO: reimplement" comment in chanserv.c, since all the functions were already reimplemented. * Make "/msg ChanServ huggle" work again. * Fix error messages when bad target names given to say and emote. * If we get a MODE change affecting a user who somehow quit already, just ignore it. * Add debugging checks for mod_chanmode argument counts. git-archimport-id: srvx@srvx.net--2004-srvx/srvx--devo--1.3--patch-25 --- diff --git a/src/chanserv.c b/src/chanserv.c index 7b3f372..61f5585 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -1238,8 +1238,7 @@ expire_ban(void *data) struct mod_chanmode change; unsigned int ii; bans = bd->channel->channel->banlist; - change.modes_set = change.modes_clear = 0; - change.argc = 0; + mod_chanmode_init(&change); for(ii=0; iiban, bd->mask)) @@ -1880,7 +1879,7 @@ static CHANSERV_FUNC(cmd_move) else if(!IsSuspended(channel->channel_info)) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = AddChannelUser(chanserv, target); @@ -2142,7 +2141,7 @@ static CHANSERV_FUNC(cmd_opchan) return 0; } channel->channel_info->may_opchan = 0; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = GetUserMode(channel, chanserv); @@ -2480,7 +2479,7 @@ static CHANSERV_FUNC(cmd_up) struct userData *uData; const char *errmsg; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].member = GetUserMode(channel, user); if(!change.args[0].member) @@ -2522,7 +2521,7 @@ static CHANSERV_FUNC(cmd_down) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].member = GetUserMode(channel, user); if(!change.args[0].member) @@ -4324,7 +4323,7 @@ static CHANSERV_FUNC(cmd_say) } else { - reply("You must specify the name of a channel or user."); + reply("MSG_NOT_TARGET_NAME"); return 0; } return 1; @@ -4347,7 +4346,7 @@ static CHANSERV_FUNC(cmd_emote) } else { - reply("You must specify the name of a channel or user."); + reply("MSG_NOT_TARGET_NAME"); return 0; } return 1; @@ -4379,7 +4378,7 @@ chanserv_expire_suspension(void *data) channel = suspended->cData->channel; suspended->cData->channel = channel; suspended->cData->flags &= ~CHANNEL_SUSPENDED; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = AddChannelUser(chanserv, channel); @@ -4886,35 +4885,6 @@ static MODCMD_FUNC(chan_opt_dynlimit) CHANNEL_BINARY_OPTION("CSMSG_SET_DYNLIMIT", CHANNEL_DYNAMIC_LIMIT); } -/* TODO: reimplement - -static MODCMD_FUNC(chan_opt_userinfo) -{ - CHANNEL_BINARY_OPTION("CSMSG_SET_USERINFO", CHANNEL_INFO_LINES); -} - -static MODCMD_FUNC(chan_opt_voice) -{ - CHANNEL_BINARY_OPTION("CSMSG_SET_VOICE", CHANNEL_VOICE_ALL); -} - -static MODCMD_FUNC(chan_opt_topicsnarf) -{ - if((argc > 0) && !check_user_level(channel, user, lvlEnfTopic, 1, 0)) - { - reply("CSMSG_TOPIC_LOCKED", channel->name); - return 0; - } - CHANNEL_BINARY_OPTION("CSMSG_SET_TOPICSNARF", CHANNEL_TOPIC_SNARF); -} - -static MODCMD_FUNC(chan_opt_peoninvite) -{ - CHANNEL_BINARY_OPTION("CSMSG_SET_PEONINVITE", CHANNEL_PEON_INVITE); -} - -*/ - static MODCMD_FUNC(chan_opt_defaults) { struct userData *uData; @@ -5644,20 +5614,11 @@ static CHANSERV_FUNC(cmd_d) static CHANSERV_FUNC(cmd_huggle) { - char response[MAXLEN]; - const char *fmt; /* CTCP must be via PRIVMSG, never notice */ if(channel) - { - fmt = user_find_message(user, "CSMSG_HUGGLES_HIM"); - sprintf(response, fmt, user->nick); - irc_privmsg(cmd->parent->bot, channel->name, response); - } + send_target_message(1, channel->name, cmd->parent->bot, "CSMSG_HUGGLES_HIM", user->nick); else - { - fmt = user_find_message(user, "CSMSG_HUGGLES_YOU"); - irc_privmsg(cmd->parent->bot, user->nick, fmt); - } + send_target_message(1, user->nick, cmd->parent->bot, "CSMSG_HUGGLES_YOU"); return 1; } @@ -5682,10 +5643,9 @@ chanserv_adjust_limit(void *data) return; } + mod_chanmode_init(&change); change.modes_set = MODE_LIMIT; - change.modes_clear = 0; change.new_limit = limit; - change.argc = 0; mod_chanmode_announce(chanserv, channel, &change); } @@ -5750,7 +5710,7 @@ handle_join(struct modeNode *mNode) } } - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; if(channel->banlist.used < MAXBANS) { @@ -5885,7 +5845,7 @@ handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) if(!user->handle_info) return; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; for(channel = user->handle_info->channels; channel; channel = channel->u_next) { @@ -6133,7 +6093,7 @@ handle_nick_change(struct userNode *user, UNUSED_ARG(const char *old_nick)) unsigned int ii, jj; char kick_reason[MAXLEN]; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_BAN; for(ii = 0; ii < user->channels.used; ++ii) @@ -6631,7 +6591,7 @@ chanserv_channel_read(const char *key, struct record_data *hir) if(!(cData->flags & CHANNEL_SUSPENDED)) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = AddChannelUser(chanserv, cNode); diff --git a/src/hash.c b/src/hash.c index 168a317..bf2633d 100644 --- a/src/hash.c +++ b/src/hash.c @@ -139,7 +139,7 @@ ReintroduceUser(struct userNode *user) unsigned int n; irc_user(user); - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; for (n = 0; n < user->channels.used; n++) { struct modeNode *mn = user->channels.list[n]; diff --git a/src/main.c b/src/main.c index e778f75..b36ba0c 100644 --- a/src/main.c +++ b/src/main.c @@ -94,6 +94,7 @@ static const struct message_entry msgtab[] = { { "MSG_INVALID_MODES", "$b%s$b is an invalid set of channel modes." }, { "MSG_INVALID_GLINE", "Invalid G-line '%s'." }, { "MSG_INVALID_DURATION", "Invalid time span '%s'." }, + { "MSG_NOT_TARGET_NAME", "You must provide the name of a channel or user." }, { "MSG_NOT_CHANNEL_NAME", "You must provide a valid channel name." }, { "MSG_INVALID_CHANNEL", "You must provide the name of a channel that exists." }, { "MSG_CHANNEL_ABSENT", "You aren't currently in $b%s$b." }, diff --git a/src/mod-helpserv.c b/src/mod-helpserv.c index 3b3f402..e6e5e17 100644 --- a/src/mod-helpserv.c +++ b/src/mod-helpserv.c @@ -1667,7 +1667,7 @@ static HELPSERV_FUNC(cmd_close) { struct modeNode *mn = GetUserMode(hs->helpchan, req_user); if ((!newest || !newest->helper) && mn && (mn->modes & MODE_VOICE)) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_REMOVE | MODE_VOICE; change.args[0].member = mn; @@ -1871,7 +1871,7 @@ static int helpserv_assign(int from_opserv, struct helpserv_bot *hs, struct user if (req->user && hs->auto_voice) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_VOICE; if ((change.args[0].member = GetUserMode(hs->helpchan, req->user))) @@ -2248,7 +2248,7 @@ static HELPSERV_FUNC(cmd_move) { AddChannelUser(hs->helpserv, hs->helpchan)->modes |= MODE_CHANOP; } else if (!helpserv_in_channel(hs, old_helpchan)) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = AddChannelUser(hs->helpserv, hs->helpchan); @@ -2327,7 +2327,7 @@ static void helpserv_page_helper_gone(struct helpserv_bot *hs, struct helpserv_r helpserv_msguser(req->user, "HSMSG_REQ_UNASSIGNED", req->id, reason); if (hs->auto_devoice && mn && (mn->modes & MODE_VOICE)) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_REMOVE | MODE_VOICE; change.args[0].member = mn; @@ -2609,7 +2609,7 @@ static struct helpserv_bot *register_helpserv(const char *nick, const char *help AddChannelUser(hs->helpserv, hs->helpchan)->modes |= MODE_CHANOP; } else { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = AddChannelUser(hs->helpserv, hs->helpchan); @@ -2866,7 +2866,7 @@ static void set_page_target(struct helpserv_bot *hs, enum page_source idx, const DelChannelUser(hs->helpserv, old_target, "Changing page target.", 0); if (new_target && !helpserv_in_channel(hs, new_target)) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = AddChannelUser(hs->helpserv, new_target); @@ -3904,7 +3904,7 @@ static void associate_requests_bybot(struct helpserv_bot *hs, struct userNode *u if (hs->auto_voice && req->helper) { struct mod_chanmode change; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_VOICE; if ((change.args[0].member = GetUserMode(hs->helpchan, user))) diff --git a/src/mod-snoop.c b/src/mod-snoop.c index 5ac8b04..e69161b 100644 --- a/src/mod-snoop.c +++ b/src/mod-snoop.c @@ -184,7 +184,7 @@ snoop_finalize(void) { snoop_cfg.bot = GetUserH(str); if (!snoop_cfg.bot) return 0; - change.modes_set = change.modes_clear = 0; + mod_chanmode_init(&change); change.argc = 1; change.args[0].mode = MODE_CHANOP; change.args[0].member = AddChannelUser(snoop_cfg.bot, snoop_cfg.channel); diff --git a/src/proto-bahamut.c b/src/proto-bahamut.c index 95dbe03..4b82d7f 100644 --- a/src/proto-bahamut.c +++ b/src/proto-bahamut.c @@ -1258,6 +1258,8 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un if (!add) change->args[ch_arg].mode |= MODE_REMOVE; victim = GetUserH(modes[in_arg++]); + if (!victim) + continue; if ((change->args[ch_arg].member = GetUserMode(channel, victim))) ch_arg++; break; @@ -1314,6 +1316,7 @@ mod_chanmode_announce(struct userNode *who, struct chanNode *channel, struct mod char int_buff[32]; unsigned int arg; + assert(change->argc <= change->alloc_argc); memset(&chbuf, 0, sizeof(chbuf)); chbuf.channel = channel; chbuf.actor = who; @@ -1406,6 +1409,7 @@ char * mod_chanmode_format(struct mod_chanmode *change, char *outbuff) { unsigned int used = 0; + assert(change->argc <= change->alloc_argc); if (change->modes_clear) { outbuff[used++] = '-'; #define DO_MODE_CHAR(BIT, CHAR) if (change->modes_clear & MODE_##BIT) outbuff[used++] = CHAR diff --git a/src/proto-common.c b/src/proto-common.c index 93751e3..de4f04b 100644 --- a/src/proto-common.c +++ b/src/proto-common.c @@ -519,8 +519,10 @@ mod_chanmode_alloc(unsigned int argc) res = calloc(1, sizeof(*res) + (argc-1)*sizeof(res->args[0])); else res = calloc(1, sizeof(*res)); - if (res) + if (res) { + res->alloc_argc = argc; res->argc = argc; + } return res; } @@ -544,6 +546,7 @@ mod_chanmode_apply(struct userNode *who, struct chanNode *channel, struct mod_ch struct banNode *bn; unsigned int ii, jj; + assert(change->argc <= change->alloc_argc); channel->modes = (channel->modes & ~change->modes_clear) | change->modes_set; if (change->modes_set & MODE_LIMIT) channel->limit = change->new_limit; diff --git a/src/proto-p10.c b/src/proto-p10.c index 7717c8d..cfbbbc2 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -2045,6 +2045,8 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un victim = GetUserN(modes[in_arg++]); else victim = GetUserH(modes[in_arg++]); + if (!victim) + continue; if ((change->args[ch_arg].member = GetUserMode(channel, victim))) ch_arg++; break; @@ -2104,6 +2106,7 @@ mod_chanmode_announce(struct userNode *who, struct chanNode *channel, struct mod struct modeNode *mn; char int_buff[32], mode = '\0'; + assert(change->argc <= change->alloc_argc); memset(&chbuf, 0, sizeof(chbuf)); chbuf.channel = channel; chbuf.actor = who; @@ -2205,6 +2208,7 @@ char * mod_chanmode_format(struct mod_chanmode *change, char *outbuff) { unsigned int used = 0; + assert(change->argc <= change->alloc_argc); if (change->modes_clear) { outbuff[used++] = '-'; #define DO_MODE_CHAR(BIT, CHAR) if (change->modes_clear & MODE_##BIT) outbuff[used++] = CHAR diff --git a/src/proto.h b/src/proto.h index 85f0491..7612bc8 100644 --- a/src/proto.h +++ b/src/proto.h @@ -182,6 +182,9 @@ typedef unsigned long chan_mode_t; struct mod_chanmode { chan_mode_t modes_set, modes_clear; unsigned int new_limit, argc; +#ifndef NDEBUG + unsigned int alloc_argc; +#endif char new_key[KEYLEN + 1]; struct { unsigned int mode; @@ -196,6 +199,12 @@ struct mod_chanmode { #define MCP_KEY_FREE 0x0004 /* -k without a key argument */ #define MC_ANNOUNCE 0x0100 /* send a mod_chanmode() change out */ #define MC_NOTIFY 0x0200 /* make local callbacks to announce */ +#ifdef NDEBUG +#define mod_chanmode_init(CHANMODE) do { memset((CHANMODE), 0, sizeof(*CHANMODE)); } while (0) +#else +#define mod_chanmode_init(CHANMODE) do { memset((CHANMODE), 0, sizeof(*CHANMODE)); (CHANMODE)->alloc_argc = ArrayLength((CHANMODE)->args); } while (0) +#endif + struct mod_chanmode *mod_chanmode_alloc(unsigned int argc); struct mod_chanmode *mod_chanmode_dup(struct mod_chanmode *orig, unsigned int extra); struct mod_chanmode *mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, unsigned int flags);