Lines Matching refs:fwd
70 struct iter_forwards* fwd = (struct iter_forwards*)calloc(1,
72 if(!fwd)
74 lock_rw_init(&fwd->lock);
75 return fwd;
92 static void fwd_del_tree(struct iter_forwards* fwd)
94 if(fwd->tree)
95 traverse_postorder(fwd->tree, &delfwdnode, NULL);
96 free(fwd->tree);
100 forwards_delete(struct iter_forwards* fwd)
102 if(!fwd)
104 lock_rw_destroy(&fwd->lock);
105 fwd_del_tree(fwd);
106 free(fwd);
111 forwards_insert_data(struct iter_forwards* fwd, uint16_t c, uint8_t* nm,
131 if(!rbtree_insert(fwd->tree, &node->node)) {
144 forwards_insert(struct iter_forwards* fwd, uint16_t c, struct delegpt* dp)
146 return forwards_insert_data(fwd, c, dp->name, dp->namelen,
152 fwd_init_parents(struct iter_forwards* fwd)
156 RBTREE_FOR(node, struct iter_forward_zone*, fwd->tree) {
204 /** set fwd host names */
235 /** set fwd server addresses */
266 read_forwards(struct iter_forwards* fwd, struct config_file* cfg)
291 if(!forwards_insert(fwd, LDNS_RR_CLASS_IN, dp))
299 fwd_add_stub_hole(struct iter_forwards* fwd, uint16_t c, uint8_t* nm)
306 return forwards_insert_data(fwd, key.dclass, key.name,
312 make_stub_holes(struct iter_forwards* fwd, struct config_file* cfg)
324 if(!fwd_add_stub_hole(fwd, LDNS_RR_CLASS_IN, dname)) {
336 make_auth_holes(struct iter_forwards* fwd, struct config_file* cfg)
348 if(!fwd_add_stub_hole(fwd, LDNS_RR_CLASS_IN, dname)) {
359 forwards_apply_cfg(struct iter_forwards* fwd, struct config_file* cfg)
361 if(fwd->tree) {
362 lock_unprotect(&fwd->lock, fwd->tree);
364 fwd_del_tree(fwd);
365 fwd->tree = rbtree_create(fwd_cmp);
366 if(!fwd->tree)
368 lock_protect(&fwd->lock, fwd->tree, sizeof(*fwd->tree));
370 lock_rw_wrlock(&fwd->lock);
372 if(!read_forwards(fwd, cfg)) {
373 lock_rw_unlock(&fwd->lock);
376 if(!make_stub_holes(fwd, cfg)) {
377 lock_rw_unlock(&fwd->lock);
386 if(!make_auth_holes(fwd, cfg)) {
387 lock_rw_unlock(&fwd->lock);
390 fwd_init_parents(fwd);
391 lock_rw_unlock(&fwd->lock);
396 forwards_find(struct iter_forwards* fwd, uint8_t* qname, uint16_t qclass,
407 if(!nolock) { lock_rw_rdlock(&fwd->lock); }
408 res = (struct iter_forward_zone*)rbtree_search(fwd->tree, &key);
410 if(!has_dp && !nolock) { lock_rw_unlock(&fwd->lock); }
415 forwards_lookup(struct iter_forwards* fwd, uint8_t* qname, uint16_t qclass,
428 if(!nolock) { lock_rw_rdlock(&fwd->lock); }
429 if(rbtree_find_less_equal(fwd->tree, &key, &res)) {
437 if(!nolock) { lock_rw_unlock(&fwd->lock); }
450 if(!has_dp && !nolock) { lock_rw_unlock(&fwd->lock); }
455 forwards_lookup_root(struct iter_forwards* fwd, uint16_t qclass, int nolock)
458 return forwards_lookup(fwd, &root, qclass, nolock);
464 next_root_locked(struct iter_forwards* fwd, uint16_t* dclass)
471 n = rbtree_first(fwd->tree);
481 return next_root_locked(fwd, dclass);
492 if(rbtree_find_less_equal(fwd->tree, &key, &n)) {
509 return next_root_locked(fwd, dclass);
514 forwards_next_root(struct iter_forwards* fwd, uint16_t* dclass, int nolock)
518 if(!nolock) { lock_rw_rdlock(&fwd->lock); }
519 ret = next_root_locked(fwd, dclass);
520 if(!nolock) { lock_rw_unlock(&fwd->lock); }
525 forwards_get_mem(struct iter_forwards* fwd)
529 if(!fwd)
531 lock_rw_rdlock(&fwd->lock);
532 s = sizeof(*fwd) + sizeof(*fwd->tree);
533 RBTREE_FOR(p, struct iter_forward_zone*, fwd->tree) {
536 lock_rw_unlock(&fwd->lock);
541 fwd_zone_find(struct iter_forwards* fwd, uint16_t c, uint8_t* nm)
548 return (struct iter_forward_zone*)rbtree_search(fwd->tree, &key);
552 forwards_add_zone(struct iter_forwards* fwd, uint16_t c, struct delegpt* dp,
557 if(!nolock) { lock_rw_wrlock(&fwd->lock); }
558 if((z=fwd_zone_find(fwd, c, dp->name)) != NULL) {
559 (void)rbtree_delete(fwd->tree, &z->node);
562 if(!forwards_insert(fwd, c, dp)) {
563 if(!nolock) { lock_rw_unlock(&fwd->lock); }
566 fwd_init_parents(fwd);
567 if(!nolock) { lock_rw_unlock(&fwd->lock); }
572 forwards_delete_zone(struct iter_forwards* fwd, uint16_t c, uint8_t* nm,
577 if(!nolock) { lock_rw_wrlock(&fwd->lock); }
578 if(!(z=fwd_zone_find(fwd, c, nm))) {
579 if(!nolock) { lock_rw_unlock(&fwd->lock); }
582 (void)rbtree_delete(fwd->tree, &z->node);
584 fwd_init_parents(fwd);
585 if(!nolock) { lock_rw_unlock(&fwd->lock); }
589 forwards_add_stub_hole(struct iter_forwards* fwd, uint16_t c, uint8_t* nm,
593 if(!nolock) { lock_rw_wrlock(&fwd->lock); }
594 if(fwd_zone_find(fwd, c, nm) != NULL) {
595 if(!nolock) { lock_rw_unlock(&fwd->lock); }
598 if(!fwd_add_stub_hole(fwd, c, nm)) {
599 if(!nolock) { lock_rw_unlock(&fwd->lock); }
602 fwd_init_parents(fwd);
603 if(!nolock) { lock_rw_unlock(&fwd->lock); }
608 forwards_delete_stub_hole(struct iter_forwards* fwd, uint16_t c,
613 if(!nolock) { lock_rw_wrlock(&fwd->lock); }
614 if(!(z=fwd_zone_find(fwd, c, nm))) {
615 if(!nolock) { lock_rw_unlock(&fwd->lock); }
619 if(!nolock) { lock_rw_unlock(&fwd->lock); }
622 (void)rbtree_delete(fwd->tree, &z->node);
624 fwd_init_parents(fwd);
625 if(!nolock) { lock_rw_unlock(&fwd->lock); }
629 forwards_swap_tree(struct iter_forwards* fwd, struct iter_forwards* data)
631 rbtree_type* oldtree = fwd->tree;
633 lock_unprotect(&fwd->lock, oldtree);
638 fwd->tree = data->tree;
640 lock_protect(&fwd->lock, fwd->tree, sizeof(*fwd->tree));