a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Database API implementation. The interface is defined in lib/dns/db.h.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * dns_db_*() calls on database instances backed by this driver use
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * struct sampledb_methods to find appropriate function implementation.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * This example re-uses RBT DB implementation from original BIND and blindly
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * proxies most of dns_db_*() calls to this underlying RBT DB.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * See struct sampledb below.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Copyright (C) 2009-2015 Red Hat ; see COPYRIGHT for license
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <config.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
ab8b419a797fae25f441273aca3ec18d8d0c1106Mark Andrews#include <isc/string.h>
f44202ab640d22e17b4c74bdad7817622918bd27Mark Andrews#include <isc/util.h>
ab8b419a797fae25f441273aca3ec18d8d0c1106Mark Andrews
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/db.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/diff.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/enumclass.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/rbt.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/rdatalist.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/rdatastruct.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/soa.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include <dns/types.h>
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include "db.h"
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include "instance.h"
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include "syncptr.h"
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#include "util.h"
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#define SAMPLEDB_MAGIC ISC_MAGIC('S', 'M', 'D', 'B')
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt#define VALID_SAMPLEDB(sampledb) \
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ((sampledb) != NULL && (sampledb)->common.impmagic == SAMPLEDB_MAGIC)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstruct sampledb {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_t common;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_refcount_t refs;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sample_instance_t *inst;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt /*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Internal RBT database implementation provided by BIND.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Most dns_db_* calls (find(), createiterator(), etc.)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * are blindly forwarded to this RBT DB.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_t *rbtdb;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt};
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunttypedef struct sampledb sampledb_t;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Get full DNS name from the node.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * @warning
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * The code silently expects that "node" came from RBTDB and thus
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * assumption dns_dbnode_t (from RBTDB) == dns_rbtnode_t is correct.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * This should work as long as we use only RBTDB and nothing else.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntsample_name_fromnode(dns_dbnode_t *node, dns_name_t *name) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rbtnode_t *rbtnode = (dns_rbtnode_t *) node;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_rbt_fullnamefromnode(rbtnode, name));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntattach(dns_db_t *source, dns_db_t **targetp) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *)source;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_refcount_increment(&sampledb->refs, NULL);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *targetp = source;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfree_sampledb(sampledb_t *sampledb) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_detach(&sampledb->rbtdb);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_name_free(&sampledb->common.origin, sampledb->common.mctx);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_mem_putanddetach(&sampledb->common.mctx, sampledb, sizeof(*sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntdetach(dns_db_t **dbp) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *)(*dbp);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt unsigned int refs;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_refcount_decrement(&sampledb->refs, &refs);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (refs == 0)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt free_sampledb(sampledb);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *dbp = NULL;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * This method should never be called, because DB is "persistent".
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * See ispersistent() function. It means that database do not need to be
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * loaded in the usual sense.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntbeginload(dns_db_t *db, dns_rdatacallbacks_t *callbacks) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(db);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(callbacks);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt fatal_error("current implementation should never call beginload()");
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt /* Not reached */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (ISC_R_SUCCESS);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * This method should never be called, because DB is "persistent".
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * See ispersistent() function. It means that database do not need to be
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * loaded in the usual sense.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntendload(dns_db_t *db, dns_rdatacallbacks_t *callbacks) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(db);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(callbacks);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt fatal_error("current implementation should never call endload()");
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt /* Not reached */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (ISC_R_SUCCESS);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntserialize(dns_db_t *db, dns_dbversion_t *version, FILE *file) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_serialize(sampledb->rbtdb, version, file));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntdump(dns_db_t *db, dns_dbversion_t *version, const char *filename,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_masterformat_t masterformat)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(db);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(version);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(filename);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(masterformat);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt fatal_error("current implementation should never call dump()");
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt /* Not reached */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (ISC_R_SUCCESS);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntcurrentversion(dns_db_t *db, dns_dbversion_t **versionp) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *)db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_currentversion(sampledb->rbtdb, versionp);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntnewversion(dns_db_t *db, dns_dbversion_t **versionp) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *)db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_newversion(sampledb->rbtdb, versionp));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntattachversion(dns_db_t *db, dns_dbversion_t *source,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbversion_t **targetp)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *)db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_attachversion(sampledb->rbtdb, source, targetp);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntcloseversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *)db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_closeversion(sampledb->rbtdb, versionp, commit);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfindnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbnode_t **nodep)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_findnode(sampledb->rbtdb, name, create, nodep));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfind(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbnode_t **nodep, dns_name_t *foundname, dns_rdataset_t *rdataset,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t *sigrdataset)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_find(sampledb->rbtdb, name, version, type,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt options, now, nodep, foundname,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdataset, sigrdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfindzonecut(dns_db_t *db, dns_name_t *name, unsigned int options,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_stdtime_t now, dns_dbnode_t **nodep, dns_name_t *foundname,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_findzonecut(sampledb->rbtdb, name, options,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt now, nodep, foundname, rdataset,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sigrdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntattachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_attachnode(sampledb->rbtdb, source, targetp);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntdetachnode(dns_db_t *db, dns_dbnode_t **targetp) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_detachnode(sampledb->rbtdb, targetp);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntexpirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_expirenode(sampledb->rbtdb, node, now));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntprintnode(dns_db_t *db, dns_dbnode_t *node, FILE *out) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
7f79448198139145cebc2540188b16b1861b98c5Mark Andrews dns_db_printnode(sampledb->rbtdb, node, out);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntcreateiterator(dns_db_t *db, unsigned int options,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbiterator_t **iteratorp)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_createiterator(sampledb->rbtdb, options, iteratorp));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfindrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatatype_t type, dns_rdatatype_t covers, isc_stdtime_t now,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_findrdataset(sampledb->rbtdb, node, version, type,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt covers, now, rdataset, sigrdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntallrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_stdtime_t now, dns_rdatasetiter_t **iteratorp)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_allrdatasets(sampledb->rbtdb, node, version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt now, iteratorp));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntaddrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t *addedrdataset)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_result_t result;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_fixedname_t name;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_fixedname_init(&name);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_addrdataset(sampledb->rbtdb, node, version, now,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdataset, options, addedrdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (rdataset->type == dns_rdatatype_a ||
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdataset->type == dns_rdatatype_aaaa) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(sample_name_fromnode(node, dns_fixedname_name(&name)));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(syncptrs(sampledb->inst, dns_fixedname_name(&name),
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdataset, DNS_DIFFOP_ADD));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt }
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntcleanup:
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (result);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntsubtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t *rdataset, unsigned int options,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t *newrdataset)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_result_t result;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_fixedname_t name;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_fixedname_init(&name);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt result = dns_db_subtractrdataset(sampledb->rbtdb, node, version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdataset, options, newrdataset);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (result != ISC_R_SUCCESS && result != DNS_R_NXRRSET)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt goto cleanup;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (rdataset->type == dns_rdatatype_a ||
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdataset->type == dns_rdatatype_aaaa) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(sample_name_fromnode(node, dns_fixedname_name(&name)));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(syncptrs(sampledb->inst, dns_fixedname_name(&name),
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdataset, DNS_DIFFOP_DEL));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt }
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntcleanup:
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (result);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * deleterdataset() function is not used during DNS update processing so syncptr
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * implementation is left as an exercise to the reader.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntdeleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatatype_t type, dns_rdatatype_t covers)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_deleterdataset(sampledb->rbtdb, node, version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt type, covers));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_boolean_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntissecure(dns_db_t *db) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_issecure(sampledb->rbtdb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic unsigned int
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntnodecount(dns_db_t *db) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_nodecount(sampledb->rbtdb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * The database does not need to be loaded from disk or written to disk.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Always return ISC_TRUE.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_boolean_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntispersistent(dns_db_t *db) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(db);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (ISC_TRUE);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
96beefd76f597b77d4fcd51f8d766e5e59a2d216Mark Andrewsovermem(dns_db_t *db, isc_boolean_t over) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
96beefd76f597b77d4fcd51f8d766e5e59a2d216Mark Andrews dns_db_overmem(sampledb->rbtdb, over);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntsettask(dns_db_t *db, isc_task_t *task) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_settask(sampledb->rbtdb, task);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntgetoriginnode(dns_db_t *db, dns_dbnode_t **nodep) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_getoriginnode(sampledb->rbtdb, nodep));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunttransfernode(dns_db_t *db, dns_dbnode_t **sourcep, dns_dbnode_t **targetp) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_transfernode(sampledb->rbtdb, sourcep, targetp);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntgetnsec3parameters(dns_db_t *db, dns_dbversion_t *version,
93c211afc97e7a072c12ef346581065e4065ff15Evan Hunt dns_hash_t *hash, isc_uint8_t *flags,
93c211afc97e7a072c12ef346581065e4065ff15Evan Hunt isc_uint16_t *iterations,
93c211afc97e7a072c12ef346581065e4065ff15Evan Hunt unsigned char *salt, size_t *salt_length)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_getnsec3parameters(sampledb->rbtdb, version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt hash, flags, iterations,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt salt, salt_length));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfindnsec3node(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbnode_t **nodep)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_findnsec3node(sampledb->rbtdb, name, create, nodep));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
93c211afc97e7a072c12ef346581065e4065ff15Evan Huntsetsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, isc_stdtime_t resign) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_setsigningtime(sampledb->rbtdb, rdataset, resign));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
93c211afc97e7a072c12ef346581065e4065ff15Evan Huntgetsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, dns_name_t *name) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_getsigningtime(sampledb->rbtdb, rdataset, name));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntresigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_resigned(sampledb->rbtdb, rdataset, version);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_boolean_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntisdnssec(dns_db_t *db) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_isdnssec(sampledb->rbtdb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic dns_stats_t *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntgetrrsetstats(dns_db_t *db) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_getrrsetstats(sampledb->rbtdb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic void
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntrpz_attach(dns_db_t *db, dns_rpz_zones_t *rpzs, dns_rpz_num_t rpz_num) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_rpz_attach(sampledb->rbtdb, rpzs, rpz_num);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntrpz_ready(dns_db_t *db) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_rpz_ready(sampledb->rbtdb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfindnodeext(dns_db_t *db, dns_name_t *name,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_boolean_t create, dns_clientinfomethods_t *methods,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_clientinfo_t *clientinfo, dns_dbnode_t **nodep)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_findnodeext(sampledb->rbtdb, name, create,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt methods, clientinfo, nodep));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntfindext(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbnode_t **nodep, dns_name_t *foundname,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_findext(sampledb->rbtdb, name, version, type,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt options, now, nodep, foundname, methods,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt clientinfo, rdataset, sigrdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntsetcachestats(dns_db_t *db, isc_stats_t *stats) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_setcachestats(sampledb->rbtdb, stats));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
5d79b60fc5e4dad4f04da39570517d20a2425f8bMukund Sivaramanstatic size_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunthashsize(dns_db_t *db) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = (sampledb_t *) db;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(VALID_SAMPLEDB(sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (dns_db_hashsize(sampledb->rbtdb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * DB interface definition. Database driver uses this structure to
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * determine which implementation of dns_db_*() function to call.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic dns_dbmethods_t sampledb_methods = {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt attach,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt detach,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt beginload,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt endload,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt serialize,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dump,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt currentversion,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt newversion,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt attachversion,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt closeversion,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt findnode,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt find,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt findzonecut,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt attachnode,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt detachnode,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt expirenode,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt printnode,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt createiterator,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt findrdataset,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt allrdatasets,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt addrdataset,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt subtractrdataset,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt deleterdataset,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt issecure,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt nodecount,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ispersistent,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt overmem,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt settask,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt getoriginnode,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt transfernode,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt getnsec3parameters,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt findnsec3node,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt setsigningtime,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt getsigningtime,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt resigned,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isdnssec,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt getrrsetstats,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rpz_attach,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rpz_ready,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt findnodeext,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt findext,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt setcachestats,
b4bbf494183e4158b417d9200297ff0764af2f9dMark Andrews hashsize,
744c1db6352c4c3f11c8538e4a2a57c8b0e0d570Mark Andrews NULL,
744c1db6352c4c3f11c8538e4a2a57c8b0e0d570Mark Andrews NULL,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt};
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/* Auxiliary driver functions. */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Auxiliary functions add_*() create minimal database which can be loaded.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * This is necessary because this driver create empty 'fake' zone which
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * is not loaded from disk so there is no way for user to supply SOA, NS and A
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * records.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Following functions were copied from BIND 9.10.2rc1 named/server.c,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * credit goes to ISC.
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntadd_soa(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_name_t *origin, dns_name_t *contact)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbnode_t *node = NULL;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdata_t rdata = DNS_RDATA_INIT;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatalist_t rdatalist;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t rdataset;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_result_t result;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt unsigned char buf[DNS_SOA_BUFFERSIZE];
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_init(&rdataset);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatalist_init(&rdatalist);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_soa_buildrdata(origin, contact, dns_db_class(db),
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt 0, 28800, 7200, 604800, 86400, buf, &rdata));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.type = rdata.type;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.covers = 0;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.rdclass = rdata.rdclass;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.ttl = 86400;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ISC_LIST_APPEND(rdatalist.rdata, &rdata, link);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_rdatalist_tordataset(&rdatalist, &rdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_findnode(db, name, ISC_TRUE, &node));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt cleanup:
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (node != NULL)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_detachnode(db, &node);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (result);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntadd_ns(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_name_t *nsname)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbnode_t *node = NULL;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdata_ns_t ns;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdata_t rdata = DNS_RDATA_INIT;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatalist_t rdatalist;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t rdataset;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_result_t result;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_buffer_t b;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt unsigned char buf[DNS_NAME_MAXWIRE];
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_buffer_init(&b, buf, sizeof(buf));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_init(&rdataset);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatalist_init(&rdatalist);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ns.common.rdtype = dns_rdatatype_ns;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ns.common.rdclass = dns_db_class(db);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ns.mctx = NULL;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_name_init(&ns.name, NULL);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_name_clone(nsname, &ns.name);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_rdata_fromstruct(&rdata, dns_db_class(db), dns_rdatatype_ns,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt &ns, &b));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.type = rdata.type;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.covers = 0;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.rdclass = rdata.rdclass;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.ttl = 86400;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ISC_LIST_APPEND(rdatalist.rdata, &rdata, link);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_rdatalist_tordataset(&rdatalist, &rdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_findnode(db, name, ISC_TRUE, &node));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt cleanup:
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (node != NULL)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_detachnode(db, &node);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (result);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntstatic isc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntadd_a(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt struct in_addr addr)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbnode_t *node = NULL;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdata_in_a_t a;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdata_t rdata = DNS_RDATA_INIT;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatalist_t rdatalist;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_t rdataset;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_result_t result;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_buffer_t b;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt unsigned char buf[DNS_NAME_MAXWIRE];
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_buffer_init(&b, buf, sizeof(buf));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataset_init(&rdataset);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdatalist_init(&rdatalist);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt a.common.rdtype = dns_rdatatype_a;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt a.common.rdclass = dns_db_class(db);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt a.in_addr = addr;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_rdata_fromstruct(&rdata, dns_db_class(db), dns_rdatatype_a,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt &a, &b));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.type = rdata.type;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.covers = 0;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.rdclass = rdata.rdclass;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt rdatalist.ttl = 86400;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ISC_LIST_APPEND(rdatalist.rdata, &rdata, link);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_rdatalist_tordataset(&rdatalist, &rdataset));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_findnode(db, name, ISC_TRUE, &node));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_addrdataset(db, node, version, 0, &rdataset, 0, NULL));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt cleanup:
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (node != NULL)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_detachnode(db, &node);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (result);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt/*
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * Driver-specific implementation of dns_db_create().
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * @param[in] argv Database-specific parameters from dns_db_create().
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt * @param[in] driverarg Driver-specific parameter from dns_db_register().
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntisc_result_t
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntcreate_db(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataclass_t rdclass, unsigned int argc, char *argv[],
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt void *driverarg, dns_db_t **dbp)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt{
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb_t *sampledb = NULL;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_result_t result;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_dbversion_t *version = NULL;
0d990f57aefcb3a2e82a91367fc600ccf69eea63Mark Andrews struct in_addr a_addr;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(type == dns_dbtype_zone);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(rdclass == dns_rdataclass_in);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(argc == 0);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(argv != NULL);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(driverarg != NULL); /* pointer to driver instance */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt REQUIRE(dbp != NULL && *dbp == NULL);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt UNUSED(driverarg); /* no driver-specific configuration */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
0d990f57aefcb3a2e82a91367fc600ccf69eea63Mark Andrews a_addr.s_addr = 0x0100007fU;
0d990f57aefcb3a2e82a91367fc600ccf69eea63Mark Andrews
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECKED_MEM_GET_PTR(mctx, sampledb);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt ZERO_PTR(sampledb);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_mem_attach(mctx, &sampledb->common.mctx);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_name_init(&sampledb->common.origin, NULL);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_ondestroy_init(&sampledb->common.ondest);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb->common.magic = DNS_DB_MAGIC;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb->common.impmagic = SAMPLEDB_MAGIC;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb->common.methods = &sampledb_methods;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb->common.attributes = 0;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb->common.rdclass = rdclass;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_name_dupwithoffsets(origin, mctx, &sampledb->common.origin));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(isc_refcount_init(&sampledb->refs, 1));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt /* Translate instance name to instance pointer. */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sampledb->inst = driverarg;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt /* Create internal instance of RBT DB implementation from BIND. */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_create(mctx, "rbt", origin, dns_dbtype_zone,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_rdataclass_in, 0, NULL, &sampledb->rbtdb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt /* Create fake SOA, NS, and A records to make database loadable. */
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(dns_db_newversion(sampledb->rbtdb, &version));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(add_soa(sampledb->rbtdb, version, origin, origin, origin));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(add_ns(sampledb->rbtdb, version, origin, origin));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt CHECK(add_a(sampledb->rbtdb, version, origin, a_addr));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_db_closeversion(sampledb->rbtdb, &version, ISC_TRUE);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt *dbp = (dns_db_t *)sampledb;
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (ISC_R_SUCCESS);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Huntcleanup:
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (sampledb != NULL) {
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (dns_name_dynamic(&sampledb->common.origin))
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt dns_name_free(&sampledb->common.origin, mctx);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_mem_putanddetach(&sampledb->common.mctx, sampledb,
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt sizeof(*sampledb));
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt }
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt return (result);
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt}