]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
implement getoriginnode for sdb
authorMark Andrews <marka@isc.org>
Fri, 9 Aug 2019 06:25:49 +0000 (16:25 +1000)
committerMark Andrews <marka@isc.org>
Wed, 28 Aug 2019 05:46:41 +0000 (15:46 +1000)
lib/dns/sdb.c

index f6bfad0fe8924936ed1fdf9d0a87096f9c7f59c2..e7683a79184e9961cdb31b60370923e9cb4d3954 100644 (file)
@@ -677,6 +677,82 @@ destroynode(dns_sdbnode_t *node) {
        detach((dns_db_t **) (void *)&sdb);
 }
 
+static isc_result_t
+getoriginnode(dns_db_t *db, dns_dbnode_t **nodep) {
+       dns_sdb_t *sdb = (dns_sdb_t *)db;
+       dns_sdbnode_t *node = NULL;
+       isc_result_t result;
+       isc_buffer_t b;
+       char namestr[DNS_NAME_MAXTEXT + 1];
+       dns_sdbimplementation_t *imp;
+       dns_name_t relname;
+       dns_name_t *name;
+
+       REQUIRE(VALID_SDB(sdb));
+       REQUIRE(nodep != NULL && *nodep == NULL);
+
+       imp = sdb->implementation;
+       name = &sdb->common.origin;
+
+       if (imp->methods->lookup2 != NULL) {
+               if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) {
+                       dns_name_init(&relname, NULL);
+                       name = &relname;
+               }
+       } else {
+               isc_buffer_init(&b, namestr, sizeof(namestr));
+               if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) {
+
+                       dns_name_init(&relname, NULL);
+                       result = dns_name_totext(&relname, true, &b);
+                       if (result != ISC_R_SUCCESS) {
+                               return (result);
+                       }
+               } else {
+                       result = dns_name_totext(name, true, &b);
+                       if (result != ISC_R_SUCCESS) {
+                               return (result);
+                       }
+               }
+               isc_buffer_putuint8(&b, 0);
+       }
+
+       result = createnode(sdb, &node);
+       if (result != ISC_R_SUCCESS) {
+               return (result);
+       }
+
+       MAYBE_LOCK(sdb);
+       if (imp->methods->lookup2 != NULL) {
+               result = imp->methods->lookup2(&sdb->common.origin, name,
+                                              sdb->dbdata, node, NULL, NULL);
+       } else {
+               result = imp->methods->lookup(sdb->zone, namestr, sdb->dbdata,
+                                             node, NULL, NULL);
+       }
+       MAYBE_UNLOCK(sdb);
+       if (result != ISC_R_SUCCESS &&
+           !(result == ISC_R_NOTFOUND &&
+             imp->methods->authority != NULL))
+       {
+               destroynode(node);
+               return (result);
+       }
+
+       if (imp->methods->authority != NULL) {
+               MAYBE_LOCK(sdb);
+               result = imp->methods->authority(sdb->zone, sdb->dbdata, node);
+               MAYBE_UNLOCK(sdb);
+               if (result != ISC_R_SUCCESS) {
+                       destroynode(node);
+                       return (result);
+               }
+       }
+
+       *nodep = node;
+       return (ISC_R_SUCCESS);
+}
+
 static isc_result_t
 findnodeext(dns_db_t *db, const dns_name_t *name, bool create,
            dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
@@ -1224,7 +1300,7 @@ static dns_dbmethods_t sdb_methods = {
        ispersistent,
        overmem,
        settask,
-       NULL,                   /* getoriginnode */
+       getoriginnode,          /* getoriginnode */
        NULL,                   /* transfernode */
        NULL,                   /* getnsec3parameters */
        NULL,                   /* findnsec3node */