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 lock_basic_init(&zlist->
zl_lock);
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;
244 if (!zlist || !zlist->
zones) {
245 goto zone_not_present;
247 old_node = ldns_rbtree_delete(zlist->
zones, zone);
249 goto zone_not_present;
251 free((
void*) old_node);
255 ods_log_warning(
"[%s] unable to delete zone %s: not present", zl_str,
270 ldns_rbnode_t* n1 = LDNS_RBTREE_NULL;
271 ldns_rbnode_t* n2 = LDNS_RBTREE_NULL;
276 ods_log_assert(zl1->
zones);
277 ods_log_assert(zl2->
zones);
278 ods_log_debug(
"[%s] merge two zone lists", zl_str);
280 n1 = ldns_rbtree_first(zl1->
zones);
281 n2 = ldns_rbtree_first(zl2->
zones);
282 while (n2 && n2 != LDNS_RBTREE_NULL) {
284 if (n1 && n1 != LDNS_RBTREE_NULL) {
296 ods_log_crit(
"[%s] merge failed: z2 not added", zl_str);
299 n2 = ldns_rbtree_next(n2);
302 ret = zone_compare(z1, z2);
307 n1 = ldns_rbtree_next(n1);
308 }
else if (ret > 0) {
312 ods_log_crit(
"[%s] merge failed: z2 not added", zl_str);
315 n2 = ldns_rbtree_next(n2);
318 n1 = ldns_rbtree_next(n1);
319 n2 = ldns_rbtree_next(n2);
330 while (n1 && n1 != LDNS_RBTREE_NULL) {
334 n1 = ldns_rbtree_next(n1);
349 ods_status status = ODS_STATUS_OK;
350 char* datestamp = NULL;
352 ods_log_debug(
"[%s] update zone list", zl_str);
353 if (!zl|| !zl->
zones || !zlfile) {
354 return ODS_STATUS_ASSERT_ERR;
360 st_mtime = ods_file_lastmodified(zlfile);
361 if (st_mtime <= zl->last_modified) {
362 (void)time_datestamp(zl->
last_modified,
"%Y-%m-%d %T", &datestamp);
363 ods_log_debug(
"[%s] zonelist file %s is unchanged since %s",
364 zl_str, zlfile, datestamp?datestamp:
"Unknown");
365 free((
void*)datestamp);
366 return ODS_STATUS_UNCHANGED;
371 ods_log_error(
"[%s] unable to update zonelist: zonelist_create() " 373 return ODS_STATUS_ERR;
376 status = zonelist_read(new_zlist, zlfile);
377 if (status == ODS_STATUS_OK) {
382 zonelist_merge(zl, new_zlist);
383 (void)time_datestamp(zl->
last_modified,
"%Y-%m-%d %T", &datestamp);
384 ods_log_debug(
"[%s] file %s is modified since %s", zl_str, zlfile,
385 datestamp?datestamp:
"Unknown");
386 free((
void*)datestamp);
388 ods_log_error(
"[%s] unable to update zonelist: read file %s failed " 389 "(%s)", zl_str, zlfile, ods_status2str(status));
401 zone_delfunc(ldns_rbnode_t* elem)
404 if (elem && elem != LDNS_RBTREE_NULL) {
406 zone_delfunc(elem->left);
407 zone_delfunc(elem->right);
408 ods_log_deeebug(
"[%s] cleanup zone %s", zl_str, zone->
name);
420 node_delfunc(ldns_rbnode_t* elem)
422 if (elem && elem != LDNS_RBTREE_NULL) {
423 node_delfunc(elem->left);
424 node_delfunc(elem->right);
440 ods_log_debug(
"[%s] cleanup zonelist", zl_str);
442 zone_delfunc(zl->
zones->root);
443 ldns_rbtree_free(zl->
zones);
446 lock_basic_destroy(&zl->
zl_lock);
462 node_delfunc(zl->
zones->root);
463 ldns_rbtree_free(zl->
zones);
466 lock_basic_destroy(&zl->
zl_lock);
void zone_cleanup(zone_type *zone)
void zone_merge(zone_type *z1, zone_type *z2)
ods_status parse_file_check(const char *cfgfile, const char *rngfile)
zone_type * zone_create(char *name, ldns_rr_class klass)
zone_type * zonelist_add_zone(zonelist_type *zlist, zone_type *zone)
zone_type * zonelist_del_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)
zone_type * zonelist_lookup_zone_by_name(zonelist_type *zonelist, const char *name, ldns_rr_class klass)
void zonelist_cleanup(zonelist_type *zl)
ods_status zonelist_update(zonelist_type *zl, const char *zlfile)
void zonelist_free(zonelist_type *zl)
zonelist_type * zonelist_create()