typedef int (*rb_walker_t)(void *ctx, void *data);
typedef void (*rb_free_t)(void *data);
-rbtree_t *rbtree_create(rb_comparator_t compare, rb_free_t node_free, int flags);
+rbtree_t *rbtree_create(TALLOC_CTX *ctx, rb_comparator_t compare, rb_free_t node_free, int flags);
void rbtree_free(rbtree_t *tree);
bool rbtree_insert(rbtree_t *tree, void *data);
rbnode_t *rbtree_insert_node(rbtree_t *tree, void *data);
if (!pl) return NULL;
memset(pl, 0, sizeof(*pl));
- pl->tree = rbtree_create(packet_entry_cmp, NULL, 0);
+ pl->tree = rbtree_create(NULL, packet_entry_cmp, NULL, 0);
if (!pl->tree) {
fr_packet_list_free(pl);
return NULL;
/** Create a new RED-BLACK tree
*
*/
-rbtree_t *rbtree_create(rb_comparator_t compare, rb_free_t node_free, int flags)
+rbtree_t *rbtree_create(TALLOC_CTX *ctx, rb_comparator_t compare, rb_free_t node_free, int flags)
{
rbtree_t *tree;
* Create a tree for it.
*/
if (!clients->trees[client->ipaddr.prefix]) {
- clients->trees[client->ipaddr.prefix] = rbtree_create(client_ipaddr_cmp, NULL, 0);
+ clients->trees[client->ipaddr.prefix] = rbtree_create(clients, client_ipaddr_cmp, NULL, 0);
if (!clients->trees[client->ipaddr.prefix]) {
return 0;
}
#ifdef WITH_STATS
if (!tree_num) {
- tree_num = rbtree_create(client_num_cmp, NULL, 0);
+ tree_num = rbtree_create(clients, client_num_cmp, NULL, 0);
}
#ifdef WITH_DYNAMIC_CLIENTS
if (!cs->name2) goto error;
}
- cs->pair_tree = rbtree_create(pair_cmp, NULL, 0);
+ cs->pair_tree = rbtree_create(cs, pair_cmp, NULL, 0);
if (!cs->pair_tree) goto error;
talloc_set_destructor((void *) cs, cf_section_free);
CONF_SECTION *name1_cs;
if (!cs->section_tree) {
- cs->section_tree = rbtree_create(section_cmp, NULL, 0);
+ cs->section_tree = rbtree_create(cs, section_cmp, NULL, 0);
if (!cs->section_tree) {
ERROR("Out of memory");
fr_exit_now(1);
* sub-section based on name2.
*/
if (!name1_cs->name2_tree) {
- name1_cs->name2_tree = rbtree_create(name2_cmp,
- NULL, 0);
+ name1_cs->name2_tree = rbtree_create(name1_cs, name2_cmp, NULL, 0);
if (!name1_cs->name2_tree) {
ERROR("Out of memory");
fr_exit_now(1);
case CONF_ITEM_DATA:
if (!cs->data_tree) {
- cs->data_tree = rbtree_create(data_cmp, NULL, 0);
+ cs->data_tree = rbtree_create(cs, data_cmp, NULL, 0);
}
if (cs->data_tree) {
rbtree_insert(cs->data_tree, ci);
cf_section_filename(cs));
}
- components = rbtree_create(indexed_modcallable_cmp, NULL, 0);
- if (!components) {
- ERROR("Failed to initialize components\n");
- goto error;
- }
-
server = talloc_zero(cs, virtual_server_t);
server->name = name;
server->created = time(NULL);
server->cs = cs;
- server->components = components;
+ server->components = components = rbtree_create(server, indexed_modcallable_cmp, NULL, 0);
+ if (!components) {
+ ERROR("Failed to initialize components");
+ goto error;
+ }
talloc_set_destructor(server, virtual_server_free);
/*
/*
* Set up the internal module struct.
*/
- module_tree = rbtree_create(module_entry_cmp, NULL, 0);
+ module_tree = rbtree_create(NULL, module_entry_cmp, NULL, 0);
if (!module_tree) {
ERROR("Failed to initialize modules\n");
return -1;
}
- instance_tree = rbtree_create(module_instance_cmp,
+ instance_tree = rbtree_create(NULL, module_instance_cmp,
module_instance_free, 0);
if (!instance_tree) {
ERROR("Failed to initialize modules\n");
talloc_set_log_stderr();
- filename_tree = rbtree_create(filename_cmp, NULL, 0);
+ filename_tree = rbtree_create(NULL, filename_cmp, NULL, 0);
if (!filename_tree) {
oom:
ERROR("Out of memory");
usage(64);
}
- link_tree = rbtree_create((rbcmp) rs_rtx_cmp, _unmark_link, 0);
+ link_tree = rbtree_create(conf, (rbcmp) rs_rtx_cmp, _unmark_link, 0);
if (!link_tree) {
ERROR("Failed creating RTX tree");
goto finish;
/*
* Setup the request tree
*/
- request_tree = rbtree_create((rbcmp) rs_packet_cmp, _unmark_request, 0);
+ request_tree = rbtree_create(conf, (rbcmp) rs_packet_cmp, _unmark_request, 0);
if (!request_tree) {
ERROR("Failed creating request tree");
goto finish;
if (realms_byname) return 1;
- realms_byname = rbtree_create(realm_name_cmp, free, 0);
+ realms_byname = rbtree_create(NULL, realm_name_cmp, free, 0);
if (!realms_byname) {
realms_free();
return 0;
}
#ifdef WITH_PROXY
- home_servers_byaddr = rbtree_create(home_server_addr_cmp, home_server_free, 0);
+ home_servers_byaddr = rbtree_create(NULL, home_server_addr_cmp, home_server_free, 0);
if (!home_servers_byaddr) {
realms_free();
return 0;
}
- home_servers_byname = rbtree_create(home_server_name_cmp, NULL, 0);
+ home_servers_byname = rbtree_create(NULL, home_server_name_cmp, NULL, 0);
if (!home_servers_byname) {
realms_free();
return 0;
}
#ifdef WITH_STATS
- home_servers_bynumber = rbtree_create(home_server_number_cmp, NULL, 0);
+ home_servers_bynumber = rbtree_create(NULL, home_server_number_cmp, NULL, 0);
if (!home_servers_bynumber) {
realms_free();
return 0;
}
#endif
- home_pools_byname = rbtree_create(home_pool_name_cmp, NULL, 0);
+ home_pools_byname = rbtree_create(NULL, home_pool_name_cmp, NULL, 0);
if (!home_pools_byname) {
realms_free();
return 0;
int i;
#endif
- xlat_root = rbtree_create(xlat_cmp, free, 0);
+ xlat_root = rbtree_create(NULL, xlat_cmp, free, 0);
if (!xlat_root) {
DEBUG("xlat_register: Failed to create tree");
return -1;
/*
* The cache.
*/
- inst->cache = rbtree_create(cache_entry_cmp, cache_entry_free, 0);
+ inst->cache = rbtree_create(inst, cache_entry_cmp, cache_entry_free, 0);
if (!inst->cache) {
ERROR("Failed to create cache");
return -1;
* Lookup sessions in the tree. We don't free them in
* the tree, as that's taken care of elsewhere...
*/
- inst->session_tree = rbtree_create(eap_handler_cmp, NULL, 0);
+ inst->session_tree = rbtree_create(inst, eap_handler_cmp, NULL, 0);
if (!inst->session_tree) {
ERROR("rlm_eap (%s): Cannot initialize tree", inst->xlat_name);
return -1;
}
if (fr_debug_flag) {
- inst->handler_tree = rbtree_create(eap_handler_ptr_cmp, NULL, 0);
+ inst->handler_tree = rbtree_create(inst, eap_handler_ptr_cmp, NULL, 0);
if (!inst->handler_tree) {
ERROR("rlm_eap (%s): Cannot initialize tree", inst->xlat_name);
return -1;
* Lookup sessions in the tree. We don't free them in
* the tree, as that's taken care of elsewhere...
*/
- inst->session_tree = rbtree_create(securid_session_cmp, NULL, 0);
+ inst->session_tree = rbtree_create(inst, securid_session_cmp, NULL, 0);
if (!inst->session_tree) {
ERROR("rlm_securid: Cannot initialize session tree");
return -1;
nextseed, thresh, mask, n);
nextseed = rand();
- t = rbtree_create(comp, free, RBTREE_FLAG_LOCK);
+ t = rbtree_create(NULL, comp, free, RBTREE_FLAG_LOCK);
/* Find out the value of the NIL node */
NIL = t->root->left;