42 #include <ldns/ldns.h>
45 static const char* zl_str =
"zonelist";
53 zone_compare(
const void* a,
const void* b)
65 return ldns_dname_compare(x->
apex, y->
apex);
79 ods_log_error(
"[%s] unable to create zonelist: allocator_alloc() "
83 zlist->
zones = ldns_rbtree_create(zone_compare);
85 ods_log_error(
"[%s] unable to create zonelist: ldns_rbtree_create() "
91 pthread_mutex_init(&zlist->
zl_lock, NULL);
103 const char* rngfile = ODS_SE_RNGDIR
"/zonelist.rng";
104 ods_status status = ODS_STATUS_OK;
105 ods_log_assert(zlfile);
106 ods_log_verbose(
"[%s] read file %s", zl_str, zlfile);
108 if (status != ODS_STATUS_OK) {
109 ods_log_error(
"[%s] unable to read file: parse error in %s", zl_str,
121 static ldns_rbnode_t*
124 ldns_rbnode_t* node = (ldns_rbnode_t*) malloc(
sizeof(ldns_rbnode_t));
141 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
142 if (zonelist && zonelist->
zones && zone) {
143 node = ldns_rbtree_search(zonelist->
zones, zone);
162 if (zonelist && zonelist->
zones && name && klass) {
165 ods_log_error(
"[%s] unable to lookup zone %s: "
166 "zone_create() failed", zl_str, name);
169 result = zonelist_lookup_zone(zonelist, zone);
187 if (zonelist && zonelist->
zones && dname && klass) {
188 name = ldns_rdf2str(dname);
203 ldns_rbnode_t* new_node = NULL;
207 if (!zlist || !zlist->
zones) {
212 if (zonelist_lookup_zone(zlist, zone) != NULL) {
213 ods_log_warning(
"[%s] unable to add zone %s: already present", zl_str,
219 new_node = zone2node(zone);
220 if (ldns_rbtree_insert(zlist->
zones, new_node) == NULL) {
221 ods_log_error(
"[%s] unable to add zone %s: ldns_rbtree_insert() "
222 "failed", zl_str, zone->
name);
223 free((
void*) new_node);
240 ldns_rbnode_t* old_node = LDNS_RBTREE_NULL;
242 if (!zlist || !zlist->
zones) {
243 goto zone_not_present;
245 old_node = ldns_rbtree_delete(zlist->
zones, zone);
247 goto zone_not_present;
249 free((
void*) old_node);
253 ods_log_warning(
"[%s] unable to delete zone %s: not present", zl_str,
267 ldns_rbnode_t* n1 = LDNS_RBTREE_NULL;
268 ldns_rbnode_t* n2 = LDNS_RBTREE_NULL;
273 ods_log_assert(zl1->
zones);
274 ods_log_assert(zl2->
zones);
275 ods_log_debug(
"[%s] merge two zone lists", zl_str);
277 n1 = ldns_rbtree_first(zl1->
zones);
278 n2 = ldns_rbtree_first(zl2->
zones);
279 while (n2 && n2 != LDNS_RBTREE_NULL) {
281 if (n1 && n1 != LDNS_RBTREE_NULL) {
293 ods_log_crit(
"[%s] merge failed: z2 not added", zl_str);
296 n2 = ldns_rbtree_next(n2);
299 ret = zone_compare(z1, z2);
304 n1 = ldns_rbtree_next(n1);
305 }
else if (ret > 0) {
309 ods_log_crit(
"[%s] merge failed: z2 not added", zl_str);
312 n2 = ldns_rbtree_next(n2);
315 n1 = ldns_rbtree_next(n1);
316 n2 = ldns_rbtree_next(n2);
327 while (n1 && n1 != LDNS_RBTREE_NULL) {
331 n1 = ldns_rbtree_next(n1);
346 ods_status status = ODS_STATUS_OK;
347 char* datestamp = NULL;
349 ods_log_debug(
"[%s] update zone list", zl_str);
350 if (!zl|| !zl->
zones || !zlfile) {
351 return ODS_STATUS_ASSERT_ERR;
357 st_mtime = ods_file_lastmodified(zlfile);
358 if (st_mtime <= zl->last_modified) {
359 (void)time_datestamp(zl->
last_modified,
"%Y-%m-%d %T", &datestamp);
360 ods_log_debug(
"[%s] zonelist file %s is unchanged since %s",
361 zl_str, zlfile, datestamp?datestamp:
"Unknown");
362 free((
void*)datestamp);
363 return ODS_STATUS_UNCHANGED;
368 ods_log_error(
"[%s] unable to update zonelist: zonelist_create() "
370 return ODS_STATUS_ERR;
373 status = zonelist_read(new_zlist, zlfile);
374 if (status == ODS_STATUS_OK) {
379 zonelist_merge(zl, new_zlist);
380 (void)time_datestamp(zl->
last_modified,
"%Y-%m-%d %T", &datestamp);
381 ods_log_debug(
"[%s] file %s is modified since %s", zl_str, zlfile,
382 datestamp?datestamp:
"Unknown");
383 free((
void*)datestamp);
385 ods_log_error(
"[%s] unable to update zonelist: read file %s failed "
386 "(%s)", zl_str, zlfile, ods_status2str(status));
398 zone_delfunc(ldns_rbnode_t* elem)
401 if (elem && elem != LDNS_RBTREE_NULL) {
403 zone_delfunc(elem->left);
404 zone_delfunc(elem->right);
405 ods_log_deeebug(
"[%s] cleanup zone %s", zl_str, zone->
name);
417 node_delfunc(ldns_rbnode_t* elem)
419 if (elem && elem != LDNS_RBTREE_NULL) {
420 node_delfunc(elem->left);
421 node_delfunc(elem->right);
437 ods_log_debug(
"[%s] cleanup zonelist", zl_str);
439 zone_delfunc(zl->
zones->root);
440 ldns_rbtree_free(zl->
zones);
443 pthread_mutex_destroy(&zl->
zl_lock);
459 node_delfunc(zl->
zones->root);
460 ldns_rbtree_free(zl->
zones);
463 pthread_mutex_destroy(&zl->
zl_lock);
ods_status parse_file_check(const char *cfgfile, const char *rngfile)
void zone_merge(zone_type *z1, zone_type *z2)
zone_type * zone_create(char *name, ldns_rr_class klass)
void zone_cleanup(zone_type *zone)
zone_type * zonelist_lookup_zone_by_name(zonelist_type *zonelist, const char *name, ldns_rr_class klass)
void zonelist_del_zone(zonelist_type *zlist, zone_type *zone)
void zonelist_free(zonelist_type *zl)
ods_status zonelist_update(zonelist_type *zl, const char *zlfile)
void zonelist_cleanup(zonelist_type *zl)
zonelist_type * zonelist_create()
zone_type * zonelist_add_zone(zonelist_type *zlist, zone_type *zone)
zone_type * zonelist_lookup_zone_by_dname(zonelist_type *zonelist, ldns_rdf *dname, ldns_rr_class klass)
ods_status parse_zonelist_zones(void *zlist, const char *zlfile)