Remove extraneous semicolons from end of macro uses.
[srvx.git] / src / chanserv.c
index 4f391c544eea03db7bfa64f9ef538b67452d69fa..4fc9bb9e564eb0d9c58ac7cbb765a63a9ba1265e 100644 (file)
@@ -478,7 +478,7 @@ static const struct message_entry msgtab[] = {
         return 0; }
 
 DECLARE_LIST(dnrList, struct do_not_register *);
-DEFINE_LIST(dnrList, struct do_not_register *);
+DEFINE_LIST(dnrList, struct do_not_register *)
 
 static int eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, char *argv[], struct svccmd *cmd, int action);
 
@@ -497,9 +497,9 @@ static struct
     unsigned long   channel_expire_frequency;
     unsigned long   dnr_expire_frequency;
 
-    long            info_delay;
-    unsigned int    adjust_delay;
-    long            channel_expire_delay;
+    unsigned long   info_delay;
+    unsigned long   adjust_delay;
+    unsigned long   channel_expire_delay;
     unsigned int    nodelete_level;
 
     unsigned int    adjust_threshold;
@@ -798,7 +798,7 @@ scan_user_presence(struct userData *uData, struct userNode *user)
 }
 
 static void
-chanserv_ctcp_check(struct userNode *user, struct chanNode *channel, const char *text, UNUSED_ARG(struct userNode *bot))
+chanserv_ctcp_check(struct userNode *user, struct chanNode *channel, const char *text, UNUSED_ARG(struct userNode *bot), UNUSED_ARG(unsigned int is_notice))
 {
     unsigned int eflags, argc;
     char *argv[4];
@@ -1115,7 +1115,7 @@ register_channel(struct chanNode *cNode, char *registrar)
 }
 
 static struct userData*
-add_channel_user(struct chanData *channel, struct handle_info *handle, unsigned short access, time_t seen, const char *info)
+add_channel_user(struct chanData *channel, struct handle_info *handle, unsigned short access, unsigned long seen, const char *info)
 {
     struct userData *ud;
 
@@ -1180,7 +1180,7 @@ del_channel_user(struct userData *user, int do_gc)
 static void expire_ban(void *data);
 
 static struct banData*
-add_channel_ban(struct chanData *channel, const char *mask, char *owner, time_t set, time_t triggered, time_t expires, char *reason)
+add_channel_ban(struct chanData *channel, const char *mask, char *owner, unsigned long set, unsigned long triggered, unsigned long expires, char *reason)
 {
     struct banData *bd;
     unsigned int ii, l1, l2;
@@ -1397,29 +1397,29 @@ expire_channels(UNUSED_ARG(void *data))
 static void
 expire_dnrs(UNUSED_ARG(void *data))
 {
-    dict_iterator_t it;
+    dict_iterator_t it, next;
     struct do_not_register *dnr;
 
-    for(it = dict_first(handle_dnrs); it; it = iter_next(it))
+    for(it = dict_first(handle_dnrs); it; it = next)
     {
         dnr = iter_data(it);
-        if(!dnr->expires || dnr->expires > now)
-            continue;
-        dict_remove(handle_dnrs, dnr->chan_name + 1);
+        next = iter_next(it);
+        if(dnr->expires && dnr->expires <= now)
+            dict_remove(handle_dnrs, dnr->chan_name + 1);
     }
-    for(it = dict_first(plain_dnrs); it; it = iter_next(it))
+    for(it = dict_first(plain_dnrs); it; it = next)
     {
         dnr = iter_data(it);
-        if(!dnr->expires || dnr->expires > now)
-            continue;
-        dict_remove(plain_dnrs, dnr->chan_name);
+        next = iter_next(it);
+        if(dnr->expires && dnr->expires <= now)
+            dict_remove(plain_dnrs, dnr->chan_name + 1);
     }
-    for(it = dict_first(mask_dnrs); it; it = iter_next(it))
+    for(it = dict_first(mask_dnrs); it; it = next)
     {
         dnr = iter_data(it);
-        if(!dnr->expires || dnr->expires > now)
-            continue;
-        dict_remove(mask_dnrs, dnr->chan_name);
+        next = iter_next(it);
+        if(dnr->expires && dnr->expires <= now)
+            dict_remove(mask_dnrs, dnr->chan_name + 1);
     }
 
     if(chanserv_conf.dnr_expire_frequency)
@@ -1506,7 +1506,7 @@ validate_deop(struct userNode *user, struct chanNode *channel, struct userNode *
 }
 
 static struct do_not_register *
-chanserv_add_dnr(const char *chan_name, const char *setter, time_t expires, const char *reason)
+chanserv_add_dnr(const char *chan_name, const char *setter, unsigned long expires, const char *reason)
 {
     struct do_not_register *dnr = calloc(1, sizeof(*dnr)+strlen(reason));
     safestrncpy(dnr->chan_name, chan_name, sizeof(dnr->chan_name));
@@ -1571,13 +1571,18 @@ static int dnr_print_func(struct do_not_register *dnr, void *extra)
     struct userNode *user;
     char buf1[INTERVALLEN];
     char buf2[INTERVALLEN];
+    time_t feh;
 
     user = extra;
     if(dnr->set)
-        strftime(buf1, sizeof(buf1), "%d %b %Y", localtime(&dnr->set));
+    {
+        feh = dnr->set;
+        strftime(buf1, sizeof(buf1), "%d %b %Y", localtime(&feh));
+    }
     if(dnr->expires)
     {
-        strftime(buf2, sizeof(buf2), "%d %b %Y", localtime(&dnr->expires));
+        feh = dnr->expires;
+        strftime(buf2, sizeof(buf2), "%d %b %Y", localtime(&feh));
         send_message(user, chanserv, "CSMSG_DNR_INFO_SET_EXPIRES", dnr->chan_name, buf1, dnr->setter, buf2, dnr->reason);
     }
     else if(dnr->set)
@@ -1641,7 +1646,8 @@ static unsigned int send_dnrs(struct userNode *user, dict_t dict)
 static CHANSERV_FUNC(cmd_noregister)
 {
     const char *target;
-    time_t expiry, duration;
+    const char *reason;
+    unsigned long expiry, duration;
     unsigned int matches;
 
     if(argc < 2)
@@ -1683,7 +1689,7 @@ static CHANSERV_FUNC(cmd_noregister)
             return 0;
         }
 
-        const char *reason = unsplit_string(argv + 3, argc - 3, NULL);
+        reason = unsplit_string(argv + 3, argc - 3, NULL);
         if((*target == '*') && !get_handle_info(target + 1))
         {
             reply("MSG_HANDLE_UNKNOWN", target + 1);
@@ -1724,8 +1730,8 @@ struct dnr_search {
     char *chan_mask;
     char *setter_mask;
     char *reason_mask;
-    time_t min_set, max_set;
-    time_t min_expires, max_expires;
+    unsigned long min_set, max_set;
+    unsigned long min_expires, max_expires;
     unsigned int limit;
 };
 
@@ -1734,8 +1740,10 @@ dnr_search_matches(const struct do_not_register *dnr, const struct dnr_search *s
 {
     return !((dnr->set < search->min_set)
              || (dnr->set > search->max_set)
-             || (dnr->expires && ((dnr->expires < search->min_expires)
-                                  || (dnr->expires > search->max_expires)))
+             || (dnr->expires < search->min_expires)
+             || (search->max_expires
+                 && ((dnr->expires == 0)
+                     || (dnr->expires > search->max_expires)))
              || (search->chan_mask
                  && !match_ircglob(dnr->chan_name, search->chan_mask))
              || (search->setter_mask
@@ -1756,7 +1764,6 @@ dnr_search_create(struct userNode *user, struct svccmd *cmd, unsigned int argc,
     discrim->setter_mask = NULL;
     discrim->reason_mask = NULL;
     discrim->max_set = INT_MAX;
-    discrim->max_expires = INT_MAX;
     discrim->limit = 50;
 
     for(ii=0; ii<argc; ++ii)
@@ -2767,7 +2774,7 @@ cmd_trim_bans(struct userNode *user, struct chanNode *channel, unsigned long dur
     struct banData *bData, *next;
     char interval[INTERVALLEN];
     unsigned int count;
-    time_t limit;
+    unsigned long limit;
 
     count = 0;
     limit = now - duration;
@@ -2793,7 +2800,7 @@ cmd_trim_users(struct userNode *user, struct chanNode *channel, unsigned short m
     struct userData *actor, *uData, *next;
     char interval[INTERVALLEN];
     unsigned int count;
-    time_t limit;
+    unsigned long limit;
 
     actor = GetChannelAccess(channel->channel_info, user->handle_info);
     if(min_access > max_access)
@@ -3122,6 +3129,35 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c
         ban = generate_hostmask(victim, GENMASK_STRICT_HOST|GENMASK_ANY_IDENT);
         name = victim->nick;
     }
+    else if(!is_ircmask(argv[1]) && (*argv[1] == '*'))
+    {
+        struct handle_info *hi;
+        char banmask[NICKLEN + USERLEN + HOSTLEN + 3];
+        const char *accountname = argv[1] + 1;
+
+        if(!(hi = get_handle_info(accountname)))
+        {
+            reply("MSG_HANDLE_UNKNOWN", accountname);
+            return 0;
+        }
+
+        snprintf(banmask, sizeof(banmask), "*!*@%s.*", hi->handle);
+        victims = alloca(sizeof(victims[0]) * channel->members.used);
+
+        if(bad_channel_ban(channel, user, banmask, &victimCount, victims))
+        {
+            reply("CSMSG_MASK_PROTECTED", banmask);
+            return 0;
+        }
+
+        if((action == ACTION_KICK) && (victimCount == 0))
+        {
+            reply("CSMSG_NO_MATCHING_USERS", channel->name, banmask);
+            return 0;
+        }
+
+        name = ban = strdup(banmask);
+    }
     else
     {
         if(!is_ircmask(argv[1]))
@@ -3212,7 +3248,7 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c
                     /* If the ban matches an existing one exactly,
                        extend the expiration time if the provided
                        duration is longer. */
-                    if(duration && ((time_t)(now + duration) > bData->expires))
+                    if(duration && (now + duration > bData->expires))
                     {
                         bData->expires = now + duration;
                         reset = 1;
@@ -3437,13 +3473,23 @@ unban_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c
     /* may want to allow a comma delimited list of users... */
     if(!(actee = GetUserH(argv[1])))
     {
-        if(!is_ircmask(argv[1]))
+        if(!is_ircmask(argv[1]) && *argv[1] == '*')
+        {
+            char banmask[NICKLEN + USERLEN + HOSTLEN + 3];
+            const char *accountname = argv[1] + 1;
+
+            snprintf(banmask, sizeof(banmask), "*!*@%s.*", accountname);
+            mask = strdup(banmask);
+        }
+        else if(!is_ircmask(argv[1]))
         {
             reply("MSG_NICK_UNKNOWN", argv[1]);
             return 0;
         }
-
-        mask = strdup(argv[1]);
+        else
+        {
+            mask = strdup(argv[1]);
+        }
     }
 
     /* We don't sanitize the mask here because ircu
@@ -4361,7 +4407,7 @@ static CHANSERV_FUNC(cmd_info)
 
 static CHANSERV_FUNC(cmd_netinfo)
 {
-    extern time_t boot_time;
+    extern unsigned long boot_time;
     extern unsigned long burst_length;
     char interval[INTERVALLEN];
 
@@ -4796,6 +4842,23 @@ static CHANSERV_FUNC(cmd_say)
         msg = unsplit_string(argv + 1, argc - 1, NULL);
         send_channel_message(channel, cmd->parent->bot, "%s", msg);
     }
+    else if(*argv[1] == '*' && argv[1][1] != '\0')
+    {
+        struct handle_info *hi;
+        struct userNode *authed;
+
+        REQUIRE_PARAMS(3);
+        msg = unsplit_string(argv + 2, argc - 2, NULL);
+
+        if (!(hi = get_handle_info(argv[1] + 1)))
+        {
+            reply("MSG_HANDLE_UNKNOWN", argv[1] + 1);
+            return 0;
+        }
+
+        for (authed = hi->users; authed; authed = authed->next_authed)
+            send_target_message(5, authed->nick, cmd->parent->bot, "%s", msg);
+    }
     else if(GetUserH(argv[1]))
     {
         REQUIRE_PARAMS(3);
@@ -4820,6 +4883,23 @@ static CHANSERV_FUNC(cmd_emote)
         msg = unsplit_string(argv + 1, argc - 1, NULL);
         send_channel_message(channel, cmd->parent->bot, "\001ACTION %s\001", msg);
     }
+    else if(*argv[1] == '*' && argv[1][1] != '\0')
+    {
+        struct handle_info *hi;
+        struct userNode *authed;
+
+        REQUIRE_PARAMS(3);
+        msg = unsplit_string(argv + 2, argc - 2, NULL);
+
+        if (!(hi = get_handle_info(argv[1] + 1)))
+        {
+            reply("MSG_HANDLE_UNKNOWN", argv[1] + 1);
+            return 0;
+        }
+
+        for (authed = hi->users; authed; authed = authed->next_authed)
+            send_target_message(5, authed->nick, cmd->parent->bot, "\001ACTION %s\001", msg);
+    }
     else if(GetUserH(argv[1]))
     {
         msg = unsplit_string(argv + 2, argc - 2, NULL);
@@ -4873,7 +4953,7 @@ static CHANSERV_FUNC(cmd_csuspend)
 {
     struct suspended *suspended;
     char reason[MAXLEN];
-    time_t expiry, duration;
+    unsigned long expiry, duration;
     struct userData *uData;
 
     REQUIRE_PARAMS(3);
@@ -4975,8 +5055,8 @@ typedef struct chanservSearch
     char *name;
     char *registrar;
 
-    time_t unvisited;
-    time_t registered;
+    unsigned long unvisited;
+    unsigned long registered;
 
     unsigned long flags;
     unsigned int limit;
@@ -5131,7 +5211,7 @@ static CHANSERV_FUNC(cmd_search)
 static CHANSERV_FUNC(cmd_unvisited)
 {
     struct chanData *cData;
-    time_t interval = chanserv_conf.channel_expire_delay;
+    unsigned long interval = chanserv_conf.channel_expire_delay;
     char buffer[INTERVALLEN];
     unsigned int limit = 25, matches = 0;
 
@@ -5938,7 +6018,7 @@ static CHANSERV_FUNC(cmd_giveownership)
         }
         curr_user = owner;
     }
-    else if(!force && (now < (time_t)(cData->ownerTransfer + chanserv_conf.giveownership_period)))
+    else if(!force && (now < cData->ownerTransfer + chanserv_conf.giveownership_period))
     {
         char delay[INTERVALLEN];
         intervalString(delay, cData->ownerTransfer + chanserv_conf.giveownership_period - now, user->handle_info);
@@ -7043,7 +7123,7 @@ user_read_helper(const char *key, struct record_data *rd, struct chanData *chan)
     struct handle_info *handle;
     struct userData *uData;
     char *seen, *inf, *flags;
-    time_t last_seen;
+    unsigned long last_seen;
     unsigned short access;
 
     if(rd->type != RECDB_OBJECT || !dict_size(rd->d.object))
@@ -7061,7 +7141,7 @@ user_read_helper(const char *key, struct record_data *rd, struct chanData *chan)
 
     inf = database_get_data(rd->d.object, KEY_INFO, RECDB_QSTRING);
     seen = database_get_data(rd->d.object, KEY_SEEN, RECDB_QSTRING);
-    last_seen = seen ? (signed)strtoul(seen, NULL, 0) : now;
+    last_seen = seen ? strtoul(seen, NULL, 0) : now;
     flags = database_get_data(rd->d.object, KEY_FLAGS, RECDB_QSTRING);
     handle = get_handle_info(key);
     if(!handle)
@@ -7079,7 +7159,7 @@ ban_read_helper(const char *key, struct record_data *rd, struct chanData *chan)
 {
     struct banData *bData;
     char *set, *triggered, *s_duration, *s_expires, *reason, *owner;
-    time_t set_time, triggered_time, expires_time;
+    unsigned long set_time, triggered_time, expires_time;
 
     if(rd->type != RECDB_OBJECT || !dict_size(rd->d.object))
     {
@@ -7096,10 +7176,10 @@ ban_read_helper(const char *key, struct record_data *rd, struct chanData *chan)
     if (!reason || !owner)
         return;
 
-    set_time = set ? (time_t)strtoul(set, NULL, 0) : now;
-    triggered_time = triggered ? (time_t)strtoul(triggered, NULL, 0) : 0;
+    set_time = set ? strtoul(set, NULL, 0) : now;
+    triggered_time = triggered ? strtoul(triggered, NULL, 0) : 0;
     if(s_expires)
-        expires_time = (time_t)strtoul(s_expires, NULL, 0);
+        expires_time = strtoul(s_expires, NULL, 0);
     else if(s_duration)
         expires_time = set_time + atoi(s_duration);
     else
@@ -7119,11 +7199,11 @@ chanserv_read_suspended(dict_t obj)
     dict_t previous;
 
     str = database_get_data(obj, KEY_EXPIRES, RECDB_QSTRING);
-    suspended->expires = str ? (time_t)strtoul(str, NULL, 0) : 0;
+    suspended->expires = str ? strtoul(str, NULL, 0) : 0;
     str = database_get_data(obj, KEY_REVOKED, RECDB_QSTRING);
-    suspended->revoked = str ? (time_t)strtoul(str, NULL, 0) : 0;
+    suspended->revoked = str ? strtoul(str, NULL, 0) : 0;
     str = database_get_data(obj, KEY_ISSUED, RECDB_QSTRING);
-    suspended->issued = str ? (time_t)strtoul(str, NULL, 0) : 0;
+    suspended->issued = str ? strtoul(str, NULL, 0) : 0;
     suspended->suspender = strdup(database_get_data(obj, KEY_SUSPENDER, RECDB_QSTRING));
     suspended->reason = strdup(database_get_data(obj, KEY_REASON, RECDB_QSTRING));
     previous = database_get_data(obj, KEY_PREVIOUS, RECDB_OBJECT);
@@ -7269,11 +7349,11 @@ chanserv_channel_read(const char *key, struct record_data *hir)
     }
 
     str = database_get_data(channel, KEY_REGISTERED, RECDB_QSTRING);
-    cData->registered = str ? (time_t)strtoul(str, NULL, 0) : now;
+    cData->registered = str ? strtoul(str, NULL, 0) : now;
     str = database_get_data(channel, KEY_VISITED, RECDB_QSTRING);
-    cData->visited = str ? (time_t)strtoul(str, NULL, 0) : now;
+    cData->visited = str ? strtoul(str, NULL, 0) : now;
     str = database_get_data(channel, KEY_OWNER_TRANSFER, RECDB_QSTRING);
-    cData->ownerTransfer = str ? (time_t)strtoul(str, NULL, 0) : 0;
+    cData->ownerTransfer = str ? strtoul(str, NULL, 0) : 0;
     str = database_get_data(channel, KEY_MAX, RECDB_QSTRING);
     cData->max = str ? atoi(str) : 0;
     str = database_get_data(channel, KEY_GREETING, RECDB_QSTRING);
@@ -7348,7 +7428,7 @@ chanserv_dnr_read(const char *key, struct record_data *hir)
 {
     const char *setter, *reason, *str;
     struct do_not_register *dnr;
-    time_t expiry;
+    unsigned long expiry;
 
     setter = database_get_data(hir->d.object, KEY_DNR_SETTER, RECDB_QSTRING);
     if(!setter)
@@ -7363,7 +7443,7 @@ chanserv_dnr_read(const char *key, struct record_data *hir)
         return;
     }
     str = database_get_data(hir->d.object, KEY_EXPIRES, RECDB_QSTRING);
-    expiry = str ? (time_t)strtoul(str, NULL, 0) : 0;
+    expiry = str ? strtoul(str, NULL, 0) : 0;
     if(expiry && expiry <= now)
         return;
     dnr = chanserv_add_dnr(key, setter, expiry, reason);
@@ -7830,7 +7910,7 @@ init_chanserv(const char *nick)
 
     if(chanserv_conf.refresh_period)
     {
-        time_t next_refresh;
+        unsigned long next_refresh;
         next_refresh = (now + chanserv_conf.refresh_period - 1) / chanserv_conf.refresh_period * chanserv_conf.refresh_period;
         timeq_add(next_refresh, chanserv_refresh_topics, NULL);
     }