sdb.c revision 6e93e6ea4557291e847aced6a88adcdf39f06843
7d98a1783f222964bcde7d56dab77b822706204dBob Halley * Copyright (C) 2000, 2001 Internet Software Consortium.
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.
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.
35a1d7c80e14927d124d6ea6926cc29c64232c80Andreas Gustafsson/* $Id: sdb.c,v 1.36 2001/10/13 01:37:58 gson Exp $ */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson /* Unlocked */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson /* Unlocked */
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafssontypedef struct dns_sdblookup dns_sdbnode_t;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafssontypedef dns_sdballnodes_t sdb_dbiterator_t;
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define SDB_MAGIC ISC_MAGIC('S', 'D', 'B', '-')
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#define VALID_SDB(sdb) ((sdb) != NULL && \
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)
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson/* These values are taken from RFC 1537 */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson#define SDB_DEFAULT_MINIMUM (60 * 60 * 24)
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson/* This is a reasonable value */
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson unsigned int flags = sdb->implementation->flags; \
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson if ((flags & DNS_SDBFLAG_THREADSAFE) == 0) \
ea398d3eba82ec4d18a636e4e6e9e120e337dad2Andreas Gustafsson LOCK(&sdb->implementation->driverlock); \
8803b0510877fd08044542edbb55e2be72fae36fAndreas Gustafsson unsigned int flags = sdb->implementation->flags; \
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson if ((flags & DNS_SDBFLAG_THREADSAFE) == 0) \
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson UNLOCK(&sdb->implementation->driverlock); \
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 Gustafssonstatic isc_result_t findrdataset(dns_db_t *db, dns_dbnode_t *node,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson dns_rdatatype_t type, dns_rdatatype_t covers,
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafsson isc_stdtime_t now, dns_rdataset_t *rdataset,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencestatic isc_result_t createnode(dns_sdb_t *sdb, dns_sdbnode_t **nodep);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic void destroynode(dns_sdbnode_t *node);
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafssonstatic void detachnode(dns_db_t *db, dns_dbnode_t **targetp);
581db30788a4920ba8558287a0dccf3c1a210c5aAndreas Gustafssonstatic void list_tordataset(dns_rdatalist_t *rdatalist,
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 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 Gustafssonstatic isc_result_t dbiterator_pause(dns_dbiterator_t *iterator);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graffstatic isc_result_t dbiterator_origin(dns_dbiterator_t *iterator,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic dns_dbiteratormethods_t dbiterator_methods = {
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,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic dns_rdatasetitermethods_t rdatasetiter_methods = {
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence * Functions used by implementors of simple databases
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffdns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson void *driverdata, unsigned int flags, isc_mem_t *mctx,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(sdbimp != NULL && *sdbimp == NULL);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff REQUIRE((flags & ~(DNS_SDBFLAG_RELATIVEOWNER |
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp = isc_mem_get(mctx, sizeof(dns_sdbimplementation_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson "isc_mutex_init() failed: %s",
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_db_register(drivername, dns_sdb_create, imp, mctx,
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence isc_mem_put(mctx, imp, sizeof(dns_sdbimplementation_t));
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencedns_sdb_unregister(dns_sdbimplementation_t **sdbimp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(sdbimp != NULL && *sdbimp != NULL);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff isc_mem_put(mctx, imp, sizeof(dns_sdbimplementation_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonstatic inline unsigned int
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff for (size = 64; size < (64 * 1024); size *= 2)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssondns_sdb_putrr(dns_sdblookup_t *lookup, const char *type, dns_ttl_t ttl,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_rdatatype_fromtext(&typeval, (isc_textregion_t *)&r);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist = ISC_LIST_HEAD(lookup->lists);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist = ISC_LIST_NEXT(rdatalist, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist = isc_mem_get(mctx, sizeof(dns_rdatalist_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdatalist->rdclass = lookup->sdb->common.rdclass;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_APPEND(lookup->lists, rdatalist, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson rdata = isc_mem_get(mctx, sizeof(dns_rdata_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if ((imp->flags & DNS_SDBFLAG_RELATIVERDATA) != 0)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = isc_buffer_allocate(mctx, &rdatabuf, size);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_rdata_fromtext(rdata, rdatalist->rdclass,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_APPEND(lookup->buffers, rdatabuf, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, rdata, sizeof(dns_rdata_t));
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffdns_sdb_putnamedrr(dns_sdballnodes_t *allnodes, const char *name,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson const char *type, dns_ttl_t ttl, const char *data)
9637357a7765cc63ae401e02c727b1202f20bc08Bob Halley dns_sdb_t *sdb = (dns_sdb_t *)allnodes->common.db;
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff dns_sdbimplementation_t *imp = sdb->implementation;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if ((imp->flags & DNS_SDBFLAG_RELATIVERDATA) != 0)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_name_fromtext(newname, &b, origin, ISC_FALSE, NULL);
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 sdbnode = ISC_LIST_HEAD(allnodes->nodelist);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (sdbnode == NULL || !dns_name_equal(sdbnode->name, newname)) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbnode->name = isc_mem_get(mctx, sizeof(dns_name_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_name_dup(newname, mctx, sdbnode->name);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, sdbnode->name, sizeof(dns_name_t));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff ISC_LIST_PREPEND(allnodes->nodelist, sdbnode, link);
66c41c5b4ff384aae100772a3f2d722391202f63Andreas Gustafsson dns_name_equal(newname, &sdb->common.origin))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson return (dns_sdb_putrr(sdbnode, type, ttl, data));
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffdns_sdb_putsoa(dns_sdblookup_t *lookup, const char *mname, const char *rname,
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson char str[2 * DNS_NAME_MAXTEXT + 5 * (sizeof("2147483647")) + 7];
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson n = snprintf(str, sizeof str, "%s %s %u %u %u %u %u",
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff if (n >= (int)sizeof(str) || n < 0)
f4c0131a46ea183238027ef9c3400cc6079b8b85Andreas Gustafsson return (dns_sdb_putrr(lookup, "SOA", SDB_DEFAULT_TTL, str));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdbimplementation_t *imp = sdb->implementation;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson imp->methods->destroy(sdb->zone, imp->driverdata,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, sdb, sizeof(dns_sdb_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonbeginload(dns_db_t *db, dns_addrdatasetfunc_t *addp, dns_dbload_t **dbloadp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonendload(dns_db_t *db, dns_dbload_t **dbloadp) {
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrencedump(dns_db_t *db, dns_dbversion_t *version, const char *filename) {
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graffcurrentversion(dns_db_t *db, dns_dbversion_t **versionp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(versionp != NULL && *versionp == NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonnewversion(dns_db_t *db, dns_dbversion_t **versionp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonattachversion(dns_db_t *db, dns_dbversion_t *source,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(source != NULL && source == (void *) &dummy);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoncloseversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(versionp != NULL && *versionp == (void *) &dummy);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoncreatenode(dns_sdb_t *sdb, dns_sdbnode_t **nodep) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson node = isc_mem_get(sdb->common.mctx, sizeof(dns_sdbnode_t));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff attach((dns_db_t *)sdb, (dns_db_t **)&node->sdb);
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington "isc_mutex_init() failed: %s",
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_mem_put(sdb->common.mctx, node, sizeof(dns_sdbnode_t));
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_mem_put(mctx, rdata, sizeof(dns_rdata_t));
84feab0fad8ce53c5d26dff9bde89c4cae285908Brian Wellington isc_mem_put(mctx, list, sizeof(dns_rdatalist_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, node->name, sizeof(dns_name_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_mem_put(mctx, node, sizeof(dns_sdbnode_t));
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Grafffindnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(nodep != NULL && *nodep == NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_buffer_init(&b, namestr, sizeof(namestr));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) {
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence unsigned int labels;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_name_getlabelsequence(name, 0, labels, &relname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = dns_name_totext(&relname, ISC_TRUE, &b);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isorigin = dns_name_equal(name, &sdb->common.origin);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence result = imp->methods->lookup(sdb->zone, namestr, sdb->dbdata, node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isorigin && imp->methods->authority != NULL))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (isorigin && imp->methods->authority != NULL) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = imp->methods->authority(sdb->zone, sdb->dbdata, node);
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)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson unsigned int i;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(nodep == NULL || *nodep == NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(version == NULL || version == (void *) &dummy);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (!dns_name_issubdomain(name, &db->origin))
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson olabels = dns_name_countlabels(&db->origin);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Unless this is an explicit lookup at the origin, don't
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley * look at the origin.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look up the next label.
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dns_name_getlabelsequence(name, nlabels - i, i, xname);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look for a DNAME at the current label, unless this is
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff * Look for an NS at the current label, unless this is the
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * origin or glue is ok.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (i != olabels && (options & DNS_DBFIND_GLUEOK) == 0) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (i == nlabels && type == dns_rdatatype_any)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * If the current name is not the qname, add another label
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * and try again.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * If we're looking for ANY, we're done.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look for the qtype.
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = findrdataset(db, node, version, type,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson * Look for a CNAME
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson if (rdataset == &xrdataset && dns_rdataset_isassociated(rdataset))
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence xresult = dns_name_copy(xname, foundname, NULL);
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)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonattachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) {
cfefc47443d2035d13c827837e286f12c23e6eb4David Lawrence dns_sdbnode_t *node = (dns_sdbnode_t *)source;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson INSIST(node->references != 0); /* Catch overflow. */
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssondetachnode(dns_db_t *db, dns_dbnode_t **targetp) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(targetp != NULL && *targetp != NULL);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonexpirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) {
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrenceprintnode(dns_db_t *db, dns_dbnode_t *node, FILE *out) {
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssoncreateiterator(dns_db_t *db, isc_boolean_t relative_names,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson dns_sdbimplementation_t *imp = sdb->implementation;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff sdbiter = isc_mem_get(sdb->common.mctx, sizeof(sdb_dbiterator_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->common.methods = &dbiterator_methods;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->common.relative_names = relative_names;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson sdbiter->common.magic = DNS_DBITERATOR_MAGIC;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson result = imp->methods->allnodes(sdb->zone, sdb->dbdata, sdbiter);
732e0731dec1922747bb3b3147cf2c3d16b22eaaBob Halley dbiterator_destroy((dns_dbiterator_t **)&sdbiter);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_UNLINK(sdbiter->nodelist, sdbiter->origin, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson ISC_LIST_PREPEND(sdbiter->nodelist, sdbiter->origin, link);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *iteratorp = (dns_dbiterator_t *)sdbiter;
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_sdbnode_t *sdbnode = (dns_sdbnode_t *)node;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson list_tordataset(list, db, node, rdataset);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafssonallrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson isc_stdtime_t now, dns_rdatasetiter_t **iteratorp)
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson REQUIRE(version == NULL || version == &dummy);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence iterator = isc_mem_get(db->mctx, sizeof(sdb_rdatasetiter_t));
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson iterator->common.magic = DNS_RDATASETITER_MAGIC;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson iterator->common.methods = &rdatasetiter_methods;
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson attachnode(db, node, &iterator->common.node);
4cd3d6df39927315e3fadc07a8da3788175f4195Andreas Gustafsson *iteratorp = (dns_rdatasetiter_t *)iterator;
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,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencesubtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
c6e66777242752532a094561fc728233cab9bc2fAndreas Gustafsson dns_rdataset_t *rdataset, unsigned int options,
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 Gustafssonstatic unsigned int
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonovermem(dns_db_t *db, isc_boolean_t overmem) {
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 dns_name_init(&sdb->common.origin, NULL);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence "isc_mutex_init() failed: %s",
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = dns_name_dupwithoffsets(origin, mctx, &sdb->common.origin);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_buffer_init(&b, zonestr, sizeof(zonestr));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = dns_name_totext(origin, ISC_TRUE, &b);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb->zone = isc_mem_strdup(mctx, zonestr);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson result = imp->methods->create(sdb->zone, argc, argv,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mem_put(mctx, sdb, sizeof(dns_sdb_t));
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson * Rdataset Methods
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson dns_sdbnode_t *sdbnode = (dns_sdbnode_t *) node;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_db_t *db = (dns_db_t *) sdbnode->sdb;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_sdbnode_t *sdbnode = (dns_sdbnode_t *) node;
16ee1cb8c86d18000c7521b537db9aa57cf44907Andreas Gustafsson dns_db_t *db = (dns_db_t *) sdbnode->sdb;
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.
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson /* This should never fail. */
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset) ==
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson dns_db_attachnode(db, node, &rdataset->private5);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson * Database Iterator Methods
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 while (!ISC_LIST_EMPTY(sdbiter->nodelist)) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson ISC_LIST_UNLINK(sdbiter->nodelist, node, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson isc_mem_put(sdb->common.mctx, sdbiter, sizeof(sdb_dbiterator_t));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_first(dns_dbiterator_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_HEAD(sdbiter->nodelist);
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_TAIL(sdbiter->nodelist);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence sdbiter->current = ISC_LIST_HEAD(sdbiter->nodelist);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence if (dns_name_equal(sdbiter->current->name, name))
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_prev(dns_dbiterator_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_PREV(sdbiter->current, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiter->current = ISC_LIST_NEXT(sdbiter->current, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep,
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff attachnode(iterator->db, sdbiter->current, nodep);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (dns_name_copy(sdbiter->current->name, name, NULL));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_pause(dns_dbiterator_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssondbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson return (dns_name_copy(dns_rootname, name, NULL));
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson * Rdataset Iterator Methods
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 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 sdbiterator->current = ISC_LIST_HEAD(sdbnode->lists);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdatasetiter_next(dns_rdatasetiter_t *iterator) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdbiterator->current = ISC_LIST_NEXT(sdbiterator->current, link);
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafssonrdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) {
b2c71d98dfc4dab5c6b8c8f39cf8fed3d899e94cAndreas Gustafsson sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;