summaryrefslogtreecommitdiff
path: root/src/libknot/updates/changesets.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libknot/updates/changesets.c')
-rw-r--r--src/libknot/updates/changesets.c153
1 files changed, 61 insertions, 92 deletions
diff --git a/src/libknot/updates/changesets.c b/src/libknot/updates/changesets.c
index 5405726..1f7997c 100644
--- a/src/libknot/updates/changesets.c
+++ b/src/libknot/updates/changesets.c
@@ -14,13 +14,16 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <config.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "updates/changesets.h"
#include "libknot/common.h"
+#include "common/descriptor.h"
#include "rrset.h"
+#include "util/debug.h"
static const size_t KNOT_CHANGESET_COUNT = 5;
static const size_t KNOT_CHANGESET_STEP = 5;
@@ -41,21 +44,16 @@ static int knot_changeset_check_count(knot_rrset_t ***rrsets, size_t count,
size_t extra = (count - *allocated) % KNOT_CHANGESET_RRSET_STEP;
extra = (extra + 1) * KNOT_CHANGESET_RRSET_STEP;
- /* Allocate new memory block. */
+ /* Reallocate memory block. */
const size_t item_len = sizeof(knot_rrset_t *);
const size_t new_count = *allocated + extra;
- knot_rrset_t **rrsets_new = malloc(new_count * item_len);
- if (rrsets_new == NULL) {
+ void *tmp = realloc(*rrsets, new_count * item_len);
+ if (tmp == NULL) {
return KNOT_ENOMEM;
}
-
- /* Clear old memory block and copy old data. */
- memset(rrsets_new, 0, new_count * item_len);
- memcpy(rrsets_new, *rrsets, (*allocated) * item_len);
-
- /* Replace old rrsets. */
- free(*rrsets);
- *rrsets = rrsets_new;
+ *rrsets = tmp;
+ /* Init new data. */
+ memset(*rrsets + *allocated, 0, extra * item_len);
*allocated = new_count;
return KNOT_EOK;
@@ -66,12 +64,10 @@ static int knot_changeset_check_count(knot_rrset_t ***rrsets, size_t count,
static int knot_changeset_rrsets_match(const knot_rrset_t *rrset1,
const knot_rrset_t *rrset2)
{
- return knot_rrset_match(rrset1, rrset2, KNOT_RRSET_COMPARE_HEADER)
+ return knot_rrset_equal(rrset1, rrset2, KNOT_RRSET_COMPARE_HEADER)
&& (knot_rrset_type(rrset1) != KNOT_RRTYPE_RRSIG
- || knot_rdata_rrsig_type_covered(
- knot_rrset_rdata(rrset1))
- == knot_rdata_rrsig_type_covered(
- knot_rrset_rdata(rrset2)));
+ || knot_rrset_rdata_rrsig_type_covered(rrset1)
+ == knot_rrset_rdata_rrsig_type_covered(rrset2));
}
/*----------------------------------------------------------------------------*/
@@ -93,7 +89,7 @@ int knot_changeset_allocate(knot_changesets_t **changesets,
*changesets = NULL;
return KNOT_ENOMEM;
}
-
+
return KNOT_EOK;
}
@@ -130,12 +126,12 @@ int knot_changeset_add_rr(knot_rrset_t ***rrsets, size_t *count,
&& knot_changeset_rrsets_match((*rrsets)[*count - 1], rr)) {
// Create changesets exactly as they came, with possibly
// duplicate records
- if (knot_rrset_merge((void **)&(*rrsets)[*count - 1],
- (void **)&rr) != KNOT_EOK) {
+ if (knot_rrset_merge((*rrsets)[*count - 1],
+ rr) != KNOT_EOK) {
return KNOT_ERROR;
}
- knot_rrset_free(&rr);
+ knot_rrset_deep_free(&rr, 1, 0);
return KNOT_EOK;
} else {
return knot_changeset_add_rrset(rrsets, count, allocated, rr);
@@ -208,7 +204,7 @@ void knot_changeset_store_soa(knot_rrset_t **chg_soa,
uint32_t *chg_serial, knot_rrset_t *soa)
{
*chg_soa = soa;
- *chg_serial = knot_rdata_soa_serial(knot_rrset_rdata(soa));
+ *chg_serial = knot_rrset_rdata_soa_serial(soa);
}
/*----------------------------------------------------------------------------*/
@@ -308,17 +304,17 @@ void knot_free_changeset(knot_changeset_t **changeset)
int j;
for (j = 0; j < (*changeset)->add_count; ++j) {
- knot_rrset_deep_free(&(*changeset)->add[j], 1, 1, 1);
+ knot_rrset_deep_free(&(*changeset)->add[j], 1, 1);
}
free((*changeset)->add);
for (j = 0; j < (*changeset)->remove_count; ++j) {
- knot_rrset_deep_free(&(*changeset)->remove[j], 1, 1, 1);
+ knot_rrset_deep_free(&(*changeset)->remove[j], 1, 1);
}
free((*changeset)->remove);
- knot_rrset_deep_free(&(*changeset)->soa_from, 1, 1, 1);
- knot_rrset_deep_free(&(*changeset)->soa_to, 1, 1, 1);
+ knot_rrset_deep_free(&(*changeset)->soa_from, 1, 1);
+ knot_rrset_deep_free(&(*changeset)->soa_to, 1, 1);
free((*changeset)->data);
@@ -342,9 +338,9 @@ void knot_free_changesets(knot_changesets_t **changesets)
}
free((*changesets)->sets);
-
- knot_rrset_deep_free(&(*changesets)->first_soa, 1, 1, 1);
-
+
+ knot_rrset_deep_free(&(*changesets)->first_soa, 1, 1);
+
assert((*changesets)->changes == NULL);
free(*changesets);
@@ -361,7 +357,7 @@ int knot_changes_rrsets_reserve(knot_rrset_t ***rrsets,
if (rrsets == NULL || count == NULL || allocated == NULL) {
return KNOT_EINVAL;
}
-
+
if (*count + to_add <= *allocated) {
return KNOT_EOK;
}
@@ -397,7 +393,7 @@ int knot_changes_nodes_reserve(knot_node_t ***nodes,
if (nodes == NULL || count == NULL || allocated == NULL) {
return KNOT_EINVAL;
}
-
+
if (*count + 2 <= *allocated) {
return KNOT_EOK;
}
@@ -425,13 +421,13 @@ int knot_changes_nodes_reserve(knot_node_t ***nodes,
/*----------------------------------------------------------------------------*/
-int knot_changes_rdata_reserve(knot_rdata_t ***rdatas, uint16_t **types,
- int count, int *allocated, int to_add)
+int knot_changes_rdata_reserve(knot_rrset_t ***rdatas,
+ int count, int *allocated, int to_add)
{
- if (rdatas == NULL || types == NULL || allocated == NULL) {
+ if (rdatas == NULL || allocated == NULL) {
return KNOT_EINVAL;
}
-
+
if (count + to_add <= *allocated) {
return KNOT_EOK;
}
@@ -442,29 +438,19 @@ int knot_changes_rdata_reserve(knot_rdata_t ***rdatas, uint16_t **types,
}
/* Allocate new memory block. */
- knot_rdata_t **rdatas_new = malloc(new_count * sizeof(knot_rdata_t *));
+ knot_rrset_t **rdatas_new = malloc(new_count * sizeof(knot_rrset_t *));
if (rdatas_new == NULL) {
- return KNOT_ENOMEM;
- }
-
- uint16_t *types_new = malloc(new_count * sizeof(uint));
- if (types_new == NULL) {
- free(rdatas_new);
+ ERR_ALLOC_FAILED;
return KNOT_ENOMEM;
}
/* Initialize new memory and copy old data. */
- memset(rdatas_new, 0, new_count * sizeof(knot_rdata_t *));
- memcpy(rdatas_new, *rdatas, (*allocated) * sizeof(knot_rdata_t *));
-
- memset(types_new, 0, new_count * sizeof(uint));
- memcpy(types_new, *types, (*allocated) * sizeof(uint));
+ memset(rdatas_new, 0, new_count * sizeof(knot_rrset_t *));
+ memcpy(rdatas_new, *rdatas, (*allocated) * sizeof(knot_rrset_t *));
/* Free old rdatas and switch pointers. */
free(*rdatas);
- free(*types);
*rdatas = rdatas_new;
- *types = types_new;
*allocated = new_count;
return KNOT_EOK;
@@ -472,24 +458,16 @@ int knot_changes_rdata_reserve(knot_rdata_t ***rdatas, uint16_t **types,
/*----------------------------------------------------------------------------*/
-void knot_changes_add_rdata(knot_rdata_t **rdatas, uint16_t *types,
- int *count, knot_rdata_t *rdata, uint16_t type)
+/*!< \note Always adds the whole RRSet = all rdata. */
+void knot_changes_add_rdata(knot_rrset_t **rdatas, int *count,
+ knot_rrset_t *rrset)
{
- if (rdatas == NULL || types == NULL || count == NULL || rdata == NULL) {
+ if (rdatas == NULL || count == NULL || rrset == NULL || rrset->rdata_count == 0) {
return;
}
- // Add all RDATAs from the chain!!
-
- knot_rdata_t *r = rdata;
- do {
-// dbg_xfrin_detail("Adding RDATA to RDATA list: %p\n", r);
- rdatas[*count] = r;
- types[*count] = type;
- ++*count;
-
- r = r->next;
- } while (r != NULL && r != rdata);
+ rdatas[*count] = rrset;
+ *count += 1;
}
/*----------------------------------------------------------------------------*/
@@ -522,25 +500,22 @@ int knot_changes_add_old_rrsets(knot_rrset_t **rrsets, int count,
if (rrsets[i] == NULL) {
continue;
}
-
+
knot_rrset_t *rrsigs = knot_rrset_get_rrsigs(rrsets[i]);
-
+
if (add_rdata) {
-
+
/* RDATA count in the RRSet. */
- int rdata_count = knot_rrset_rdata_rr_count(rrsets[i]);
-
+ int rdata_count = 1;
+
if (rrsigs != NULL) {
- /* Increment the RDATA count by the count of
+ /* Increment the RDATA count by the count of
* RRSIGs. */
- rdata_count += knot_rrset_rdata_rr_count(
- rrsigs);
+ rdata_count += 1;
}
-
+
/* Remove old RDATA. */
-
ret = knot_changes_rdata_reserve(&changes->old_rdata,
- &changes->old_rdata_types,
changes->old_rdata_count,
&changes->old_rdata_allocated,
rdata_count);
@@ -550,22 +525,20 @@ int knot_changes_add_old_rrsets(knot_rrset_t **rrsets, int count,
}
knot_changes_add_rdata(changes->old_rdata,
- changes->old_rdata_types,
&changes->old_rdata_count,
- knot_rrset_get_rdata(rrsets[i]),
- knot_rrset_type(rrsets[i]));
-
+ rrsets[i]);
+
knot_changes_add_rdata(changes->old_rdata,
- changes->old_rdata_types,
&changes->old_rdata_count,
- knot_rrset_get_rdata(rrsigs),
- KNOT_RRTYPE_RRSIG);
+ rrsigs);
}
-
+
/* Disconnect RRsigs from rrset. */
knot_rrset_set_rrsigs(rrsets[i], NULL);
changes->old_rrsets[changes->old_rrsets_count++] = rrsets[i];
- changes->old_rrsets[changes->old_rrsets_count++] = rrsigs;
+ if (rrsigs) {
+ changes->old_rrsets[changes->old_rrsets_count++] = rrsigs;
+ }
}
return KNOT_EOK;
@@ -597,25 +570,21 @@ int knot_changes_add_new_rrsets(knot_rrset_t **rrsets, int count,
if (rrsets[i] == NULL) {
continue;
}
-
+
if (add_rdata) {
- int rdata_count = knot_rrset_rdata_rr_count(rrsets[i]);
ret = knot_changes_rdata_reserve(&changes->new_rdata,
- &changes->new_rdata_types,
changes->new_rdata_count,
&changes->new_rdata_allocated,
- rdata_count);
+ 1);
if (ret != KNOT_EOK) {
return ret;
}
-
+
knot_changes_add_rdata(changes->new_rdata,
- changes->new_rdata_types,
&changes->new_rdata_count,
- knot_rrset_get_rdata(rrsets[i]),
- knot_rrset_type(rrsets[i]));
- }
-
+ rrsets[i]);
+ }
+
changes->new_rrsets[changes->new_rrsets_count++] = rrsets[i];
}