44 #include <ldns/ldns.h>
46 static const char* dname_str =
"domain";
54 rrset_compare(
const void* a,
const void* b)
56 ldns_rr_type* x = (ldns_rr_type*)a;
57 ldns_rr_type* y = (ldns_rr_type*)b;
74 ods_log_error(
"[%s] unable to create domain: no dname", dname_str);
81 str = ldns_rdf2str(dname);
82 ods_log_error(
"[%s] unable to create domain %s: create allocator "
83 "failed", dname_str, str?str:
"(null)");
91 str = ldns_rdf2str(dname);
92 ods_log_error(
"[%s] unable to create domain %s: allocator failed",
101 domain->
dname = ldns_rdf_clone(dname);
105 domain->
rrsets = ldns_rbtree_create(rrset_compare);
117 const char* token = NULL;
118 const char* locator = NULL;
122 ldns_status lstatus = LDNS_STATUS_OK;
123 ldns_rr_type type_covered = LDNS_RR_TYPE_FIRST;
137 goto recover_dname_error;
140 lstatus = ldns_rr_new_frm_fp(&rr, fd, NULL, NULL, NULL);
141 if (lstatus != LDNS_STATUS_OK) {
142 ods_log_error(
"[%s] missing signature in backup", dname_str);
144 ldns_get_errorstr_by_id(lstatus));
145 goto recover_dname_error;
147 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) {
148 ods_log_error(
"[%s] expecting signature in backup", dname_str);
150 goto recover_dname_error;
153 type_covered = ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr));
157 dname_str, type_covered);
159 goto recover_dname_error;
163 ods_log_error(
"[%s] unable to recover signature", dname_str);
165 goto recover_dname_error;
168 free((
void*) locator);
171 }
else if (
ods_strcmp(token,
";;Denial") == 0) {
173 lstatus = ldns_rr_new_frm_fp(&rr, fd, NULL, NULL, NULL);
174 if (lstatus != LDNS_STATUS_OK) {
176 goto recover_dname_error;
178 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_NSEC &&
179 ldns_rr_get_type(rr) != LDNS_RR_TYPE_NSEC3) {
182 goto recover_dname_error;
199 goto recover_dname_error;
204 goto recover_dname_error;
215 goto recover_dname_error;
218 lstatus = ldns_rr_new_frm_fp(&rr, fd, NULL, NULL, NULL);
219 if (lstatus != LDNS_STATUS_OK) {
223 ldns_get_errorstr_by_id(lstatus));
224 goto recover_dname_error;
226 if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) {
230 goto recover_dname_error;
236 goto recover_dname_error;
244 goto recover_dname_error;
247 free((
void*) locator);
250 }
else if (
ods_strcmp(token,
";;Domaindone") == 0) {
257 goto recover_dname_error;
270 free((
void*) locator);
280 static ldns_rbnode_t*
283 ldns_rbnode_t* node = (ldns_rbnode_t*) malloc(
sizeof(ldns_rbnode_t));
287 node->key = (
const void*) &(rrset->
rr_type);
298 domain_rrset_search(ldns_rbtree_t* tree, ldns_rr_type rrtype)
300 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
302 if (!tree || !rrtype) {
305 node = ldns_rbtree_search(tree, (
const void*) &rrtype);
306 if (node && node != LDNS_RBTREE_NULL) {
320 if (!domain || !rrtype) {
323 return domain_rrset_search(domain->
rrsets, rrtype);
334 ldns_rbnode_t* new_node = LDNS_RBTREE_NULL;
337 ods_log_error(
"[%s] unable to add RRset: no RRset", dname_str);
342 if (!domain || !domain->
rrsets) {
343 ods_log_error(
"[%s] unable to add RRset: no storage", dname_str);
349 new_node = rrset2node(rrset);
350 if (ldns_rbtree_insert(domain->
rrsets, new_node) == NULL) {
351 ods_log_error(
"[%s] unable to add RRset: already present", dname_str);
352 free((
void*)new_node);
366 ldns_rbnode_t* del_node = LDNS_RBTREE_NULL;
370 ods_log_error(
"[%s] unable to delete RRset: no RRset", dname_str);
375 if (!domain || !domain->
rrsets) {
376 ods_log_error(
"[%s] unable to delete RRset: no storage", dname_str);
382 del_node = ldns_rbtree_search(domain->
rrsets,
383 (
const void*) &(rrset->
rr_type));
385 del_node = ldns_rbtree_delete(domain->
rrsets,
386 (
const void*) &(rrset->
rr_type));
389 free((
void*)del_node);
403 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
407 if (!domain || !domain->
rrsets) {
411 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
412 node = ldns_rbtree_first(domain->
rrsets);
414 while (node && node != LDNS_RBTREE_NULL) {
419 node = ldns_rbtree_next(node);
432 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
436 if (!domain || !domain->
rrsets) {
439 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
440 node = ldns_rbtree_first(domain->
rrsets);
442 while (node && node != LDNS_RBTREE_NULL) {
445 if (rrset->
rr_type == LDNS_RR_TYPE_NSEC3PARAMS) {
446 node = ldns_rbtree_next(node);
454 node = ldns_rbtree_next(node);
468 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
476 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
477 node = ldns_rbtree_first(domain->
rrsets);
479 while (node && node != LDNS_RBTREE_NULL) {
484 if (rrset->
rr_type == rrtype) {
487 }
else if (!skip_glue ||
488 (rrset->
rr_type != LDNS_RR_TYPE_A &&
489 rrset->
rr_type != LDNS_RR_TYPE_AAAA)) {
494 node = ldns_rbtree_next(node);
507 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
509 ldns_dnssec_rrs* rrs = NULL;
510 char* str_name = NULL;
511 char* str_type = NULL;
514 if (!domain || !rrtype) {
530 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
531 node = ldns_rbtree_first(domain->
rrsets);
533 while (node && node != LDNS_RBTREE_NULL) {
537 str_name = ldns_rdf2str(domain->
dname);
538 str_type = ldns_rr_type2str(rrtype);
539 ods_log_error(
"[%s] other data next to %s %s", dname_str, str_name, str_type);
543 log_rr(rrs->rr,
"next-to-CNAME: ", 1);
550 log_rr(rrs->rr,
"next-to-CNAME: ", 1);
554 free((
void*)str_name);
555 free((
void*)str_type);
558 node = ldns_rbtree_next(node);
572 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
588 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
589 node = ldns_rbtree_first(domain->
rrsets);
591 while (node && node != LDNS_RBTREE_NULL) {
593 if (rrset->
rr_type != LDNS_RR_TYPE_DS &&
594 rrset->
rr_type != LDNS_RR_TYPE_NS &&
595 rrset->
rr_type != LDNS_RR_TYPE_A &&
596 rrset->
rr_type != LDNS_RR_TYPE_AAAA &&
599 ods_log_error(
"[%s] occluded glue data at zonecut, RRtype=%u",
602 }
else if (rrset->
rr_type == LDNS_RR_TYPE_A ||
603 rrset->
rr_type == LDNS_RR_TYPE_AAAA) {
614 node = ldns_rbtree_next(node);
629 char* str_name = NULL;
630 char* str_type = NULL;
633 if (!domain || !rrtype) {
646 str_name = ldns_rdf2str(domain->
dname);
647 str_type = ldns_rr_type2str(rrtype);
648 ods_log_error(
"[%s] multiple records for singleton type at %s %s",
649 dname_str, str_name, str_type);
650 free((
void*)str_name);
651 free((
void*)str_type);
665 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
673 if (!domain || !domain->
rrsets) {
676 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
677 node = ldns_rbtree_first(domain->
rrsets);
679 while (node && node != LDNS_RBTREE_NULL) {
685 if (rrset->
rr_type == LDNS_RR_TYPE_SOA && rrset->
rrs &&
693 node = ldns_rbtree_next(node);
696 if (numrrs > 0 && numnew <= 0) {
699 "to delete RRset", dname_str);
705 }
else if (numrrs <= 0 && numnew == numadd) {
722 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
725 if (!domain || !domain->
rrsets) {
728 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
729 node = ldns_rbtree_first(domain->
rrsets);
731 while (node && node != LDNS_RBTREE_NULL) {
734 node = ldns_rbtree_next(node);
750 ods_log_error(
"[%s] unable to set status: no domain", dname_str);
792 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
796 if (!domain || !domain->
rrsets) {
804 if (domain->
rrsets->root != LDNS_RBTREE_NULL) {
805 node = ldns_rbtree_first(domain->
rrsets);
807 while (node && node != LDNS_RBTREE_NULL) {
812 rrset->
rr_type == LDNS_RR_TYPE_NS) {
813 node = ldns_rbtree_next(node);
819 (rrset->
rr_type == LDNS_RR_TYPE_A ||
820 rrset->
rr_type == LDNS_RR_TYPE_AAAA)) {
821 node = ldns_rbtree_next(node);
829 node = ldns_rbtree_next(node);
849 if (!domain || !nsdname) {
867 rrset_delfunc(ldns_rbnode_t* elem)
871 if (elem && elem != LDNS_RBTREE_NULL) {
873 rrset_delfunc(elem->left);
874 rrset_delfunc(elem->right);
898 ldns_rdf_deep_free(domain->
dname);
899 domain->
dname = NULL;
902 rrset_delfunc(domain->
rrsets->root);
903 ldns_rbtree_free(domain->
rrsets);
919 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
924 if (!domain || !fd) {
931 node = ldns_rbtree_first(domain->
rrsets);
946 while (node && node != LDNS_RBTREE_NULL) {
949 if (rrset->
rr_type != LDNS_RR_TYPE_SOA) {
957 node = ldns_rbtree_next(node);
975 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
979 if (!domain || !fd) {
983 str = ldns_rdf2str(domain->
dname);
985 node = ldns_rbtree_first(domain->
rrsets);
988 fprintf(fd,
";;Domain: name %s status %i\n", str, (
int) domain->
dstatus);
989 while (node && node != LDNS_RBTREE_NULL) {
992 node = ldns_rbtree_next(node);
998 fprintf(fd,
";;Denial\n");
1003 fprintf(fd,
";;Domaindone\n");