((unsigned char *)(ipaddress.in6_16))[15] = (currentlocalunum%253)+1;
newuser->ipnode = refnode(iptree, &ipaddress, PATRICIA_MAXBITS);
- newuser->ipnode->usercount++;
+ node_increment_usercount(newuser->ipnode);
newuser->timestamp=getnettime();
newuser->shident=NULL;
freesstring(np->shident); /* freesstring(NULL) is OK */
freesstring(np->sethost);
- np->ipnode->usercount--;
+ node_decrement_usercount(np->ipnode);
derefnode(iptree, np->ipnode);
/* TODO: figure out how to cleanly remove nodes without affecting other modules */
base64toip(cargv[cargc-3], &ipaddress);
/* todo: use a single node for /64 prefixes */
np->ipnode = refnode(iptree, &ipaddress, irc_in_addr_is_ipv4(&ipaddress) ? PATRICIA_MAXBITS : 64);
- np->ipnode->usercount++;
+ node_increment_usercount(np->ipnode);
np->shident=NULL;
np->sethost=NULL;
int findnodeext(const char *name);
void releasenodeext(int index);
+void node_increment_usercount( patricia_node_t *node);
+void node_decrement_usercount( patricia_node_t *node);
+
/* alloc */
void freeprefix (prefix_t *prefix);
prefix_t *newprefix();
controlreply(np,"%p: bit: %d, usercount: %d, IP: %s", node, node->bit, node->usercount, IPtostr(node->prefix->sin));
break;
case 3:
- controlreply(np,"%p: L: %p, R: %p", node, node->l, node->r);
+ controlreply(np,"%p: L: %p, R: %p P: %p", node, node->l, node->r, node->parent);
break;
case 4:
controlreply(np,"%p: 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node,
controlreply(np,"%p: bit: %d, usercount: %d, IP: %s", node, node->bit, node->usercount, node->prefix?IPtostr(node->prefix->sin):"");
break;
case 13:
- controlreply(np,"%p: L: %p, R: %p", node, node->l, node->r);
+ controlreply(np,"%p: L: %p, R: %p P: %p", node, node->l, node->r, node->parent);
break;
case 14:
controlreply(np,"%p%s 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node, node->prefix?"-":":",
head = refnode(iptree, &sin, bits);
- count = 0;
-
- PATRICIA_WALK(head, node) {
- count += node->usercount;
- } PATRICIA_WALK_END;
+ count = head->usercount;
derefnode(iptree, head);
}
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 &&
if (bitlen == differ_bit) {
if (bitlen < patricia->maxbits &&
- (is_bit_set(addr,bitlen))) {
+ (is_bit_set(test_addr,bitlen))) {
new_node->r = node;
}
else {
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;
node->parent->l = glue;
}
node->parent = glue;
+ glue->usercount = node->usercount;
}
+
return (new_node);
}
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;
+ }
+}