45 #include <ldns/ldns.h>
48 static const char* zl_str =
"zonelist";
56 zone_compare(
const void* a,
const void* b)
83 ods_log_error(
"[%s] cannot create: no allocator available", zl_str);
90 ods_log_error(
"[%s] cannot create: allocator failed", zl_str);
96 zlist->
zones = ldns_rbtree_create(zone_compare);
110 const char* rngfile = ODS_SE_RNGDIR
"/zonelist.rng";
133 static ldns_rbnode_t*
136 ldns_rbnode_t* node = (ldns_rbnode_t*) malloc(
sizeof(ldns_rbnode_t));
153 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
155 if (!zonelist || !zonelist->
zones) {
156 ods_log_error(
"[%s] unable to lookup zone: no zonelist", zl_str);
162 ods_log_error(
"[%s] unable to lookup zone: zone is null", zl_str);
167 node = ldns_rbtree_search(zonelist->
zones, zone);
186 if (!zonelist || !zonelist->
zones || !name || !klass) {
196 ods_log_error(
"[%s] unable to lookup zone: create zone failed", zl_str);
199 result = zonelist_lookup_zone(zonelist, zone);
212 ldns_rbnode_t* new_node = NULL;
215 ods_log_error(
"[%s] unable to add zone: zone is null", zl_str);
219 if (!zlist || !zlist->
zones) {
220 ods_log_error(
"[%s] unable to add zone %s: no zonelist", zl_str,
228 if (zonelist_lookup_zone(zlist, zone) != NULL) {
235 new_node = zone2node(zone);
236 if (ldns_rbtree_insert(zlist->
zones, new_node) == NULL) {
237 ods_log_error(
"[%s] unable to add zone %s: rbtree insert failed",
239 free((
void*) new_node);
256 ldns_rbnode_t* old_node = LDNS_RBTREE_NULL;
263 if (!zlist || !zlist->
zones) {
264 ods_log_error(
"[%s] unable to delete zone %s: no zone list", zl_str,
271 old_node = ldns_rbtree_delete(zlist->
zones, zone);
277 free((
void*) old_node);
291 ldns_rbnode_t* n1 = LDNS_RBTREE_NULL;
292 ldns_rbnode_t* n2 = LDNS_RBTREE_NULL;
301 n1 = ldns_rbtree_first(zl1->
zones);
302 n2 = ldns_rbtree_first(zl2->
zones);
303 while (n2 && n2 != LDNS_RBTREE_NULL) {
305 if (n1 && n1 != LDNS_RBTREE_NULL) {
321 n2 = ldns_rbtree_next(n2);
324 ret = zone_compare(z1, z2);
329 n1 = ldns_rbtree_next(n1);
330 }
else if (ret > 0) {
337 n2 = ldns_rbtree_next(n2);
340 n1 = ldns_rbtree_next(n1);
341 n2 = ldns_rbtree_next(n2);
353 while (n1 && n1 != LDNS_RBTREE_NULL) {
357 n1 = ldns_rbtree_next(n1);
376 char* datestamp = NULL;
380 if (!zl|| !zl->
zones) {
381 ods_log_error(
"[%s] cannot update: no zonelist storaga", zl_str);
394 if (st_mtime <= zl->last_modified) {
396 "%Y-%m-%d %T", &datestamp);
398 zl_str, zlfile, datestamp?datestamp:
"Unknown");
399 free((
void*)datestamp);
418 status = zonelist_read(new_zlist, zlfile);
424 zonelist_merge(zl, new_zlist);
427 ods_log_debug(
"[%s] file %s is modified since %s", zl_str, zlfile,
428 datestamp?datestamp:
"Unknown");
429 free((
void*)datestamp);
431 ods_log_error(
"[%s] unable to read file %s: %s", zl_str, zlfile,
446 zone_delfunc(ldns_rbnode_t* elem)
450 if (elem && elem != LDNS_RBTREE_NULL) {
452 zone_delfunc(elem->left);
453 zone_delfunc(elem->right);
468 node_delfunc(ldns_rbnode_t* elem)
470 if (elem && elem != LDNS_RBTREE_NULL) {
471 node_delfunc(elem->left);
472 node_delfunc(elem->right);
495 zone_delfunc(zl->
zones->root);
496 ldns_rbtree_free(zl->
zones);
524 node_delfunc(zl->
zones->root);
525 ldns_rbtree_free(zl->
zones);