sdb.c revision f3ca27e9fe307b55e35ea8d7b37351650630e5a3
7d98a1783f222964bcde7d56dab77b822706204dBob Halley * Copyright (C) 2000, 2001 Internet Software Consortium.
1687985cdfc3a4c330c5bdb02c131835f8756e3cBob Halley * Permission to use, copy, modify, and distribute this software for any
1687985cdfc3a4c330c5bdb02c131835f8756e3cBob Halley * purpose with or without fee is hereby granted, provided that the above
1687985cdfc3a4c330c5bdb02c131835f8756e3cBob Halley * 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.
8bc1e5bb4ad549ef0b0a57691e4e53dc50786e3dBrian Wellington/* $Id: sdb.c,v 1.37 2001/11/12 19:05:32 gson Exp $ */
edcd1247ad7e81bb8b430e610d9718f64c70f05dDavid Lawrence /* Unlocked */
8582a1e113c13886ccbd1b534d6c240315767be6Bob Halley /* Locked */
8582a1e113c13886ccbd1b534d6c240315767be6Bob Halley unsigned int references;
edcd1247ad7e81bb8b430e610d9718f64c70f05dDavid Lawrence /* Unlocked */
edcd1247ad7e81bb8b430e610d9718f64c70f05dDavid Lawrence unsigned int magic;
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafssontypedef struct dns_sdblookup dns_sdbnode_t;
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafsson#define SDB_MAGIC ISC_MAGIC('S', 'D', 'B', '-')
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Note that "impmagic" is not the first four bytes of the struct, so
8582a1e113c13886ccbd1b534d6c240315767be6Bob Halley * ISC_MAGIC_VALID cannot be used.
11d435aa4cf77e035445978f7e3776a3589715fdAndreas Gustafsson#define VALID_SDB(sdb) ((sdb) != NULL && \
11d435aa4cf77e035445978f7e3776a3589715fdAndreas Gustafsson#define SDBLOOKUP_MAGIC ISC_MAGIC('S','D','B','L')
11d435aa4cf77e035445978f7e3776a3589715fdAndreas Gustafsson#define VALID_SDBLOOKUP(sdbl) ISC_MAGIC_VALID(sdbl, SDBLOOKUP_MAGIC)
11d435aa4cf77e035445978f7e3776a3589715fdAndreas Gustafsson#define VALID_SDBNODE(sdbn) VALID_SDBLOOKUP(sdbn)
44fee668021c7ceef4ee1c848031d883a508b359James Brister/* These values are taken from RFC 1537 */
11d435aa4cf77e035445978f7e3776a3589715fdAndreas Gustafsson#define SDB_DEFAULT_EXPIRE (60 * 60 * 24 * 7)
11d435aa4cf77e035445978f7e3776a3589715fdAndreas Gustafsson#define SDB_DEFAULT_MINIMUM (60 * 60 * 24)
11d435aa4cf77e035445978f7e3776a3589715fdAndreas Gustafsson/* This is a reasonable value */
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafsson unsigned int flags = sdb->implementation->flags; \
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafsson if ((flags & DNS_SDBFLAG_THREADSAFE) == 0) \
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafsson LOCK(&sdb->implementation->driverlock); \
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafsson unsigned int flags = sdb->implementation->flags; \
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafsson if ((flags & DNS_SDBFLAG_THREADSAFE) == 0) \
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafsson UNLOCK(&sdb->implementation->driverlock); \
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencestatic isc_result_t dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin,
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafsson dns_dbtype_t type, dns_rdataclass_t rdclass,
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafssonstatic isc_result_t findrdataset(dns_db_t *db, dns_dbnode_t *node,
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafsson dns_rdatatype_t type, dns_rdatatype_t covers,
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafsson isc_stdtime_t now, dns_rdataset_t *rdataset,
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafssonstatic isc_result_t createnode(dns_sdb_t *sdb, dns_sdbnode_t **nodep);
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafssonstatic void destroynode(dns_sdbnode_t *node);
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafssonstatic void detachnode(dns_db_t *db, dns_dbnode_t **targetp);
7193a1762e428cfba06907e51fa9e4bce3b5569aAndreas Gustafssonstatic void list_tordataset(dns_rdatalist_t *rdatalist,
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafssonstatic void dbiterator_destroy(dns_dbiterator_t **iteratorp);
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafssonstatic isc_result_t dbiterator_first(dns_dbiterator_t *iterator);
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafssonstatic isc_result_t dbiterator_last(dns_dbiterator_t *iterator);
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafssonstatic isc_result_t dbiterator_seek(dns_dbiterator_t *iterator,
5542df09597c479be604da0ece8271cbc6fd9c4aDavid Lawrencestatic isc_result_t dbiterator_prev(dns_dbiterator_t *iterator);
1687985cdfc3a4c330c5bdb02c131835f8756e3cBob Halleystatic isc_result_t dbiterator_next(dns_dbiterator_t *iterator);
1687985cdfc3a4c330c5bdb02c131835f8756e3cBob Halleystatic isc_result_t dbiterator_current(dns_dbiterator_t *iterator,
5542df09597c479be604da0ece8271cbc6fd9c4aDavid Lawrencestatic isc_result_t dbiterator_pause(dns_dbiterator_t *iterator);
1687985cdfc3a4c330c5bdb02c131835f8756e3cBob Halleystatic isc_result_t dbiterator_origin(dns_dbiterator_t *iterator,
a0f6cda5fd9f2fcc4154bb63628f849b639a40caAndreas Gustafssonstatic dns_dbiteratormethods_t dbiterator_methods = {
DNS_SDBFLAG_THREADSAFE)) == 0);
return (ISC_R_NOMEMORY);
goto cleanup_mctx;
goto cleanup_mutex;
return (ISC_R_SUCCESS);
return (result);
unsigned int size;
return (size);
const char *data)
isc_buffer_t b;
unsigned int size;
return (result);
return (ISC_R_NOMEMORY);
return (DNS_R_BADTTL);
return (ISC_R_NOMEMORY);
goto failure;
goto failure;
goto failure;
goto failure;
return (ISC_R_SUCCESS);
return (result);
isc_buffer_t b;
return (result);
return (result);
return (ISC_R_NOMEMORY);
return (result);
if (n >= (int)sizeof(str) || n < 0)
return (ISC_R_NOSPACE);
if (need_destroy)
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
static isc_result_t
return (ISC_R_NOMEMORY);
return (ISC_R_UNEXPECTED);
return (ISC_R_SUCCESS);
isc_buffer_t *b;
isc_buffer_free(&b);
static isc_result_t
isc_buffer_t b;
unsigned int labels;
return (result);
return (result);
isc_buffer_putuint8(&b, 0);
return (result);
return (result);
return (result);
return (ISC_R_SUCCESS);
static isc_result_t
return (DNS_R_NXDOMAIN);
if (i < nlabels) {
(sigrdataset);
if (i < nlabels) {
return (DNS_R_BADDB);
return (result);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
if (need_destroy)
static isc_result_t
INSIST(0);
return (ISC_R_UNEXPECTED);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
return (ISC_R_NOMEMORY);
return (result);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
return (ISC_R_NOTFOUND);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_NOMEMORY);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
static isc_result_t
return (ISC_R_NOTIMPLEMENTED);
static isc_boolean_t
return (ISC_FALSE);
static isc_boolean_t
return (ISC_TRUE);
dump,
find,
static isc_result_t
isc_buffer_t b;
return (ISC_R_NOTIMPLEMENTED);
return (ISC_R_NOMEMORY);
goto cleanup_mctx;
goto cleanup_lock;
goto cleanup_origin;
isc_buffer_putuint8(&b, 0);
goto cleanup_origin;
goto cleanup_zonestr;
return (ISC_R_SUCCESS);
return (result);
static isc_result_t
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_SUCCESS);
return (ISC_R_NOTFOUND);
static isc_result_t
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_SUCCESS);
static isc_result_t
sizeof(sdb_rdatasetiter_t));
static isc_result_t
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
rdataset);