void nsec_update_label(zdb_zone* zone, zdb_rr_label* label, dnslabel_vector_reference labels, s32 labels_top) { u8 name[MAX_DOMAIN_LENGTH]; /* Create or get the node */ nsec_node *node = nsec_update_label_node(zone, label, labels, labels_top); /* Get the next node */ nsec_node *next_node = nsec_avl_node_mod_next(node); dnslabel_vector_to_dnsname(labels, labels_top, name); nsec_update_label_record(zone, label, node, next_node, name); }
void nsec_icmtl_replay_execute(nsec_icmtl_replay *replay) { if(!treeset_avl_isempty(&replay->nsec_del)) { /* stuff to delete */ treeset_avl_iterator ts_avl_iter; treeset_avl_iterator_init(&replay->nsec_del, &ts_avl_iter); while(treeset_avl_iterator_hasnext(&ts_avl_iter)) { treeset_node *node = treeset_avl_iterator_next_node(&ts_avl_iter); u8 *fqdn = (u8*)node->key; log_debug("icmtl replay: NSEC: post/del %{dnsname}", fqdn); treeset_node *add_node; if((add_node = treeset_avl_find(&replay->nsec_add, fqdn)) != NULL) { /* * del and add => nothing to do (almost) * * NOTE: I have to ensure that the label link is right (if the label has ENTIERLY been destroyed, * then re-made, this will break) */ log_debug("icmtl replay: NSEC: upd %{dnsname}", fqdn); /* * */ u8* add_key = add_node->key; treeset_avl_delete(&replay->nsec_add, fqdn); free(add_key); } else { log_debug("icmtl replay: NSEC: del %{dnsname}", fqdn); /* * The node has to be deleted */ dnslabel_vector labels; s32 labels_top = dnsname_to_dnslabel_vector(fqdn, labels); zdb_rr_label* label = zdb_rr_label_find_exact(replay->zone->apex, labels, labels_top); nsec_delete_label_node(replay->zone, label, labels, labels_top); } free(fqdn); } treeset_avl_destroy(&replay->nsec_del); } if(!treeset_avl_isempty(&replay->nsec_add)) { /* stuff to add */ treeset_avl_iterator ts_avl_iter; treeset_avl_iterator_init(&replay->nsec_add, &ts_avl_iter); while(treeset_avl_iterator_hasnext(&ts_avl_iter)) { treeset_node *node = treeset_avl_iterator_next_node(&ts_avl_iter); u8 *fqdn = (u8*)node->key; log_debug("icmtl replay: NSEC: add %{dnsname}", fqdn); /* * The node must be added. It should not exist already. * After all changes (del/upd/add) all the added records should be matched again (check) */ dnslabel_vector labels; s32 labels_top = dnsname_to_dnslabel_vector(fqdn, labels); zdb_rr_label* label = zdb_rr_label_find_exact(replay->zone->apex, labels, labels_top - replay->zone->origin_vector.size - 1); nsec_update_label_node(replay->zone, label, labels, labels_top); free(fqdn); } treeset_avl_destroy(&replay->nsec_add); } }