+ rb_dlinkDelete(&rdata->rnode, &reject_list);
+ rb_free(rdata);
+ rb_patricia_remove(reject_tree, pnode);
+ return 1;
+ }
+ return 0;
+}
+
+int
+remove_reject_mask(const char *mask1, const char *mask2)
+{
+ rb_dlink_node *ptr, *next;
+ rb_patricia_node_t *pnode;
+ struct reject_data *rdata;
+ uint32_t hashv;
+ int n = 0;
+
+ hashv = 0;
+ if (mask1 != NULL)
+ hashv ^= fnv_hash_upper(mask1, 32);
+ if (mask2 != NULL)
+ hashv ^= fnv_hash_upper(mask2, 32);
+ RB_DLINK_FOREACH_SAFE(ptr, next, reject_list.head)
+ {
+ pnode = ptr->data;
+ rdata = pnode->data;
+ if (rdata->mask_hashv == hashv)
+ {
+ rb_dlinkDelete(ptr, &reject_list);
+ rb_free(rdata);
+ rb_patricia_remove(reject_tree, pnode);
+ n++;
+ }
+ }
+ return n;
+}
+
+
+int
+add_unknown_ip(struct Client *client_p)
+{
+ rb_patricia_node_t *pnode;
+
+ if((pnode = rb_match_ip(unknown_tree, (struct sockaddr *)&client_p->localClient->ip)) == NULL)
+ {
+ int bitlen = 32;
+#ifdef RB_IPV6
+ if(client_p->localClient->ip.ss_family == AF_INET6)
+ bitlen = 128;
+#endif
+ pnode = make_and_lookup_ip(unknown_tree, (struct sockaddr *)&client_p->localClient->ip, bitlen);
+ pnode->data = (void *)0;
+ }
+
+ if((unsigned long)pnode->data >= ConfigFileEntry.max_unknown_ip)
+ {
+ SetExUnknown(client_p);
+ SetReject(client_p);
+ rb_setselect(client_p->localClient->F, RB_SELECT_WRITE | RB_SELECT_READ, NULL, NULL);
+ SetClosing(client_p);
+ rb_dlinkMoveNode(&client_p->localClient->tnode, &unknown_list, &delay_exit);