Further cleanups and bugfixes
authorEntrope <entrope@clan-dk.org>
Wed, 10 Mar 2004 17:03:30 +0000 (17:03 +0000)
committerEntrope <entrope@clan-dk.org>
Wed, 10 Mar 2004 17:03:30 +0000 (17:03 +0000)
* 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

src/chanserv.c
src/hash.c
src/main.c
src/mod-helpserv.c
src/mod-snoop.c
src/proto-bahamut.c
src/proto-common.c
src/proto-p10.c
src/proto.h

index 7b3f372301783199a4b4e9f063185eadfe5091d1..61f558554ebb913345c9ace0e74b90c29f57493b 100644 (file)
@@ -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; ii<bans.used; ii++)
         {
             if(!strcmp(bans.list[ii]->ban, 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);
index 168a31730ec6e8d9bf56a0e11ec90b5a89cb1adb..bf2633d261a075515f6149a4b51b793ebcf858a5 100644 (file)
@@ -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];
index e778f75f839bba854904100d98a327523f052710..b36ba0c05f0fb2a6f8ff68bb92c8f10aae2461da 100644 (file)
@@ -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." },
index 3b3f402326872d8443603d1fad1f73213d25bb44..e6e5e17c3e2f8797bbf9c51162fdf06979d8fe26 100644 (file)
@@ -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)))
index 5ac8b04f270a422b8e1ff7a1e8e89036c9acd756..e69161bc339ed5b9c0379483bd45f1b0ca59b5d7 100644 (file)
@@ -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);
index 95dbe03c8b13cec11f87853e15837c6fd6e3ae4e..4b82d7fccd35a487dea84cc2cc493b920a71f9a1 100644 (file)
@@ -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
index 93751e39d59ef7caa1e823f9dc793483e038c35f..de4f04be24254bcddb4372a18a46e6804f36e2d1 100644 (file)
@@ -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;
index 7717c8d3d7e8dd1c3ecbb7ab3c2f74e646e42559..cfbbbc29ec7fd580a44f1eeb170e1ba84b691aee 100644 (file)
@@ -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
index 85f0491090ceb95e8e0a2f4e2d8cb24c75bb05fd..7612bc8d8af98bde7e92b60f06e38063a4130066 100644 (file)
@@ -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);