Lines Matching refs:zones
2 * services/localzone.c - local zones authority service.
86 void local_zones_print(struct local_zones* zones)
89 lock_rw_rdlock(&zones->lock);
90 log_info("number of auth zones %u", (unsigned)zones->ztree.count);
91 RBTREE_FOR(z, struct local_zone*, &zones->ztree) {
94 lock_rw_unlock(&zones->lock);
100 struct local_zones* zones = (struct local_zones*)calloc(1,
101 sizeof(*zones));
102 if(!zones)
104 rbtree_init(&zones->ztree, &local_zone_cmp);
105 lock_rw_init(&zones->lock);
106 lock_protect(&zones->lock, &zones->ztree, sizeof(zones->ztree));
108 return zones;
111 /** helper traverse to delete zones */
120 local_zones_delete(struct local_zones* zones)
122 if(!zones)
124 lock_rw_destroy(&zones->lock);
125 /* walk through zones and delete them all */
126 traverse_postorder(&zones->ztree, lzdel, NULL);
127 free(zones);
205 /* also the zones->lock protects node, parent, name*, class */
211 lz_enter_zone_dname(struct local_zones* zones, uint8_t* nm, size_t len,
222 lock_rw_wrlock(&zones->lock);
224 if(!rbtree_insert(&zones->ztree, &z->node)) {
234 z = local_zones_find(zones, nm, len, labs, c);
236 lock_rw_unlock(&zones->lock);
240 lock_rw_unlock(&zones->lock);
246 lz_enter_zone(struct local_zones* zones, const char* name, const char* type,
263 if(!(z=lz_enter_zone_dname(zones, nm, len, labs, t, dclass))) {
639 lz_enter_rr_str(struct local_zones* zones, const char* rr)
652 lock_rw_rdlock(&zones->lock);
653 z = local_zones_lookup(zones, rr_name, len, labs, rr_class, rr_type);
655 lock_rw_unlock(&zones->lock);
659 lock_rw_unlock(&zones->lock);
668 lz_enter_zone_tag(struct local_zones* zones, char* zname, uint8_t* list,
682 lock_rw_rdlock(&zones->lock);
683 z = local_zones_find(zones, dname, dname_len, dname_labs, rr_class);
685 lock_rw_unlock(&zones->lock);
690 lock_rw_unlock(&zones->lock);
702 lz_enter_override(struct local_zones* zones, char* zname, char* netblock,
738 lock_rw_rdlock(&zones->lock);
739 z = local_zones_find(zones, dname, dname_len, dname_labs, rr_class);
741 lock_rw_unlock(&zones->lock);
746 lock_rw_unlock(&zones->lock);
785 lz_enter_zones(struct local_zones* zones, struct config_file* cfg)
796 lz_enter_zone(zones, p->str, p->str2,
806 lz_exists(struct local_zones* zones, const char* name)
815 lock_rw_rdlock(&zones->lock);
816 if(rbtree_search(&zones->ztree, &z.node)) {
817 lock_rw_unlock(&zones->lock);
821 lock_rw_unlock(&zones->lock);
847 add_empty_default(struct local_zones* zones, struct config_file* cfg,
852 if(lz_exists(zones, name) || lz_nodefault(cfg, name))
854 if(!(z=lz_enter_zone(zones, name, "static", LDNS_RR_CLASS_IN)))
871 /** enter default zones */
872 int local_zone_enter_defaults(struct local_zones* zones, struct config_file* cfg)
881 /* this list of zones is from RFC 6303 and RFC 7686 */
883 /* block localhost level zones first, then onion and later the LAN zones */
886 if(!lz_exists(zones, "localhost.") &&
888 if(!(z=lz_enter_zone(zones, "localhost.", "redirect",
906 if(!lz_exists(zones, "127.in-addr.arpa.") &&
908 if(!(z=lz_enter_zone(zones, "127.in-addr.arpa.", "static",
924 if(!lz_exists(zones, "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.") &&
926 if(!(z=lz_enter_zone(zones, "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.", "static",
942 if(!add_empty_default(zones, cfg, "home.arpa.")) {
947 if(!add_empty_default(zones, cfg, "resolver.arpa.")) {
952 if(!add_empty_default(zones, cfg, "service.arpa.")) {
957 if(!add_empty_default(zones, cfg, "onion.")) {
962 if(!add_empty_default(zones, cfg, "test.")) {
967 if(!add_empty_default(zones, cfg, "invalid.")) {
971 /* block AS112 zones, unless asked not to */
974 if(!add_empty_default(zones, cfg, *zstr)) {
985 lz_enter_overrides(struct local_zones* zones, struct config_file* cfg)
989 if(!lz_enter_override(zones, p->str, p->str2, p->str3,
1021 lz_init_parents(struct local_zones* zones)
1024 lock_rw_wrlock(&zones->lock);
1025 RBTREE_FOR(node, struct local_zone*, &zones->ztree) {
1033 lock_rw_unlock(&zones->lock);
1038 lz_setup_implicit(struct local_zones* zones, struct config_file* cfg)
1052 lz_init_parents(zones); /* to enable local_zones_lookup() */
1063 lock_rw_rdlock(&zones->lock);
1064 if(!local_zones_lookup(zones, rr_name, len, labs, rr_class,
1067 * under but for different class; created zones are
1071 struct local_zone* z = local_zones_lookup(zones,
1078 lock_rw_unlock(&zones->lock);
1088 lz_enter_zone_dname(zones, name,
1111 lock_rw_unlock(&zones->lock);
1122 lock_rw_unlock(&zones->lock);
1144 lz_enter_zone_dname(zones, n2, nmlen, match,
1152 return lz_setup_implicit(zones, cfg);
1159 lz_enter_zone_tags(struct local_zones* zones, struct config_file* cfg)
1164 if(!lz_enter_zone_tag(zones, p->str, p->str2, p->str2len,
1169 if(c) verbose(VERB_ALGO, "applied tags to %d local zones", c);
1175 lz_enter_data(struct local_zones* zones, struct config_file* cfg)
1179 if(!lz_enter_rr_str(zones, p->str))
1198 local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg)
1200 /* create zones from zone statements. */
1201 if(!lz_enter_zones(zones, cfg)) {
1204 /* apply default zones+content (unless disabled, or overridden) */
1205 if(!local_zone_enter_defaults(zones, cfg)) {
1209 if(!lz_enter_overrides(zones, cfg)) {
1213 if(!lz_setup_implicit(zones, cfg)) {
1218 lz_init_parents(zones);
1220 if(!lz_enter_zone_tags(zones, cfg)) {
1224 if(!lz_enter_data(zones, cfg)) {
1233 local_zones_lookup(struct local_zones* zones,
1236 return local_zones_tags_lookup(zones, name, len, labs,
1241 local_zones_tags_lookup(struct local_zones* zones,
1259 rbtree_find_less_equal(&zones->ztree, &key, &res);
1279 local_zones_find(struct local_zones* zones,
1289 return (struct local_zone*)rbtree_search(&zones->ztree, &key);
1293 local_zones_find_le(struct local_zones* zones,
1304 *exact = rbtree_find_less_equal(&zones->ztree, &key, &node);
1845 local_zones_answer(struct local_zones* zones, struct module_env* env,
1897 lock_rw_rdlock(&zones->lock);
1898 if(!(z = local_zones_tags_lookup(zones, qinfo->qname,
1901 lock_rw_unlock(&zones->lock);
1908 lock_rw_unlock(&zones->lock);
2019 /* both zones and z are locked already */
2040 struct local_zone* local_zones_add_zone(struct local_zones* zones,
2055 prev = local_zones_find_le(zones, name, len, labs, dclass, &exact);
2060 if(exact||!rbtree_insert(&zones->ztree, &z->node)) {
2075 void local_zones_del_zone(struct local_zones* zones, struct local_zone* z)
2082 (void)rbtree_delete(&zones->ztree, z);
2090 local_zones_add_RR(struct local_zones* zones, const char* rr)
2104 lock_rw_wrlock(&zones->lock);
2105 z = local_zones_lookup(zones, rr_name, len, labs, rr_class, rr_type);
2107 z = local_zones_add_zone(zones, rr_name, len, labs, rr_class,
2110 lock_rw_unlock(&zones->lock);
2117 lock_rw_unlock(&zones->lock);
2174 void local_zones_del_data(struct local_zones* zones,
2182 lock_rw_rdlock(&zones->lock);
2183 z = local_zones_lookup(zones, name, len, labs, dclass, LDNS_RR_TYPE_DS);
2193 lock_rw_unlock(&zones->lock);
2196 lock_rw_rdlock(&zones->lock);
2197 z = local_zones_lookup(zones, name, len, labs, dclass, 0);
2200 lock_rw_unlock(&zones->lock);
2204 lock_rw_unlock(&zones->lock);
2235 size_t local_zones_get_mem(struct local_zones* zones)
2239 if(!zones) return 0;
2240 m = sizeof(*zones);
2241 lock_rw_rdlock(&zones->lock);
2242 RBTREE_FOR(z, struct local_zone*, &zones->ztree) {
2245 lock_rw_unlock(&zones->lock);
2249 void local_zones_swap_tree(struct local_zones* zones, struct local_zones* data)
2251 rbtree_type oldtree = zones->ztree;
2252 zones->ztree = data->ztree;