diff --git a/lib/dns/diff.c b/lib/dns/diff.c index 30fbe6be66..7608ce134a 100644 --- a/lib/dns/diff.c +++ b/lib/dns/diff.c @@ -303,7 +303,7 @@ cleanup: return result; } -static isc_result_t +isc_result_t update_callback(void *arg, const dns_name_t *name, dns_rdataset_t *rds, dns_diffop_t op DNS__DB_FLARG) { dns_updatectx_t *ctx = arg; diff --git a/lib/dns/include/dns/diff.h b/lib/dns/include/dns/diff.h index 64cfe1923e..d2c8cb38c0 100644 --- a/lib/dns/include/dns/diff.h +++ b/lib/dns/include/dns/diff.h @@ -277,6 +277,18 @@ dns_diff_apply_with_callbacks(const dns_diff_t *diff, dns_rdatacallbacks_t *call *\li 'callbacks->update' is not NULL */ +isc_result_t +update_callback(void *arg, const dns_name_t *name, dns_rdataset_t *rds, + dns_diffop_t op DNS__DB_FLARG); +/*%< + * Standard update callback for dns_rdatacallbacks_t. + * Updates a database version by applying DNS record operations. + * Used with dns_updatectx_t context. + * + * Requires: + *\li 'arg' is a valid dns_updatectx_t pointer + */ + isc_result_t dns_diff_load(const dns_diff_t *diff, dns_rdatacallbacks_t *callbacks); /*%< diff --git a/lib/dns/rbt-zonedb.c b/lib/dns/rbt-zonedb.c index 18dd524a34..7541630106 100644 --- a/lib/dns/rbt-zonedb.c +++ b/lib/dns/rbt-zonedb.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -2248,10 +2249,52 @@ addglue(dns_db_t *db, dns_dbversion_t *dbversion, dns_rdataset_t *rdataset, return ISC_R_SUCCESS; } +static isc_result_t +rbt_beginupdate(dns_db_t *db, dns_dbversion_t *ver, + dns_rdatacallbacks_t *callbacks) { + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(ver != NULL); + REQUIRE(DNS_CALLBACK_VALID(callbacks)); + + dns_updatectx_t *ctx = isc_mem_get(rbtdb->common.mctx, sizeof(*ctx)); + *ctx = (dns_updatectx_t){ + .db = db, + .ver = ver, + .warn = true, + }; + + callbacks->update = update_callback; + callbacks->add_private = ctx; + + return ISC_R_SUCCESS; +} + +static isc_result_t +rbt_endupdate(dns_db_t *db, dns_rdatacallbacks_t *callbacks) { + dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; + dns_updatectx_t *ctx; + + REQUIRE(VALID_RBTDB(rbtdb)); + REQUIRE(DNS_CALLBACK_VALID(callbacks)); + + ctx = (dns_updatectx_t *)callbacks->add_private; + if (ctx != NULL) { + isc_mem_put(rbtdb->common.mctx, ctx, sizeof(*ctx)); + callbacks->add_private = NULL; + } + + return ISC_R_SUCCESS; +} + dns_dbmethods_t dns__rbtdb_zonemethods = { .destroy = dns__rbtdb_destroy, .beginload = beginload, .endload = endload, + .beginupdate = rbt_beginupdate, + .commitupdate = rbt_endupdate, + .abortupdate = rbt_endupdate, .currentversion = dns__rbtdb_currentversion, .newversion = dns__rbtdb_newversion, .attachversion = dns__rbtdb_attachversion,