static int
modinit(void)
{
- CAP_REMOVE = capability_put(serv_capindex, "REMOVE");
+ CAP_REMOVE = capability_put(serv_capindex, "REMOVE", NULL);
return 0;
}
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);
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;
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;
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);
{
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;
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;
}