X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/cb5aa4cdd6af4114b18db464f022ef99a44304d7..3898f97325dbed800d4b424e68a0c2858b8d8be7:/patricia/patricialib.c?ds=sidebyside diff --git a/patricia/patricialib.c b/patricia/patricialib.c index 0752016c..009b1dbc 100644 --- a/patricia/patricialib.c +++ b/patricia/patricialib.c @@ -90,8 +90,8 @@ patricia_deref_prefix (prefix_t * prefix) prefix->ref_count--; if (prefix->ref_count <= 0) { - freeprefix(prefix); - return; + freeprefix(prefix); + return; } } @@ -374,7 +374,6 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix) } new_node = patricia_new_node(patricia, prefix->bitlen, patricia_ref_prefix (prefix)); - if (node->bit == differ_bit) { new_node->parent = node; if (node->bit < patricia->maxbits && @@ -391,7 +390,7 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix) if (bitlen == differ_bit) { if (bitlen < patricia->maxbits && - (is_bit_set(addr,bitlen))) { + (is_bit_set(test_addr,bitlen))) { new_node->r = node; } else { @@ -409,11 +408,11 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix) node->parent->l = new_node; } node->parent = new_node; + new_node->usercount = node->usercount; } else { glue = patricia_new_node(patricia, differ_bit, NULL); glue->parent = node->parent; - if (differ_bit < patricia->maxbits && (is_bit_set(addr, differ_bit))) { glue->r = new_node; @@ -436,7 +435,9 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix) node->parent->l = glue; } node->parent = glue; + glue->usercount = node->usercount; } + return (new_node); } @@ -572,3 +573,27 @@ patricia_node_t *patricia_new_node(patricia_tree_t *patricia, unsigned char bit, return new_node; } +void node_increment_usercount( patricia_node_t *node) { + while(node) { + node->usercount++; + node=node->parent; + } +} + +void node_decrement_usercount( patricia_node_t *node) { + while(node) { + node->usercount--; + node=node->parent; + } +} + +int is_normalized_ipmask( struct irc_in_addr *sin, unsigned char bitlen ) { + u_char *addr = (u_char *)sin; + + while (bitlen < PATRICIA_MAXBITS) { + if (is_bit_set(addr,bitlen)) + return 0; + bitlen++; + } + return 1; +}