sdb.c revision 499b34cea04a46823d003d4c0520c8b03e8513cb
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * Copyright (C) 2000, 2001 Internet Software Consortium.
d63ae51ba337165172a9b50fd5d84805ffe50044Tinderbox User * Permission to use, copy, modify, and distribute this software for any
51eba00c8f281eda4daac725c0c7d1373a93a5aaAndreas Gustafsson * purpose with or without fee is hereby granted, provided that the above
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * copyright notice and this permission notice appear in all copies.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
51eba00c8f281eda4daac725c0c7d1373a93a5aaAndreas Gustafsson * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
19c7b1a0293498a3e36692c59646ed6e15ffc8d0Tinderbox User * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
83a28ca274521e15086fc39febde507bcc4e145eMark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt/* $Id: sdb.c,v 1.24 2001/01/09 21:51:32 bwelling Exp $ */
3001a1b4e6298466882a4147307b4c28a3b08f91Mark Andrews unsigned int flags;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt /* Unlocked */
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt /* Locked */
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt unsigned int references;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt /* Unlocked */
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews unsigned int magic;
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /* Locked */
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewstypedef struct sdb_rdatasetiter {
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews#define SDBLOOKUP_MAGIC ISC_MAGIC('S','D','B','L')
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews#define VALID_SDBLOOKUP(sdbl) ISC_MAGIC_VALID(sdbl, SDBLOOKUP_MAGIC)
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews#define VALID_SDBNODE(sdbn) VALID_SDBLOOKUP(sdbn)
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews/* These values are taken from RFC 1537 */
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews/* This is a reasonable value */
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews unsigned int flags = sdb->implementation->flags; \
28784b996be9f5f8939883a77a8fa4daccd873c3Mark Andrews unsigned int flags = sdb->implementation->flags; \
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin,
28784b996be9f5f8939883a77a8fa4daccd873c3Mark Andrewsstatic isc_result_t findrdataset(dns_db_t *db, dns_dbnode_t *node,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t createnode(dns_sdb_t *sdb, dns_sdbnode_t **nodep);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic void detachnode(dns_db_t *db, dns_dbnode_t **targetp);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic void list_tordataset(dns_rdatalist_t *rdatalist,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic void dbiterator_destroy(dns_dbiterator_t **iteratorp);
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austeinstatic isc_result_t dbiterator_first(dns_dbiterator_t *iterator);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t dbiterator_last(dns_dbiterator_t *iterator);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t dbiterator_seek(dns_dbiterator_t *iterator,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t dbiterator_prev(dns_dbiterator_t *iterator);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t dbiterator_next(dns_dbiterator_t *iterator);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t dbiterator_current(dns_dbiterator_t *iterator,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t dbiterator_pause(dns_dbiterator_t *iterator);
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austeinstatic isc_result_t dbiterator_origin(dns_dbiterator_t *iterator,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic dns_dbiteratormethods_t dbiterator_methods = {
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t rdatasetiter_first(dns_rdatasetiter_t *iterator);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic isc_result_t rdatasetiter_next(dns_rdatasetiter_t *iterator);
28784b996be9f5f8939883a77a8fa4daccd873c3Mark Andrewsstatic void rdatasetiter_current(dns_rdatasetiter_t *iterator,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsstatic dns_rdatasetitermethods_t rdatasetiter_methods = {
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews * Functions used by implementors of simple databases
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsdns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews void *driverdata, unsigned int flags, isc_mem_t *mctx,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews imp = isc_mem_get(mctx, sizeof(dns_sdbimplementation_t));
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews result = dns_db_register(drivername, dns_sdb_create, imp, mctx,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsdns_sdb_unregister(dns_sdbimplementation_t **sdbimp) {
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews isc_mem_put(mctx, imp, sizeof(dns_sdbimplementation_t));
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsdns_sdb_putrr(dns_sdblookup_t *lookup, const char *type, dns_ttl_t ttl,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews const char *data)
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews unsigned int size;
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews result = dns_rdatatype_fromtext(&typeval, (isc_textregion_t *)&r);
3001a1b4e6298466882a4147307b4c28a3b08f91Mark Andrews rdatalist = isc_mem_get(mctx, sizeof(dns_rdatalist_t));
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews rdatalist->rdclass = lookup->sdb->common.rdclass;
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews ISC_LIST_APPEND(lookup->lists, rdatalist, link);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews rdata = isc_mem_get(mctx, sizeof(dns_rdata_t));
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews if ((imp->flags & DNS_SDBFLAG_RELATIVERDATA) != 0)
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews result = isc_buffer_allocate(mctx, &rdatabuf, size);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews result = dns_rdata_fromtext(rdata, rdatalist->rdclass,
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrews ISC_LIST_APPEND(lookup->buffers, rdatabuf, link);
cf69e3d8b23f473dce7d07a926a3284d614f363bMark Andrewsdns_sdb_putnamedrr(dns_sdballnodes_t *allnodes, const char *name,
67d01dcacb2051a03377c8ec5c0e36604c17aea5Evan Hunt const char *type, dns_ttl_t ttl, const char *data)
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews dns_sdb_t *sdb = (dns_sdb_t *)allnodes->common.db;
6cf369f528c4acd8182eada41ad83b8d97623db8Mark Andrews dns_sdbimplementation_t *imp = sdb->implementation;
6cf369f528c4acd8182eada41ad83b8d97623db8Mark Andrews if ((imp->flags & DNS_SDBFLAG_RELATIVERDATA) != 0)
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein result = dns_name_fromtext(newname, &b, origin, ISC_FALSE, NULL);
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /* All names are relative to the root */
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein unsigned int nlabels = dns_name_countlabels(newname);
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein dns_name_getlabelsequence(newname, 0, nlabels - 1, newname);
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein if (sdbnode == NULL || !dns_name_equal(sdbnode->name, newname)) {
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) {
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);
return (ISC_R_UNEXPECTED);
return (result);
return (result);
isc_buffer_putuint8(&b, 0);
return (ISC_R_NOMEMORY);
return (result);
return (ISC_R_SUCCESS);
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);