sdb.c revision 6e93e6ea4557291e847aced6a88adcdf39f06843
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson/*
7d98a1783f222964bcde7d56dab77b822706204dBob Halley * Copyright (C) 2000, 2001 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Permission to use, copy, modify, and distribute this software for any
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * purpose with or without fee is hereby granted, provided that the above
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
15a44745412679c30a6d022733925af70a38b715David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
15a44745412679c30a6d022733925af70a38b715David Lawrence * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
15a44745412679c30a6d022733925af70a38b715David Lawrence * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
15a44745412679c30a6d022733925af70a38b715David Lawrence * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15a44745412679c30a6d022733925af70a38b715David Lawrence * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
15a44745412679c30a6d022733925af70a38b715David Lawrence * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson/* $Id: sdb.c,v 1.36 2001/10/13 01:37:58 gson Exp $ */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <config.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
8a47ea1dadd3b985f5266f198423e01e225e218dDavid Lawrence#include <string.h>
999ae80184e3df1016ac74514124b0459ace4d01Andreas Gustafsson
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson#include <isc/buffer.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <isc/lex.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/log.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/magic.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/mem.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/once.h>
4bf54f182d5ac0bde48800af9000801cbc39ee15Brian Wellington#include <isc/print.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/region.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <isc/util.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/callbacks.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/db.h>
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington#include <dns/dbiterator.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/fixedname.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <dns/log.h>
d60f5b9bc8c1e1f7ddebc6c7834f7550a8e8be6fBob Halley#include <dns/rdata.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/rdatalist.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/rdataset.h>
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#include <dns/rdatasetiter.h>
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson#include <dns/rdatatype.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/result.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/sdb.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson#include <dns/types.h>
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence#include "rdatalist_p.h"
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstruct dns_sdbimplementation {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson const dns_sdbmethods_t *methods;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson void *driverdata;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int flags;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson isc_mem_t *mctx;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isc_mutex_t driverlock;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson dns_dbimplementation_t *dbimp;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson};
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafssonstruct dns_sdb {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson /* Unlocked */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson dns_db_t common;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson char *zone;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson dns_sdbimplementation_t *implementation;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson void *dbdata;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isc_mutex_t lock;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson /* Locked */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson unsigned int references;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson};
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafssonstruct dns_sdblookup {
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson /* Unlocked */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson unsigned int magic;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson dns_sdb_t *sdb;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson ISC_LIST(dns_rdatalist_t) lists;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson ISC_LIST(isc_buffer_t) buffers;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson dns_name_t *name;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson ISC_LINK(dns_sdblookup_t) link;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson isc_mutex_t lock;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson dns_rdatacallbacks_t callbacks;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson /* Locked */
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson unsigned int references;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson};
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafssontypedef struct dns_sdblookup dns_sdbnode_t;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafssonstruct dns_sdballnodes {
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_dbiterator_t common;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson ISC_LIST(dns_sdbnode_t) nodelist;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson dns_sdbnode_t *current;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson dns_sdbnode_t *origin;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson};
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafssontypedef dns_sdballnodes_t sdb_dbiterator_t;
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrencetypedef struct sdb_rdatasetiter {
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence dns_rdatasetiter_t common;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson dns_rdatalist_t *current;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson} sdb_rdatasetiter_t;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define SDB_MAGIC ISC_MAGIC('S', 'D', 'B', '-')
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
553727079c69cacf56aaa8fd2722d04bfbbc8ce1David Lawrence/*
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson * Note that "impmagic" is not the first four bytes of the struct, so
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson * ISC_MAGIC_VALID cannot be used.
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define VALID_SDB(sdb) ((sdb) != NULL && \
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence (sdb)->common.impmagic == SDB_MAGIC)
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson#define SDBLOOKUP_MAGIC ISC_MAGIC('S','D','B','L')
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define VALID_SDBLOOKUP(sdbl) ISC_MAGIC_VALID(sdbl, SDBLOOKUP_MAGIC)
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define VALID_SDBNODE(sdbn) VALID_SDBLOOKUP(sdbn)
ea398d3eba82ec4d18a636e4e6e9e120e337dad2Andreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson/* These values are taken from RFC 1537 */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define SDB_DEFAULT_REFRESH (60 * 60 * 8)
553727079c69cacf56aaa8fd2722d04bfbbc8ce1David Lawrence#define SDB_DEFAULT_RETRY (60 * 60 * 2)
94296c8d5b9c3c1ed13cf91c1f7b1d76d7fa0607David Lawrence#define SDB_DEFAULT_EXPIRE (60 * 60 * 24 * 7)
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define SDB_DEFAULT_MINIMUM (60 * 60 * 24)
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson/* This is a reasonable value */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define SDB_DEFAULT_TTL (60 * 60 * 24)
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence
f2fdfe7c42f3b10f3653f851ce5a0a90ee5ac1f9David Lawrence#define MAYBE_LOCK(sdb) \
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson do { \
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson unsigned int flags = sdb->implementation->flags; \
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson if ((flags & DNS_SDBFLAG_THREADSAFE) == 0) \
ea398d3eba82ec4d18a636e4e6e9e120e337dad2Andreas Gustafsson LOCK(&sdb->implementation->driverlock); \
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson } while (0)
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson
553727079c69cacf56aaa8fd2722d04bfbbc8ce1David Lawrence#define MAYBE_UNLOCK(sdb) \
94296c8d5b9c3c1ed13cf91c1f7b1d76d7fa0607David Lawrence do { \
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson unsigned int flags = sdb->implementation->flags; \
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson if ((flags & DNS_SDBFLAG_THREADSAFE) == 0) \
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson UNLOCK(&sdb->implementation->driverlock); \
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson } while (0)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic int dummy;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson dns_dbtype_t type, dns_rdataclass_t rdclass,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson unsigned int argc, char *argv[],
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson void *driverarg, dns_db_t **dbp);
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafssonstatic isc_result_t findrdataset(dns_db_t *db, dns_dbnode_t *node,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson dns_dbversion_t *version,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson dns_rdatatype_t type, dns_rdatatype_t covers,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson isc_stdtime_t now, dns_rdataset_t *rdataset,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson dns_rdataset_t *sigrdataset);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencestatic isc_result_t createnode(dns_sdb_t *sdb, dns_sdbnode_t **nodep);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic void destroynode(dns_sdbnode_t *node);
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafssonstatic void detachnode(dns_db_t *db, dns_dbnode_t **targetp);
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafssonstatic void list_tordataset(dns_rdatalist_t *rdatalist,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson dns_db_t *db, dns_dbnode_t *node,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson dns_rdataset_t *rdataset);
459e901f905e09a2e98f3ff70cb19fb2061aef83Mark Andrews
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafssonstatic void dbiterator_destroy(dns_dbiterator_t **iteratorp);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t dbiterator_first(dns_dbiterator_t *iterator);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t dbiterator_last(dns_dbiterator_t *iterator);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t dbiterator_seek(dns_dbiterator_t *iterator,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_t *name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t dbiterator_prev(dns_dbiterator_t *iterator);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t dbiterator_next(dns_dbiterator_t *iterator);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t dbiterator_current(dns_dbiterator_t *iterator,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_dbnode_t **nodep,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_t *name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t dbiterator_pause(dns_dbiterator_t *iterator);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic isc_result_t dbiterator_origin(dns_dbiterator_t *iterator,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_t *name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic dns_dbiteratormethods_t dbiterator_methods = {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dbiterator_destroy,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dbiterator_first,
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff dbiterator_last,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence dbiterator_seek,
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dbiterator_prev,
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dbiterator_next,
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dbiterator_current,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dbiterator_pause,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dbiterator_origin
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson};
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic isc_result_t rdatasetiter_first(dns_rdatasetiter_t *iterator);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t rdatasetiter_next(dns_rdatasetiter_t *iterator);
cf573ce6fb91d8d514425849c73cdbc2096d97e1Mark Andrewsstatic void rdatasetiter_current(dns_rdatasetiter_t *iterator,
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_rdataset_t *rdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic dns_rdatasetitermethods_t rdatasetiter_methods = {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatasetiter_destroy,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatasetiter_first,
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence rdatasetiter_next,
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence rdatasetiter_current
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence};
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson/*
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence * Functions used by implementors of simple databases
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence */
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrenceisc_result_t
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffdns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson void *driverdata, unsigned int flags, isc_mem_t *mctx,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence dns_sdbimplementation_t **sdbimp)
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbimplementation_t *imp;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence isc_result_t result;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(drivername != NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(methods != NULL);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff REQUIRE(methods->lookup != NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(mctx != NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(sdbimp != NULL && *sdbimp == NULL);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff REQUIRE((flags & ~(DNS_SDBFLAG_RELATIVEOWNER |
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson DNS_SDBFLAG_RELATIVERDATA |
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson DNS_SDBFLAG_THREADSAFE)) == 0);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp = isc_mem_get(mctx, sizeof(dns_sdbimplementation_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (imp == NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOMEMORY);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp->methods = methods;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp->driverdata = driverdata;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence imp->flags = flags;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp->mctx = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_attach(mctx, &imp->mctx);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence result = isc_mutex_init(&imp->driverlock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNEXPECTED_ERROR(__FILE__, __LINE__,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson "isc_mutex_init() failed: %s",
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_result_totext(result));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson goto cleanup_mctx;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp->dbimp = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_db_register(drivername, dns_sdb_create, imp, mctx,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson &imp->dbimp);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson goto cleanup_mutex;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence *sdbimp = imp;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence return (ISC_R_SUCCESS);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson cleanup_mutex:
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence DESTROYLOCK(&imp->driverlock);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence cleanup_mctx:
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence isc_mem_put(mctx, imp, sizeof(dns_sdbimplementation_t));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencevoid
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencedns_sdb_unregister(dns_sdbimplementation_t **sdbimp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbimplementation_t *imp;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_t *mctx;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(sdbimp != NULL && *sdbimp != NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence imp = *sdbimp;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dns_db_unregister(&imp->dbimp);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence DESTROYLOCK(&imp->driverlock);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence mctx = imp->mctx;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff isc_mem_put(mctx, imp, sizeof(dns_sdbimplementation_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_detach(&mctx);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff *sdbimp = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic inline unsigned int
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoninitial_size(const char *data) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int len = strlen(data);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int size;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff for (size = 64; size < (64 * 1024); size *= 2)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (len < size)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (size);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (64 * 1024);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonisc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssondns_sdb_putrr(dns_sdblookup_t *lookup, const char *type, dns_ttl_t ttl,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson const char *data)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdatalist_t *rdatalist;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence dns_rdata_t *rdata;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdatatype_t typeval;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_consttextregion_t r;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_t b;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff isc_buffer_t *rdatabuf;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_lex_t *lex;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_result_t result;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int size;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_t *mctx;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbimplementation_t *imp;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_t *origin;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(VALID_SDBLOOKUP(lookup));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(type != NULL);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence REQUIRE(data != NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson mctx = lookup->sdb->common.mctx;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff r.base = type;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff r.length = strlen(type);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_rdatatype_fromtext(&typeval, (isc_textregion_t *)&r);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist = ISC_LIST_HEAD(lookup->lists);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff while (rdatalist != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdatalist->type == typeval)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist = ISC_LIST_NEXT(rdatalist, link);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdatalist == NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist = isc_mem_get(mctx, sizeof(dns_rdatalist_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdatalist == NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOMEMORY);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist->rdclass = lookup->sdb->common.rdclass;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist->type = typeval;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist->covers = 0;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist->ttl = ttl;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_INIT(rdatalist->rdata);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff ISC_LINK_INIT(rdatalist, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_APPEND(lookup->lists, rdatalist, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson } else
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff if (rdatalist->ttl != ttl)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (DNS_R_BADTTL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdata = isc_mem_get(mctx, sizeof(dns_rdata_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdata == NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOMEMORY);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdata_init(rdata);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp = lookup->sdb->implementation;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if ((imp->flags & DNS_SDBFLAG_RELATIVERDATA) != 0)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson origin = &lookup->sdb->common.origin;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson else
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson origin = dns_rootname;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson lex = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = isc_lex_create(mctx, 64, &lex);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson goto failure;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson size = initial_size(data);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff do {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_init(&b, data, strlen(data));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_add(&b, strlen(data));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = isc_lex_openbuffer(lex, &b);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson goto failure;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatabuf = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = isc_buffer_allocate(mctx, &rdatabuf, size);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson goto failure;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_rdata_fromtext(rdata, rdatalist->rdclass,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist->type, lex,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson origin, ISC_FALSE,
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley mctx, rdatabuf,
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley &lookup->callbacks);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_free(&rdatabuf);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson size *= 2;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence } while (result == ISC_R_NOSPACE);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff goto failure;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_APPEND(lookup->buffers, rdatabuf, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley if (lex != NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_lex_destroy(&lex);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_SUCCESS);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff failure:
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdatabuf != NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_free(&rdatabuf);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (lex != NULL)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence isc_lex_destroy(&lex);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, rdata, sizeof(dns_rdata_t));
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffisc_result_t
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffdns_sdb_putnamedrr(dns_sdballnodes_t *allnodes, const char *name,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson const char *type, dns_ttl_t ttl, const char *data)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_t *newname, *origin;
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dns_fixedname_t fnewname;
9637357a7765cc63ae401e02c727b1202f20bc08Bob Halley dns_sdb_t *sdb = (dns_sdb_t *)allnodes->common.db;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_sdbimplementation_t *imp = sdb->implementation;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_sdbnode_t *sdbnode;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_t *mctx = sdb->common.mctx;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_t b;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff isc_result_t result;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_fixedname_init(&fnewname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson newname = dns_fixedname_name(&fnewname);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if ((imp->flags & DNS_SDBFLAG_RELATIVERDATA) != 0)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson origin = &sdb->common.origin;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson else
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson origin = dns_rootname;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_init(&b, name, strlen(name));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_add(&b, strlen(name));
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_name_fromtext(newname, &b, origin, ISC_FALSE, NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff if (allnodes->common.relative_names) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /* All names are relative to the root */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int nlabels = dns_name_countlabels(newname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_getlabelsequence(newname, 0, nlabels - 1, newname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbnode = ISC_LIST_HEAD(allnodes->nodelist);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (sdbnode == NULL || !dns_name_equal(sdbnode->name, newname)) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbnode = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = createnode(sdb, &sdbnode);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbnode->name = isc_mem_get(mctx, sizeof(dns_name_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (sdbnode->name == NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson destroynode(sdbnode);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOMEMORY);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_init(sdbnode->name, NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_name_dup(newname, mctx, sdbnode->name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, sdbnode->name, sizeof(dns_name_t));
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence destroynode(sdbnode);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence return (result);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence }
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff ISC_LIST_PREPEND(allnodes->nodelist, sdbnode, link);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence if (allnodes->origin == NULL &&
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson dns_name_equal(newname, &sdb->common.origin))
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson allnodes->origin = sdbnode;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (dns_sdb_putrr(sdbnode, type, ttl, data));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson}
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafssonisc_result_t
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffdns_sdb_putsoa(dns_sdblookup_t *lookup, const char *mname, const char *rname,
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff isc_uint32_t serial)
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson{
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson char str[2 * DNS_NAME_MAXTEXT + 5 * (sizeof("2147483647")) + 7];
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson int n;
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson REQUIRE(mname != NULL);
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson REQUIRE(rname != NULL);
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson n = snprintf(str, sizeof str, "%s %s %u %u %u %u %u",
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson mname, rname, serial,
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff SDB_DEFAULT_REFRESH, SDB_DEFAULT_RETRY,
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff SDB_DEFAULT_EXPIRE, SDB_DEFAULT_MINIMUM);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff if (n >= (int)sizeof(str) || n < 0)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_NOSPACE);
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson return (dns_sdb_putrr(lookup, "SOA", SDB_DEFAULT_TTL, str));
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson/*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * DB routines
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic void
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halleyattach(dns_db_t *source, dns_db_t **targetp) {
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dns_sdb_t *sdb = (dns_sdb_t *) source;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff REQUIRE(VALID_SDB(sdb));
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson LOCK(&sdb->lock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(sdb->references > 0);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdb->references++;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNLOCK(&sdb->lock);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence *targetp = source;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence}
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic void
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafssondestroy(dns_sdb_t *sdb) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_t *mctx;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdbimplementation_t *imp = sdb->implementation;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff mctx = sdb->common.mctx;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (imp->methods->destroy != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_LOCK(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp->methods->destroy(sdb->zone, imp->driverdata,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson &sdb->dbdata);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_UNLOCK(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_free(mctx, sdb->zone);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson DESTROYLOCK(&sdb->lock);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdb->common.magic = 0;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdb->common.impmagic = 0;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence dns_name_free(&sdb->common.origin, mctx);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, sdb, sizeof(dns_sdb_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_detach(&mctx);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic void
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencedetach(dns_db_t **dbp) {
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence dns_sdb_t *sdb = (dns_sdb_t *)(*dbp);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence isc_boolean_t need_destroy = ISC_FALSE;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson REQUIRE(VALID_SDB(sdb));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson LOCK(&sdb->lock);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff REQUIRE(sdb->references > 0);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdb->references--;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (sdb->references == 0)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson need_destroy = ISC_TRUE;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNLOCK(&sdb->lock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff if (need_destroy)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson destroy(sdb);
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *dbp = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonbeginload(dns_db_t *db, dns_addrdatasetfunc_t *addp, dns_dbload_t **dbloadp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence UNUSED(addp);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence UNUSED(dbloadp);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence return (ISC_R_NOTIMPLEMENTED);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonendload(dns_db_t *db, dns_dbload_t **dbloadp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(dbloadp);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOTIMPLEMENTED);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic isc_result_t
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencedump(dns_db_t *db, dns_dbversion_t *version, const char *filename) {
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(version);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence UNUSED(filename);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOTIMPLEMENTED);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffstatic void
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffcurrentversion(dns_db_t *db, dns_dbversion_t **versionp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(versionp != NULL && *versionp == NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *versionp = (void *) &dummy;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonnewversion(dns_db_t *db, dns_dbversion_t **versionp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(versionp);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOTIMPLEMENTED);
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic void
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonattachversion(dns_db_t *db, dns_dbversion_t *source,
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff dns_dbversion_t **targetp)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(source != NULL && source == (void *) &dummy);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(source);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(targetp);
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley return;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic void
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoncloseversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(versionp != NULL && *versionp == (void *) &dummy);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence REQUIRE(commit == ISC_FALSE);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(commit);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence *versionp = NULL;
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson}
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoncreatenode(dns_sdb_t *sdb, dns_sdbnode_t **nodep) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbnode_t *node;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_result_t result;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node = isc_mem_get(sdb->common.mctx, sizeof(dns_sdbnode_t));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff if (node == NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOMEMORY);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node->sdb = NULL;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff attach((dns_db_t *)sdb, (dns_db_t **)&node->sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_INIT(node->lists);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_INIT(node->buffers);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LINK_INIT(node, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node->name = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = isc_mutex_init(&node->lock);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington if (result != ISC_R_SUCCESS) {
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington UNEXPECTED_ERROR(__FILE__, __LINE__,
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington "isc_mutex_init() failed: %s",
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_result_totext(result));
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_mem_put(sdb->common.mctx, node, sizeof(dns_sdbnode_t));
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington return (ISC_R_UNEXPECTED);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence }
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington dns_rdatacallbacks_init(&node->callbacks);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington node->references = 1;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington node->magic = SDBLOOKUP_MAGIC;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington *nodep = node;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington return (ISC_R_SUCCESS);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington}
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellingtonstatic void
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellingtondestroynode(dns_sdbnode_t *node) {
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington dns_rdatalist_t *list;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington dns_rdata_t *rdata;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_buffer_t *b;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington dns_sdb_t *sdb;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_mem_t *mctx;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington sdb = node->sdb;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington mctx = sdb->common.mctx;
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington while (!ISC_LIST_EMPTY(node->lists)) {
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington list = ISC_LIST_HEAD(node->lists);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington while (!ISC_LIST_EMPTY(list->rdata)) {
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington rdata = ISC_LIST_HEAD(list->rdata);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington ISC_LIST_UNLINK(list->rdata, rdata, link);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_mem_put(mctx, rdata, sizeof(dns_rdata_t));
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington }
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington ISC_LIST_UNLINK(node->lists, list, link);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_mem_put(mctx, list, sizeof(dns_rdatalist_t));
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson while (!ISC_LIST_EMPTY(node->buffers)) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson b = ISC_LIST_HEAD(node->buffers);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_UNLINK(node->buffers, b, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_free(&b);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (node->name != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_free(node->name, mctx);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, node->name, sizeof(dns_name_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson DESTROYLOCK(&node->lock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node->magic = 0;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, node, sizeof(dns_sdbnode_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson detach((dns_db_t **)&sdb);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence}
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic isc_result_t
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Grafffindnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_dbnode_t **nodep)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence{
297377a5029e71566d4158bae67f127a3e4f3fc3Bob Halley dns_sdb_t *sdb = (dns_sdb_t *)db;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdbnode_t *node = NULL;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_result_t result;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_t b;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson char namestr[DNS_NAME_MAXTEXT + 1];
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_boolean_t isorigin;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbimplementation_t *imp;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(VALID_SDB(sdb));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(create == ISC_FALSE);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(nodep != NULL && *nodep == NULL);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(create);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp = sdb->implementation;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_init(&b, namestr, sizeof(namestr));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) {
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dns_name_t relname;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence unsigned int labels;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson labels = dns_name_countlabels(name) -
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_countlabels(&db->origin);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_init(&relname, NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_getlabelsequence(name, 0, labels, &relname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_name_totext(&relname, ISC_TRUE, &b);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson } else {
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff result = dns_name_totext(name, ISC_TRUE, &b);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_putuint8(&b, 0);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = createnode(sdb, &node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence return (result);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isorigin = dns_name_equal(name, &sdb->common.origin);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_LOCK(sdb);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence result = imp->methods->lookup(sdb->zone, namestr, sdb->dbdata, node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_UNLOCK(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS &&
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson !(result == ISC_R_NOTFOUND &&
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isorigin && imp->methods->authority != NULL))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson destroynode(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (isorigin && imp->methods->authority != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_LOCK(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = imp->methods->authority(sdb->zone, sdb->dbdata, node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_UNLOCK(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson destroynode(node);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff *nodep = node;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_SUCCESS);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonfind(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_dbnode_t **nodep, dns_name_t *foundname,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdb_t *sdb = (dns_sdb_t *)db;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_dbnode_t *node = NULL;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_fixedname_t fname;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_t xrdataset;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_t *xname;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int nlabels, olabels;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_result_t result;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int i;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff REQUIRE(VALID_SDB(sdb));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(nodep == NULL || *nodep == NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(version == NULL || version == (void *) &dummy);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence UNUSED(options);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (!dns_name_issubdomain(name, &db->origin))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (DNS_R_NXDOMAIN);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson olabels = dns_name_countlabels(&db->origin);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson nlabels = dns_name_countlabels(name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_fixedname_init(&fname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson xname = dns_fixedname_name(&fname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdataset == NULL)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff rdataset = &xrdataset;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff result = DNS_R_NXDOMAIN;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson for (i = olabels; i <= nlabels; i++) {
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence /*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Unless this is an explicit lookup at the origin, don't
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley * look at the origin.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence if (i == olabels && i != nlabels)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson continue;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look up the next label.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dns_name_getlabelsequence(name, nlabels - i, i, xname);
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley result = findnode(db, xname, ISC_FALSE, &node);
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley if (result != ISC_R_SUCCESS) {
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley result = DNS_R_NXDOMAIN;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson continue;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look for a DNAME at the current label, unless this is
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * the qname.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley if (i < nlabels) {
9637357a7765cc63ae401e02c727b1202f20bc08Bob Halley result = findrdataset(db, node, version,
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_rdatatype_dname,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson 0, now, rdataset, sigrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result == ISC_R_SUCCESS) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = DNS_R_DNAME;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /*
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff * Look for an NS at the current label, unless this is the
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * origin or glue is ok.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (i != olabels && (options & DNS_DBFIND_GLUEOK) == 0) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = findrdataset(db, node, version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdatatype_ns,
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff 0, now, rdataset, sigrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result == ISC_R_SUCCESS) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (i == nlabels && type == dns_rdatatype_any)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = DNS_R_ZONECUT;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_disassociate(rdataset);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence if (sigrdataset != NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_disassociate
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson (sigrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson } else
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = DNS_R_DELEGATION;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * If the current name is not the qname, add another label
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * and try again.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (i < nlabels) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson destroynode(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson continue;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * If we're looking for ANY, we're done.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff if (type == dns_rdatatype_any) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = ISC_R_SUCCESS;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look for the qtype.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = findrdataset(db, node, version, type,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson 0, now, rdataset, sigrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result == ISC_R_SUCCESS)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson /*
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look for a CNAME
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (type != dns_rdatatype_cname) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = findrdataset(db, node, version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdatatype_cname,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson 0, now, rdataset, sigrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result == ISC_R_SUCCESS) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = DNS_R_CNAME;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence result = DNS_R_NXRRSET;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdataset == &xrdataset && dns_rdataset_isassociated(rdataset))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_disassociate(rdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (foundname != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_result_t xresult;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence xresult = dns_name_copy(xname, foundname, NULL);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence if (xresult != ISC_R_SUCCESS) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson destroynode(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (dns_rdataset_isassociated(rdataset))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_disassociate(rdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (DNS_R_BADDB);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (nodep != NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *nodep = node;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson else if (node != NULL)
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence detachnode(db, &node);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic isc_result_t
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencefindzonecut(dns_db_t *db, dns_name_t *name, unsigned int options,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_stdtime_t now, dns_dbnode_t **nodep, dns_name_t *foundname,
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(options);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(now);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(nodep);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence UNUSED(foundname);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence UNUSED(rdataset);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence UNUSED(sigrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence return (ISC_R_NOTIMPLEMENTED);
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson}
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic void
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonattachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdb_t *sdb = (dns_sdb_t *)db;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dns_sdbnode_t *node = (dns_sdbnode_t *)source;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence REQUIRE(VALID_SDB(sdb));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson LOCK(&node->lock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson INSIST(node->references > 0);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node->references++;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson INSIST(node->references != 0); /* Catch overflow. */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNLOCK(&node->lock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *targetp = source;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic void
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssondetachnode(dns_db_t *db, dns_dbnode_t **targetp) {
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson dns_sdb_t *sdb = (dns_sdb_t *)db;
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson dns_sdbnode_t *node;
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson isc_boolean_t need_destroy = ISC_FALSE;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(VALID_SDB(sdb));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(targetp != NULL && *targetp != NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node = (dns_sdbnode_t *)(*targetp);
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson LOCK(&node->lock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson INSIST(node->references > 0);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node->references--;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (node->references == 0)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson need_destroy = ISC_TRUE;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNLOCK(&node->lock);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (need_destroy)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence destroynode(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *targetp = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonexpirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(now);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson INSIST(0);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_UNEXPECTED);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence}
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencestatic void
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrenceprintnode(dns_db_t *db, dns_dbnode_t *node, FILE *out) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(out);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff return;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoncreateiterator(dns_db_t *db, isc_boolean_t relative_names,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_dbiterator_t **iteratorp)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdb_t *sdb = (dns_sdb_t *)db;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdb_dbiterator_t *sdbiter;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbimplementation_t *imp = sdb->implementation;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_result_t result;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(VALID_SDB(sdb));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence if (imp->methods->allnodes == NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOTIMPLEMENTED);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff sdbiter = isc_mem_get(sdb->common.mctx, sizeof(sdb_dbiterator_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (sdbiter == NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOMEMORY);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->common.methods = &dbiterator_methods;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->common.db = NULL;
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dns_db_attach(db, &sdbiter->common.db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->common.relative_names = relative_names;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->common.magic = DNS_DBITERATOR_MAGIC;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_INIT(sdbiter->nodelist);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->current = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->origin = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_LOCK(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = imp->methods->allnodes(sdb->zone, sdb->dbdata, sdbiter);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson MAYBE_UNLOCK(sdb);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (result != ISC_R_SUCCESS) {
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dbiterator_destroy((dns_dbiterator_t **)&sdbiter);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (result);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (sdbiter->origin != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_UNLINK(sdbiter->nodelist, sdbiter->origin, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_PREPEND(sdbiter->nodelist, sdbiter->origin, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *iteratorp = (dns_dbiterator_t *)sdbiter;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_SUCCESS);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonfindrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdatatype_t type, dns_rdatatype_t covers,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_stdtime_t now, dns_rdataset_t *rdataset,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_t *sigrdataset)
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley{
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dns_rdatalist_t *list;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbnode_t *sdbnode = (dns_sdbnode_t *)node;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(VALID_SDBNODE(node));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(version);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(covers);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(now);
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley UNUSED(sigrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (type == dns_rdatatype_sig)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff return (ISC_R_NOTIMPLEMENTED);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff list = ISC_LIST_HEAD(sdbnode->lists);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson while (list != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (list->type == type)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson break;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson list = ISC_LIST_NEXT(list, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson }
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (list == NULL)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence return (ISC_R_NOTFOUND);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson list_tordataset(list, db, node, rdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_SUCCESS);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonallrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_stdtime_t now, dns_rdatasetiter_t **iteratorp)
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdb_rdatasetiter_t *iterator;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(version == NULL || version == &dummy);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(version);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(now);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence iterator = isc_mem_get(db->mctx, sizeof(sdb_rdatasetiter_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (iterator == NULL)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOMEMORY);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson iterator->common.magic = DNS_RDATASETITER_MAGIC;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson iterator->common.methods = &rdatasetiter_methods;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence iterator->common.db = db;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson iterator->common.node = NULL;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson attachnode(db, node, &iterator->common.node);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence iterator->common.version = version;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson iterator->common.now = now;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *iteratorp = (dns_rdatasetiter_t *)iterator;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_SUCCESS);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff}
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonaddrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdataset_t *addedrdataset)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson{
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(version);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(now);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(rdataset);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson UNUSED(options);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson UNUSED(addedrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOTIMPLEMENTED);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson}
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafssonstatic isc_result_t
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencesubtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson dns_rdataset_t *rdataset, unsigned int options,
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson dns_rdataset_t *newrdataset)
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson{
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence UNUSED(db);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson UNUSED(node);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson UNUSED(version);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson UNUSED(rdataset);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson UNUSED(options);
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson UNUSED(newrdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff return (ISC_R_NOTIMPLEMENTED);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafssonstatic isc_result_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssondeleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_rdatatype_t type, dns_rdatatype_t covers)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson{
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(version);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence UNUSED(type);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(covers);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_R_NOTIMPLEMENTED);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson}
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic isc_boolean_t
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonissecure(dns_db_t *db) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson UNUSED(db);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (ISC_FALSE);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff}
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic unsigned int
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonnodecount(dns_db_t *db) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson UNUSED(db);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (0);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_boolean_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonispersistent(dns_db_t *db) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson UNUSED(db);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_TRUE);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic void
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonovermem(dns_db_t *db, isc_boolean_t overmem) {
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff UNUSED(db);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson UNUSED(overmem);
b73a71166df5e5fffc2860f8d541270395e34a06Andreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic dns_dbmethods_t sdb_methods = {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson attach,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson detach,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson beginload,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson endload,
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff dump,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson currentversion,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson newversion,
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff attachversion,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson closeversion,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson findnode,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson find,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence findzonecut,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson attachnode,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson detachnode,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson expirenode,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson printnode,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence createiterator,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson findrdataset,
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff allrdatasets,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson addrdataset,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson subtractrdataset,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson deleterdataset,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson issecure,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson nodecount,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson ispersistent,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson overmem
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson};
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondns_sdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_rdataclass_t rdclass, unsigned int argc, char *argv[],
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson void *driverarg, dns_db_t **dbp)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson{
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdb_t *sdb;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_result_t result;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson char zonestr[DNS_NAME_MAXTEXT + 1];
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_buffer_t b;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dns_sdbimplementation_t *imp;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence REQUIRE(driverarg != NULL);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence imp = driverarg;
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (type != dns_dbtype_zone)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOTIMPLEMENTED);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff sdb = isc_mem_get(mctx, sizeof(dns_sdb_t));
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff if (sdb == NULL)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOMEMORY);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson memset(sdb, 0, sizeof(dns_sdb_t));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_name_init(&sdb->common.origin, NULL);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->common.attributes = 0;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->common.methods = &sdb_methods;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->common.rdclass = rdclass;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->common.mctx = NULL;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->implementation = imp;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff isc_mem_attach(mctx, &sdb->common.mctx);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence result = isc_mutex_init(&sdb->lock);
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence if (result != ISC_R_SUCCESS) {
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence UNEXPECTED_ERROR(__FILE__, __LINE__,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence "isc_mutex_init() failed: %s",
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_result_totext(result));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = ISC_R_UNEXPECTED;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson goto cleanup_mctx;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson }
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = dns_name_dupwithoffsets(origin, mctx, &sdb->common.origin);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (result != ISC_R_SUCCESS)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence goto cleanup_lock;
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_buffer_init(&b, zonestr, sizeof(zonestr));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = dns_name_totext(origin, ISC_TRUE, &b);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (result != ISC_R_SUCCESS)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence goto cleanup_origin;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_buffer_putuint8(&b, 0);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->zone = isc_mem_strdup(mctx, zonestr);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff if (sdb->zone == NULL) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = ISC_R_NOMEMORY;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff goto cleanup_origin;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson }
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->dbdata = NULL;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (imp->methods->create != NULL) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson MAYBE_LOCK(sdb);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = imp->methods->create(sdb->zone, argc, argv,
19c5c23ef6e38965949c996592bd92478da0612cMark Andrews imp->driverdata, &sdb->dbdata);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson MAYBE_UNLOCK(sdb);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (result != ISC_R_SUCCESS)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson goto cleanup_zonestr;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson }
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
19c5c23ef6e38965949c996592bd92478da0612cMark Andrews sdb->references = 1;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->common.magic = DNS_DB_MAGIC;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->common.impmagic = SDB_MAGIC;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson *dbp = (dns_db_t *)sdb;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson cleanup_zonestr:
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mem_free(mctx, sdb->zone);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson cleanup_origin:
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff dns_name_free(&sdb->common.origin, mctx);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson cleanup_lock:
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mutex_destroy(&sdb->lock);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson cleanup_mctx:
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mem_put(mctx, sdb, sizeof(dns_sdb_t));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mem_detach(&mctx);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (result);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson/*
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson * Rdataset Methods
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson */
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafssonstatic void
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondisassociate(dns_rdataset_t *rdataset) {
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_dbnode_t *node = rdataset->private5;
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson dns_sdbnode_t *sdbnode = (dns_sdbnode_t *) node;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_db_t *db = (dns_db_t *) sdbnode->sdb;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson detachnode(db, &node);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc__rdatalist_disassociate(rdataset);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic void
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence dns_dbnode_t *node = source->private5;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdbnode_t *sdbnode = (dns_sdbnode_t *) node;
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson dns_db_t *db = (dns_db_t *) sdbnode->sdb;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_dbnode_t *tempdb = NULL;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff isc__rdatalist_clone(source, target);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson attachnode(db, node, &tempdb);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson source->private5 = tempdb;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic dns_rdatasetmethods_t methods = {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson disassociate,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc__rdatalist_first,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc__rdatalist_next,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence isc__rdatalist_current,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson rdataset_clone,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc__rdatalist_count
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson};
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic void
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrencelist_tordataset(dns_rdatalist_t *rdatalist,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_db_t *db, dns_dbnode_t *node,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_rdataset_t *rdataset)
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff{
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence /*
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence * The sdb rdataset is an rdatalist with some additions.
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence * - private1 & private2 are used by the rdatalist.
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson * - private3 & private 4 are unused.
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson * - private5 is the node.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence */
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson /* This should never fail. */
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset) ==
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson ISC_R_SUCCESS);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson rdataset->methods = &methods;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_db_attachnode(db, node, &rdataset->private5);
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson/*
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson * Database Iterator Methods
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson */
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic void
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_destroy(dns_dbiterator_t **iteratorp) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)(*iteratorp);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdb_t *sdb = (dns_sdb_t *)sdbiter->common.db;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson while (!ISC_LIST_EMPTY(sdbiter->nodelist)) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdbnode_t *node;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson node = ISC_LIST_HEAD(sdbiter->nodelist);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson ISC_LIST_UNLINK(sdbiter->nodelist, node, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson destroynode(node);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson }
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_db_detach(&sdbiter->common.db);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mem_put(sdb->common.mctx, sdbiter, sizeof(sdb_dbiterator_t));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence *iteratorp = NULL;
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence}
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_first(dns_dbiterator_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_HEAD(sdbiter->nodelist);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (sdbiter->current == NULL)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOMORE);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson else
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence return (ISC_R_SUCCESS);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence}
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrencestatic isc_result_t
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrencedbiterator_last(dns_dbiterator_t *iterator) {
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_TAIL(sdbiter->nodelist);
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence if (sdbiter->current == NULL)
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence return (ISC_R_NOMORE);
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence else
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
7e5759783d5beeede331a817eede367cb518014fBrian Wellington
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencestatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence sdbiter->current = ISC_LIST_HEAD(sdbiter->nodelist);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson while (sdbiter->current != NULL)
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence if (dns_name_equal(sdbiter->current->name, name))
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOTFOUND);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_prev(dns_dbiterator_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_PREV(sdbiter->current, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (sdbiter->current == NULL)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOMORE);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson else
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff}
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrencestatic isc_result_t
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffdbiterator_next(dns_dbiterator_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_NEXT(sdbiter->current, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (sdbiter->current == NULL)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOMORE);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson else
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_name_t *name)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson{
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff attachnode(iterator->db, sdbiter->current, nodep);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (name != NULL)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (dns_name_copy(sdbiter->current->name, name, NULL));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_pause(dns_dbiterator_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson UNUSED(iterator);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson UNUSED(iterator);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (dns_name_copy(dns_rootname, name, NULL));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff/*
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson * Rdataset Iterator Methods
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson */
11d0a4a55edbd719a39a39625133dc121980dbabAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic void
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdatasetiter_destroy(dns_rdatasetiter_t **iteratorp) {
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)(*iteratorp);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson detachnode(sdbiterator->common.db, &sdbiterator->common.node);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mem_put(sdbiterator->common.db->mctx, sdbiterator,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sizeof(sdb_rdatasetiter_t));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson *iteratorp = NULL;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdatasetiter_first(dns_rdatasetiter_t *iterator) {
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdbnode_t *sdbnode = (dns_sdbnode_t *)iterator->node;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (ISC_LIST_EMPTY(sdbnode->lists))
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOMORE);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiterator->current = ISC_LIST_HEAD(sdbnode->lists);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonstatic isc_result_t
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdatasetiter_next(dns_rdatasetiter_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;
11d0a4a55edbd719a39a39625133dc121980dbabAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiterator->current = ISC_LIST_NEXT(sdbiterator->current, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson if (sdbiterator->current == NULL)
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_NOMORE);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson else
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (ISC_R_SUCCESS);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencestatic void
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson list_tordataset(sdbiterator->current, iterator->db, iterator->node,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson rdataset);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson}
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence