]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Implement RBTDB update path
authorAlessio Podda <alessio@isc.org>
Sat, 3 Jan 2026 22:42:02 +0000 (23:42 +0100)
committerAlessio Podda <alessio@isc.org>
Thu, 29 Jan 2026 08:13:02 +0000 (09:13 +0100)
This commit implements dns_db_{begin,commit,abort}update for rbt-zonedb
using the default diff shim.

lib/dns/diff.c
lib/dns/include/dns/diff.h
lib/dns/rbt-zonedb.c

index 30fbe6be66e231a3a5ed93957cfce73061925b7c..7608ce134af3f1174880fb8c38c23f63ba1136d3 100644 (file)
@@ -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;
index 64cfe1923e29895c4a2ce63f5ef8ee085372ef23..d2c8cb38c02983446ac3d784cc14946720fc54fa 100644 (file)
@@ -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);
 /*%<
index 18dd524a3483dc2ddfbaeb3492ef35462634baa2..7541630106a35d3ab8356c1baf5c0e4432c5c287 100644 (file)
@@ -44,6 +44,7 @@
 #include <dns/callbacks.h>
 #include <dns/db.h>
 #include <dns/dbiterator.h>
+#include <dns/diff.h>
 #include <dns/fixedname.h>
 #include <dns/log.h>
 #include <dns/masterdump.h>
@@ -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,