diff --git a/lib/dns/include/dns/sdb.h b/lib/dns/include/dns/sdb.h index 2c42e32114..614e71580c 100644 --- a/lib/dns/include/dns/sdb.h +++ b/lib/dns/include/dns/sdb.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdb.h,v 1.4 2000/08/22 01:46:12 gson Exp $ */ +/* $Id: sdb.h,v 1.5 2000/08/22 22:06:46 bwelling Exp $ */ #ifndef DNS_SDB_H #define DNS_SDB_H 1 @@ -52,12 +52,6 @@ typedef struct dns_sdb dns_sdb_t; typedef struct dns_sdblookup dns_sdblookup_t; typedef struct dns_sdblookup dns_sdbnode_t; -/*** - *** Functions - ***/ - -ISC_LANG_BEGINDECLS - typedef isc_result_t (*dns_sdblookupfunc_t)(const char *zone, const char *name, void *dbdata, dns_sdblookup_t *); @@ -72,18 +66,31 @@ typedef isc_result_t typedef void (*dns_sdbdestroyfunc_t)(const char *zone, void *driverdata, void **dbdata); +typedef struct dns_sdbmethods { + dns_sdblookupfunc_t lookup; + dns_sdbauthorityfunc_t authority; + dns_sdbcreatefunc_t create; + dns_sdbdestroyfunc_t destroy; +} dns_sdbmethods_t; + +/*** + *** Functions + ***/ + +ISC_LANG_BEGINDECLS + #define DNS_SDBFLAG_RELATIVEOWNER 0x00000001U #define DNS_SDBFLAG_RELATIVERDATA 0x00000002U isc_result_t -dns_sdb_register(const char *drivername, dns_sdblookupfunc_t lookup, - dns_sdbauthorityfunc_t authority, dns_sdbcreatefunc_t create, - dns_sdbdestroyfunc_t destroy, void *driverdata, - unsigned int flags); +dns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods, + void *driverdata, unsigned int flags); /* - * Register a simple database driver of name 'drivername'. The name - * server will perform lookups in the database by calling the function - * 'lookup', passing it a printable zone name 'zone', a printable + * Register a simple database driver of name 'drivername' with the + * specified functions. + * + * The name server will perform lookups in the database by calling the + * function 'lookup', passing it a printable zone name 'zone', a printable * domain name 'name', and a copy of the argument 'dbdata' that * was potentially returned by the create function. The 'dns_sdblookup_t' * argument to 'lookup' and 'authority' is an opaque pointer to be passed to @@ -93,9 +100,10 @@ dns_sdb_register(const char *drivername, dns_sdblookupfunc_t lookup, * by calling ns_sdb_putrr() once for each record found. * * Lookups at the zone apex will cause the server to also call the - * function 'authority', which must provide an SOA record and NS - * records for the zone by calling ns_sdb_putrr() once for each of - * these records. + * function 'authority' (if non-NULL), which must provide an SOA record + * and NS records for the zone by calling ns_sdb_putrr() once for each of + * these records. The 'authority' function may be NULL if invoking + * the 'lookup' function on the zone apex will return SOA and NS records. * * The create function will be called when a database is created, and * allows the implementation to create database specific data. diff --git a/lib/dns/sdb.c b/lib/dns/sdb.c index 174d4d4ea0..e46c800123 100644 --- a/lib/dns/sdb.c +++ b/lib/dns/sdb.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdb.c,v 1.4 2000/08/22 17:32:07 gson Exp $ */ +/* $Id: sdb.c,v 1.5 2000/08/22 22:06:44 bwelling Exp $ */ #include @@ -44,10 +44,7 @@ typedef struct sdbimp { const char *drivername; - dns_sdblookupfunc_t lookup; - dns_sdbauthorityfunc_t authority; - dns_sdbcreatefunc_t create; - dns_sdbdestroyfunc_t destroy; + const dns_sdbmethods_t *methods; void *driverdata; unsigned int flags; } sdbimp_t; @@ -142,18 +139,16 @@ initialize(void) { * Functions used by implementors of simple databases */ isc_result_t -dns_sdb_register(const char *drivername, dns_sdblookupfunc_t lookup, - dns_sdbauthorityfunc_t authority, dns_sdbcreatefunc_t create, - dns_sdbdestroyfunc_t destroy, void *driverdata, - unsigned int flags) +dns_sdb_register(const char *drivername, const dns_sdbmethods_t *methods, + void *driverdata, unsigned int flags) { int i; int slot = -1; RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS); REQUIRE(drivername != NULL); - REQUIRE(lookup != NULL); - REQUIRE(authority != NULL); + REQUIRE(methods != NULL); + REQUIRE(methods->lookup != NULL); LOCK(&implock); for (i = 0; i < nimps; i++) { @@ -174,10 +169,7 @@ dns_sdb_register(const char *drivername, dns_sdblookupfunc_t lookup, } INSIST(slot >= 0 && slot < MAXSDBIMP); imps[slot].drivername = drivername; - imps[slot].lookup = lookup; - imps[slot].authority = authority; - imps[slot].create = create; - imps[slot].destroy = destroy; + imps[slot].methods = methods; imps[slot].driverdata = driverdata; imps[slot].flags = flags; UNLOCK(&implock); @@ -355,8 +347,9 @@ destroy(dns_sdb_t *sdb) { mctx = sdb->common.mctx; - if (imp->destroy != NULL) - imp->destroy(sdb->zone, imp->driverdata, &sdb->dbdata); + if (imp->methods->destroy != NULL) + imp->methods->destroy(sdb->zone, imp->driverdata, + &sdb->dbdata); isc_mem_free(mctx, sdb->zone); isc_mutex_destroy(&sdb->lock); @@ -560,14 +553,14 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create, isorigin = dns_name_equal(name, &sdb->common.origin); - result = imp->lookup(sdb->zone, namestr, sdb->dbdata, node); + result = imp->methods->lookup(sdb->zone, namestr, sdb->dbdata, node); if (result != ISC_R_SUCCESS && !isorigin) { destroynode(node); return (result); } - if (isorigin) { - result = imp->authority(sdb->zone, sdb->dbdata, node); + if (isorigin && imp->methods->authority != NULL) { + result = imp->methods->authority(sdb->zone, sdb->dbdata, node); if (result != ISC_R_SUCCESS) { destroynode(node); return (result); @@ -1038,9 +1031,9 @@ dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type, return (ISC_R_NOMEMORY); } sdb->dbdata = NULL; - if (imp->create != NULL) { - result = imp->create(sdb->zone, argc - 1, argv + 1, - imp->driverdata, &sdb->dbdata); + if (imp->methods->create != NULL) { + result = imp->methods->create(sdb->zone, argc - 1, argv + 1, + imp->driverdata, &sdb->dbdata); if (result != ISC_R_SUCCESS) { destroy(sdb); return (result);