]> jfr.im git - solanum.git/blobdiff - modules/m_cap.c
providers/ident: fix some nasty crashes
[solanum.git] / modules / m_cap.c
index a8b68f5c751f6ae5ed7b9a69f9f03c3104c8793b..a1dd5b29793e96cffda1ad89e4eccb1994bf33bc 100644 (file)
 #include "s_conf.h"
 #include "hash.h"
 
+static const char cap_desc[] = "Provides the commands used for client capability negotiation";
+
 typedef int (*bqcmp)(const void *, const void *);
 
-static int m_cap(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
+static void m_cap(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
 
 struct Message cap_msgtab = {
        "CAP", 0, 0, 0, 0,
@@ -54,7 +56,8 @@ struct Message cap_msgtab = {
 };
 
 mapi_clist_av1 cap_clist[] = { &cap_msgtab, NULL };
-DECLARE_MODULE_AV2(cap, NULL, NULL, cap_clist, NULL, NULL, NULL, NULL, NULL);
+
+DECLARE_MODULE_AV2(cap, NULL, NULL, cap_clist, NULL, NULL, NULL, NULL, cap_desc);
 
 #define IsCapableEntry(c, e)           IsCapable(c, 1 << (e)->value)
 #define HasCapabilityFlag(c, f)                (c->ownerdata != NULL && (((struct ClientCapability *)c->ownerdata)->flags & (f)) == f)
@@ -143,19 +146,18 @@ clicap_find(const char *data, int *negate, int *finished)
  *   Generates a list of capabilities.
  *
  * Inputs: client to send to, subcmd to send,
- *         flags to match against: 0 to do none, -1 if client has no flags,
- *         int to whether we are doing CAP CLEAR
+ *         flags to match against: 0 to do none, -1 if client has no flags
  * Outputs: None
  */
 static void
-clicap_generate(struct Client *source_p, const char *subcmd, int flags, int clear)
+clicap_generate(struct Client *source_p, const char *subcmd, int flags)
 {
        char buf[BUFSIZE] = { 0 };
        char capbuf[BUFSIZE] = { 0 };
        int buflen = 0;
-       int curlen, mlen;
+       int mlen;
        struct CapabilityEntry *entry;
-       struct DictionaryIter iter;
+       rb_dictionary_iter iter;
 
        mlen = snprintf(buf, sizeof buf, ":%s CAP %s %s",
                        me.name,
@@ -169,20 +171,14 @@ clicap_generate(struct Client *source_p, const char *subcmd, int flags, int clea
                return;
        }
 
-       DICTIONARY_FOREACH(entry, &iter, cli_capindex->cap_dict)
+       RB_DICTIONARY_FOREACH(entry, &iter, cli_capindex->cap_dict)
        {
                size_t caplen = 0;
                struct ClientCapability *clicap = entry->ownerdata;
                const char *data = NULL;
 
-               if(flags)
-               {
-                       if(!IsCapableEntry(source_p, entry))
-                               continue;
-                       /* they are capable of this, check sticky */
-                       else if(clear && HasCapabilityFlag(entry, CLICAP_FLAGS_STICKY))
-                               continue;
-               }
+               if(flags && !IsCapableEntry(source_p, entry))
+                       continue;
 
                if (!clicap_visible(source_p, entry))
                        continue;
@@ -208,8 +204,8 @@ clicap_generate(struct Client *source_p, const char *subcmd, int flags, int clea
                        memset(capbuf, 0, sizeof capbuf);
                }
 
-               buflen = rb_snprintf_append(capbuf, sizeof capbuf, "%s%s%s%s ",
-                               clear ? "-" : "", entry->cap, data != NULL ? "=" : "", data != NULL ? data : "");
+               buflen = rb_snprintf_append(capbuf, sizeof capbuf, "%s%s%s ",
+                               entry->cap, data != NULL ? "=" : "", data != NULL ? data : "");
        }
 
        /* remove trailing space */
@@ -251,15 +247,6 @@ cap_ack(struct Client *source_p, const char *arg)
        source_p->localClient->caps &= ~capdel;
 }
 
-static void
-cap_clear(struct Client *source_p, const char *arg)
-{
-       clicap_generate(source_p, "ACK",
-                       source_p->localClient->caps ? source_p->localClient->caps : -1, 1);
-
-       source_p->localClient->caps = 0;
-}
-
 static void
 cap_end(struct Client *source_p, const char *arg)
 {
@@ -279,7 +266,7 @@ cap_list(struct Client *source_p, const char *arg)
 {
        /* list of what theyre currently using */
        clicap_generate(source_p, "LIST",
-                       source_p->localClient->caps ? source_p->localClient->caps : -1, 0);
+                       source_p->localClient->caps ? source_p->localClient->caps : -1);
 }
 
 static void
@@ -295,7 +282,7 @@ cap_ls(struct Client *source_p, const char *arg)
        }
 
        /* list of what we support */
-       clicap_generate(source_p, "LS", 0, 0);
+       clicap_generate(source_p, "LS", 0);
 }
 
 static void
@@ -401,7 +388,6 @@ static struct clicap_cmd
 } clicap_cmdlist[] = {
        /* This list *MUST* be in alphabetical order */
        { "ACK",        cap_ack         },
-       { "CLEAR",      cap_clear       },
        { "END",        cap_end         },
        { "LIST",       cap_list        },
        { "LS",         cap_ls          },
@@ -414,7 +400,7 @@ clicap_cmd_search(const char *command, struct clicap_cmd *entry)
        return irccmp(command, entry->cmd);
 }
 
-static int
+static void
 m_cap(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        struct clicap_cmd *cmd;
@@ -426,9 +412,8 @@ m_cap(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p,
                sendto_one(source_p, form_str(ERR_INVALIDCAPCMD),
                                me.name, EmptyString(source_p->name) ? "*" : source_p->name,
                                parv[1]);
-               return 0;
+               return;
        }
 
        (cmd->func)(source_p, parv[2]);
-       return 0;
 }