kdnssec_ctx_t ctx = { 0 };
zone_keyset_t keyset = { 0 };
+ update->flags |= UPDATE_CANCELOUT;
+
// signing pipeline
result = sign_init(update->new_cont, 0, 0, update->zone->kaspdb, &ctx, reschedule);
memset(update, 0, sizeof(*update));
}
+static changeset_flag_t changeset_flags(const zone_update_t *update)
+{
+ if ((update->flags & UPDATE_CANCELOUT)) {
+ return CHANGESET_CHECK | CHANGESET_CHECK_CANCELOUT;
+ } else {
+ return CHANGESET_CHECK;
+ }
+}
+
int zone_update_add(zone_update_t *update, const knot_rrset_t *rrset)
{
if (update == NULL || rrset == NULL) {
}
if (update->flags & UPDATE_INCREMENTAL) {
- int ret = changeset_add_addition(&update->change, rrset, CHANGESET_CHECK);
+ int ret = changeset_add_addition(&update->change, rrset, changeset_flags(update));
if (ret != KNOT_EOK) {
return ret;
}
}
if (update->flags & UPDATE_INCREMENTAL) {
- int ret = changeset_add_removal(&update->change, rrset, CHANGESET_CHECK);
+ int ret = changeset_add_removal(&update->change, rrset, changeset_flags(update));
if (ret != KNOT_EOK) {
return ret;
}
return KNOT_ENOENT;
}
int ret = changeset_add_removal(&update->change, &rrset,
- CHANGESET_CHECK);
+ changeset_flags(update));
if (ret != KNOT_EOK) {
return ret;
}
for (int i = 0; i < rrset_count; ++i) {
knot_rrset_t rrset = node_rrset_at(node, rrset_count - 1 - i);
int ret = changeset_add_removal(&update->change, &rrset,
- CHANGESET_CHECK);
+ changeset_flags(update));
if (ret != KNOT_EOK) {
return ret;
}
UPDATE_SIGN = 1 << 2, /*!< Sign the resulting zone. */
UPDATE_JOURNAL = 1 << 3, /*!< Using zone-in-journal for a diff update. */
UPDATE_STRICT = 1 << 4, /*!< Apply changes strictly, i.e. fail when removing nonexistent RR. */
+ UPDATE_CANCELOUT = 1 << 5, /*!< When adding to changeset, cancel-out what has been both added and removed. */
} zone_update_flags_t;
/*!