diff options
Diffstat (limited to 'src/libknot/updates/changesets.c')
-rw-r--r-- | src/libknot/updates/changesets.c | 153 |
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]; } |