Skip to content
Snippets Groups Projects
Commit f8ca637a authored by Lubos Slovak's avatar Lubos Slovak
Browse files

Fixing references from node.

- References to old nodes replaced by references to new ones.
- Added API for this to node.
- Implemented reference fixing in XFR.

refs #1037 @20m
parent 4ec0f00c
No related branches found
No related tags found
No related merge requests found
......@@ -383,6 +383,47 @@ void dnslib_node_set_new_node(dnslib_node_t *node,
/*----------------------------------------------------------------------------*/
void dnslib_node_update_refs(dnslib_node_t *node)
{
// reference to previous node
if (node->prev && dnslib_node_is_old(node->prev)) {
assert(node->prev->new_node != NULL);
node->prev = node->prev->new_node;
}
// reference to next node
if (node->next && dnslib_node_is_old(node->next)) {
assert(node->next->new_node != NULL);
node->next = node->next->new_node;
}
// reference to parent
if (node->parent && dnslib_node_is_old(node->parent)) {
assert(node->parent->new_node != NULL);
node->parent = node->parent->new_node;
}
// reference to wildcard child
if (node->wildcard_child && dnslib_node_is_old(node->wildcard_child)) {
assert(node->wildcard_child->new_node != NULL);
node->wildcard_child = node->wildcard_child->new_node;
}
// reference to NSEC3 node
if (node->nsec3_node && dnslib_node_is_old(node->nsec3_node)) {
assert(node->nsec3_node->new_node != NULL);
node->nsec3_node = node->nsec3_node->new_node;
}
// reference to NSEC3 referrer
if (node->nsec3_referer && dnslib_node_is_old(node->nsec3_referer)) {
assert(node->nsec3_referer->new_node != NULL);
node->nsec3_referer = node->nsec3_referer->new_node;
}
}
/*----------------------------------------------------------------------------*/
void dnslib_node_set_deleg_point(dnslib_node_t *node)
{
dnslib_node_flags_set_deleg(&node->flags);
......
......@@ -275,6 +275,8 @@ dnslib_node_t *dnslib_node_get_new_node(const dnslib_node_t *node);
void dnslib_node_set_new_node(dnslib_node_t *node,
dnslib_node_t *new_node);
void dnslib_node_update_refs(dnslib_node_t *node);
/*!
* \brief Mark the node as a delegation point.
*
......
......@@ -2005,8 +2005,12 @@ static int xfrin_apply_changeset(dnslib_zone_contents_t *contents,
/*----------------------------------------------------------------------------*/
static int xfrin_finalize_contents(dnslib_zone_contents_t *contents)
static int xfrin_finalize_contents(dnslib_zone_contents_t *contents,
xfrin_changes_t *changes)
{
// don't know what should have been done here, except for one thing:
// walk through the zone and remove empty nodes (save them in the
// old nodes list). But only those having no children!!!
return KNOT_ENOTSUP;
}
......@@ -2014,7 +2018,23 @@ static int xfrin_finalize_contents(dnslib_zone_contents_t *contents)
static void xfrin_fix_refs_in_node(dnslib_zone_tree_node_t *tnode, void *data)
{
assert(tnode != NULL);
assert(data != NULL);
xfrin_changes_t *changes = (xfrin_changes_t *)data;
// 1) Fix the reference to the node to the new one if there is some
dnslib_node_t *node = tnode->node;
dnslib_node_t *new_node = dnslib_node_new_node(old_node);
if (new_node != NULL) {
assert(dnslib_node_rrset_count(new_node) > 0);
node = new_node;
tnode->node = new_node;
}
// 2) fix references from the node remaining in the zone
dnslib_node_update_refs(node);
}
/*----------------------------------------------------------------------------*/
......@@ -2133,7 +2153,7 @@ int xfrin_apply_changesets(dnslib_zone_t *zone, xfrin_changesets_t *chsets)
/*
* Finalize the zone contents.
*/
ret = xfrin_finalize_contents(contents_copy);
ret = xfrin_finalize_contents(contents_copy, changes);
if (ret != KNOT_EOK) {
xfrin_rollback_update(contents_copy, &changes);
debug_xfr("Failed to finalize new zone contents: %s\n",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment