]> jfr.im git - solanum.git/commitdiff
capability: allow attaching capability-owner data to a capability token, to enable...
authorWilliam Pitcock <redacted>
Sat, 27 Feb 2016 05:55:43 +0000 (23:55 -0600)
committerWilliam Pitcock <redacted>
Sat, 27 Feb 2016 05:55:43 +0000 (23:55 -0600)
extensions/m_remove.c
include/capability.h
ircd/capability.c
modules/m_capab.c

index 25bbd4700b85a0332ea64ba21777b36b85aa3a6e..b213a12c29a8302f218e36a00389cfb1903be55b 100644 (file)
@@ -61,7 +61,7 @@ mapi_hfn_list_av1 remove_hfnlist[] = {
 static int
 modinit(void)
 {
-       CAP_REMOVE = capability_put(serv_capindex, "REMOVE");
+       CAP_REMOVE = capability_put(serv_capindex, "REMOVE", NULL);
 
        return 0;
 }
index 8857f0a16825ac01acf02fe4822b534f5c34bd78..f48529c39b901bcc1f04c01da32e4ea454b26a46 100644 (file)
@@ -24,8 +24,8 @@
 struct CapabilityIndex;
 struct CapabilityEntry;
 
-extern unsigned int capability_get(struct CapabilityIndex *idx, const char *cap);
-extern unsigned int capability_put(struct CapabilityIndex *idx, const char *cap);
+extern unsigned int capability_get(struct CapabilityIndex *idx, const char *cap, void **ownerdata);
+extern unsigned int capability_put(struct CapabilityIndex *idx, const char *cap, void *ownerdata);
 extern unsigned int capability_put_anonymous(struct CapabilityIndex *idx);
 extern void capability_orphan(struct CapabilityIndex *idx, const char *cap);
 extern void capability_require(struct CapabilityIndex *idx, const char *cap);
index 719502126027f2d25cf2faac1019c17f2d735acc..6cc803bd000e6f610b96946d16ea0f9c6a0e68d0 100644 (file)
@@ -39,10 +39,11 @@ struct CapabilityEntry {
        char *cap;
        unsigned int value;
        unsigned int flags;
+       void *ownerdata;
 };
 
 unsigned int
-capability_get(struct CapabilityIndex *idx, const char *cap)
+capability_get(struct CapabilityIndex *idx, const char *cap, void **ownerdata)
 {
        struct CapabilityEntry *entry;
 
@@ -52,13 +53,17 @@ capability_get(struct CapabilityIndex *idx, const char *cap)
 
        entry = irc_dictionary_retrieve(idx->cap_dict, cap);
        if (entry != NULL && !(entry->flags & CAP_ORPHANED))
+       {
+               if (ownerdata != NULL)
+                       *ownerdata = entry->ownerdata;
                return (1 << entry->value);
+       }
 
        return 0;
 }
 
 unsigned int
-capability_put(struct CapabilityIndex *idx, const char *cap)
+capability_put(struct CapabilityIndex *idx, const char *cap, void *ownerdata)
 {
        struct CapabilityEntry *entry;
 
@@ -76,6 +81,7 @@ capability_put(struct CapabilityIndex *idx, const char *cap)
        entry->cap = rb_strdup(cap);
        entry->flags = 0;
        entry->value = idx->highest_bit;
+       entry->ownerdata = ownerdata;
 
        irc_dictionary_add(idx->cap_dict, entry->cap, entry);
 
index 88303ff2038a12ea39825f028479f15f20a87c55..f6a225a137657956bbd1adba12b66ce244e7e17f 100644 (file)
@@ -83,7 +83,7 @@ mr_capab(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
        {
                char *t = LOCAL_COPY(parv[i]);
                for (s = rb_strtok_r(t, " ", &p); s; s = rb_strtok_r(NULL, " ", &p))
-                       client_p->localClient->caps |= capability_get(serv_capindex, s);
+                       client_p->localClient->caps |= capability_get(serv_capindex, s, NULL);
        }
 
        return 0;
@@ -110,7 +110,7 @@ me_gcap(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
        source_p->serv->fullcaps = rb_strdup(parv[1]);
 
        for (s = rb_strtok_r(t, " ", &p); s; s = rb_strtok_r(NULL, " ", &p))
-               source_p->serv->caps |= capability_get(serv_capindex, s);
+               source_p->serv->caps |= capability_get(serv_capindex, s, NULL);
 
        return 0;
 }