X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/ff12cc94790de2e87e78ee7aa378f21fa415d73c..7e6b5384b33e99d3cd9ec2f38fde3f0e1d142fa4:/ircd/capability.c diff --git a/ircd/capability.c b/ircd/capability.c index daf72657..38a6c5a5 100644 --- a/ircd/capability.c +++ b/ircd/capability.c @@ -20,29 +20,23 @@ #include "stdinc.h" #include "capability.h" -#include "irc_dictionary.h" +#include "rb_dictionary.h" #include "s_assert.h" static rb_dlink_list capability_indexes = { NULL, NULL, 0 }; -struct CapabilityIndex { - char *name; - struct Dictionary *cap_dict; - unsigned int highest_bit; - rb_dlink_node node; -}; - -#define CAP_ORPHANED 0x1 -#define CAP_REQUIRED 0x2 +struct CapabilityEntry * +capability_find(struct CapabilityIndex *idx, const char *cap) +{ + s_assert(idx != NULL); + if (cap == NULL) + return NULL; -struct CapabilityEntry { - char *cap; - unsigned int value; - unsigned int flags; -}; + return rb_dictionary_retrieve(idx->cap_dict, cap); +} unsigned int -capability_get(struct CapabilityIndex *idx, const char *cap) +capability_get(struct CapabilityIndex *idx, const char *cap, void **ownerdata) { struct CapabilityEntry *entry; @@ -50,15 +44,19 @@ capability_get(struct CapabilityIndex *idx, const char *cap) if (cap == NULL) return 0; - entry = irc_dictionary_retrieve(idx->cap_dict, cap); + entry = rb_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; @@ -66,18 +64,19 @@ capability_put(struct CapabilityIndex *idx, const char *cap) if (!idx->highest_bit) return 0xFFFFFFFF; - if ((entry = irc_dictionary_retrieve(idx->cap_dict, cap)) != NULL) + if ((entry = rb_dictionary_retrieve(idx->cap_dict, cap)) != NULL) { entry->flags &= ~CAP_ORPHANED; return (1 << entry->value); } entry = rb_malloc(sizeof(struct CapabilityEntry)); - entry->cap = rb_strdup(cap); + entry->cap = cap; entry->flags = 0; entry->value = idx->highest_bit; + entry->ownerdata = ownerdata; - irc_dictionary_add(idx->cap_dict, entry->cap, entry); + rb_dictionary_add(idx->cap_dict, entry->cap, entry); idx->highest_bit++; if (idx->highest_bit % (sizeof(unsigned int) * 8) == 0) @@ -108,11 +107,12 @@ capability_orphan(struct CapabilityIndex *idx, const char *cap) s_assert(idx != NULL); - entry = irc_dictionary_retrieve(idx->cap_dict, cap); + entry = rb_dictionary_retrieve(idx->cap_dict, cap); if (entry != NULL) { entry->flags &= ~CAP_REQUIRED; entry->flags |= CAP_ORPHANED; + entry->ownerdata = NULL; } } @@ -123,7 +123,7 @@ capability_require(struct CapabilityIndex *idx, const char *cap) s_assert(idx != NULL); - entry = irc_dictionary_retrieve(idx->cap_dict, cap); + entry = rb_dictionary_retrieve(idx->cap_dict, cap); if (entry != NULL) entry->flags |= CAP_REQUIRED; } @@ -142,8 +142,8 @@ capability_index_create(const char *name) struct CapabilityIndex *idx; idx = rb_malloc(sizeof(struct CapabilityIndex)); - idx->name = rb_strdup(name); - idx->cap_dict = irc_dictionary_create(strcasecmp); + idx->name = name; + idx->cap_dict = rb_dictionary_create(name, strcasecmp); idx->highest_bit = 1; rb_dlinkAdd(idx, &idx->node, &capability_indexes); @@ -158,7 +158,7 @@ capability_index_destroy(struct CapabilityIndex *idx) rb_dlinkDelete(&idx->node, &capability_indexes); - irc_dictionary_destroy(idx->cap_dict, capability_destroy, NULL); + rb_dictionary_destroy(idx->cap_dict, capability_destroy, NULL); rb_free(idx); } @@ -179,7 +179,7 @@ capability_index_list(struct CapabilityIndex *idx, unsigned int cap_mask) { if ((1 << entry->value) & cap_mask) { - tl = rb_sprintf(t, "%s ", entry->cap); + tl = sprintf(t, "%s ", entry->cap); t += tl; } } @@ -238,20 +238,20 @@ capability_index_stats(void (*cb)(const char *line, void *privdata), void *privd struct DictionaryIter iter; struct CapabilityEntry *entry; - rb_snprintf(buf, sizeof buf, "'%s': allocated bits - %d", idx->name, (idx->highest_bit - 1)); + snprintf(buf, sizeof buf, "'%s': allocated bits - %d", idx->name, (idx->highest_bit - 1)); cb(buf, privdata); DICTIONARY_FOREACH(entry, &iter, idx->cap_dict) { - rb_snprintf(buf, sizeof buf, "bit %d: '%s'", entry->value, entry->cap); + snprintf(buf, sizeof buf, "bit %d: '%s'", entry->value, entry->cap); cb(buf, privdata); } - rb_snprintf(buf, sizeof buf, "'%s': remaining bits - %u", idx->name, + snprintf(buf, sizeof buf, "'%s': remaining bits - %u", idx->name, (unsigned int)((sizeof(unsigned int) * 8) - (idx->highest_bit - 1))); cb(buf, privdata); } - rb_snprintf(buf, sizeof buf, "%ld capability indexes", rb_dlink_list_length(&capability_indexes)); + snprintf(buf, sizeof buf, "%ld capability indexes", rb_dlink_list_length(&capability_indexes)); cb(buf, privdata); }