diff options
Diffstat (limited to 'contrib/bind9/lib/dns/dbtable.c')
-rw-r--r-- | contrib/bind9/lib/dns/dbtable.c | 291 |
1 files changed, 0 insertions, 291 deletions
diff --git a/contrib/bind9/lib/dns/dbtable.c b/contrib/bind9/lib/dns/dbtable.c deleted file mode 100644 index b091e42..0000000 --- a/contrib/bind9/lib/dns/dbtable.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC") - * Copyright (C) 1999-2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * $Id: dbtable.c,v 1.28.18.3 2005/07/12 01:22:19 marka Exp $ - */ - -/*! \file - * \author - * Principal Author: DCL - */ - -#include <config.h> - -#include <isc/mem.h> -#include <isc/rwlock.h> -#include <isc/util.h> - -#include <dns/dbtable.h> -#include <dns/db.h> -#include <dns/rbt.h> -#include <dns/result.h> - -struct dns_dbtable { - /* Unlocked. */ - unsigned int magic; - isc_mem_t * mctx; - dns_rdataclass_t rdclass; - isc_mutex_t lock; - isc_rwlock_t tree_lock; - /* Locked by lock. */ - unsigned int references; - /* Locked by tree_lock. */ - dns_rbt_t * rbt; - dns_db_t * default_db; -}; - -#define DBTABLE_MAGIC ISC_MAGIC('D', 'B', '-', '-') -#define VALID_DBTABLE(dbtable) ISC_MAGIC_VALID(dbtable, DBTABLE_MAGIC) - -static void -dbdetach(void *data, void *arg) { - dns_db_t *db = data; - - UNUSED(arg); - - dns_db_detach(&db); -} - -isc_result_t -dns_dbtable_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, - dns_dbtable_t **dbtablep) -{ - dns_dbtable_t *dbtable; - isc_result_t result; - - REQUIRE(mctx != NULL); - REQUIRE(dbtablep != NULL && *dbtablep == NULL); - - dbtable = (dns_dbtable_t *)isc_mem_get(mctx, sizeof(*dbtable)); - if (dbtable == NULL) - return (ISC_R_NOMEMORY); - - dbtable->rbt = NULL; - result = dns_rbt_create(mctx, dbdetach, NULL, &dbtable->rbt); - if (result != ISC_R_SUCCESS) - goto clean1; - - result = isc_mutex_init(&dbtable->lock); - if (result != ISC_R_SUCCESS) - goto clean2; - - result = isc_rwlock_init(&dbtable->tree_lock, 0, 0); - if (result != ISC_R_SUCCESS) - goto clean3; - - dbtable->default_db = NULL; - dbtable->mctx = mctx; - dbtable->rdclass = rdclass; - dbtable->magic = DBTABLE_MAGIC; - dbtable->references = 1; - - *dbtablep = dbtable; - - return (ISC_R_SUCCESS); - - clean3: - DESTROYLOCK(&dbtable->lock); - - clean2: - dns_rbt_destroy(&dbtable->rbt); - - clean1: - isc_mem_put(mctx, dbtable, sizeof(*dbtable)); - - return (result); -} - -static inline void -dbtable_free(dns_dbtable_t *dbtable) { - /* - * Caller must ensure that it is safe to call. - */ - - RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write); - - if (dbtable->default_db != NULL) - dns_db_detach(&dbtable->default_db); - - dns_rbt_destroy(&dbtable->rbt); - - RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write); - - isc_rwlock_destroy(&dbtable->tree_lock); - - dbtable->magic = 0; - - isc_mem_put(dbtable->mctx, dbtable, sizeof(*dbtable)); -} - -void -dns_dbtable_attach(dns_dbtable_t *source, dns_dbtable_t **targetp) { - REQUIRE(VALID_DBTABLE(source)); - REQUIRE(targetp != NULL && *targetp == NULL); - - LOCK(&source->lock); - - INSIST(source->references > 0); - source->references++; - INSIST(source->references != 0); - - UNLOCK(&source->lock); - - *targetp = source; -} - -void -dns_dbtable_detach(dns_dbtable_t **dbtablep) { - dns_dbtable_t *dbtable; - isc_boolean_t free_dbtable = ISC_FALSE; - - REQUIRE(dbtablep != NULL); - dbtable = *dbtablep; - REQUIRE(VALID_DBTABLE(dbtable)); - - LOCK(&dbtable->lock); - - INSIST(dbtable->references > 0); - dbtable->references--; - if (dbtable->references == 0) - free_dbtable = ISC_TRUE; - - UNLOCK(&dbtable->lock); - - if (free_dbtable) - dbtable_free(dbtable); - - *dbtablep = NULL; -} - -isc_result_t -dns_dbtable_add(dns_dbtable_t *dbtable, dns_db_t *db) { - isc_result_t result; - dns_db_t *clone; - - REQUIRE(VALID_DBTABLE(dbtable)); - REQUIRE(dns_db_class(db) == dbtable->rdclass); - - clone = NULL; - dns_db_attach(db, &clone); - - RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write); - result = dns_rbt_addname(dbtable->rbt, dns_db_origin(clone), clone); - RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write); - - return (result); -} - -void -dns_dbtable_remove(dns_dbtable_t *dbtable, dns_db_t *db) { - dns_db_t *stored_data = NULL; - isc_result_t result; - dns_name_t *name; - - REQUIRE(VALID_DBTABLE(dbtable)); - - name = dns_db_origin(db); - - /* - * There is a requirement that the association of name with db - * be verified. With the current rbt.c this is expensive to do, - * because effectively two find operations are being done, but - * deletion is relatively infrequent. - * XXXDCL ... this could be cheaper now with dns_rbt_deletenode. - */ - - RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write); - - result = dns_rbt_findname(dbtable->rbt, name, 0, NULL, - (void **) (void *)&stored_data); - - if (result == ISC_R_SUCCESS) { - INSIST(stored_data == db); - - (void)dns_rbt_deletename(dbtable->rbt, name, ISC_FALSE); - } - - RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write); -} - -void -dns_dbtable_adddefault(dns_dbtable_t *dbtable, dns_db_t *db) { - REQUIRE(VALID_DBTABLE(dbtable)); - REQUIRE(dbtable->default_db == NULL); - REQUIRE(dns_name_compare(dns_db_origin(db), dns_rootname) == 0); - - RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write); - - dbtable->default_db = NULL; - dns_db_attach(db, &dbtable->default_db); - - RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write); -} - -void -dns_dbtable_getdefault(dns_dbtable_t *dbtable, dns_db_t **dbp) { - REQUIRE(VALID_DBTABLE(dbtable)); - REQUIRE(dbp != NULL && *dbp == NULL); - - RWLOCK(&dbtable->tree_lock, isc_rwlocktype_read); - - dns_db_attach(dbtable->default_db, dbp); - - RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_read); -} - -void -dns_dbtable_removedefault(dns_dbtable_t *dbtable) { - REQUIRE(VALID_DBTABLE(dbtable)); - - RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write); - - dns_db_detach(&dbtable->default_db); - - RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write); -} - -isc_result_t -dns_dbtable_find(dns_dbtable_t *dbtable, dns_name_t *name, - unsigned int options, dns_db_t **dbp) -{ - dns_db_t *stored_data = NULL; - isc_result_t result; - unsigned int rbtoptions = 0; - - REQUIRE(dbp != NULL && *dbp == NULL); - - if ((options & DNS_DBTABLEFIND_NOEXACT) != 0) - rbtoptions |= DNS_RBTFIND_NOEXACT; - - RWLOCK(&dbtable->tree_lock, isc_rwlocktype_read); - - result = dns_rbt_findname(dbtable->rbt, name, rbtoptions, NULL, - (void **) (void *)&stored_data); - - if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) - dns_db_attach(stored_data, dbp); - else if (dbtable->default_db != NULL) { - dns_db_attach(dbtable->default_db, dbp); - result = DNS_R_PARTIALMATCH; - } else - result = ISC_R_NOTFOUND; - - RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_read); - - return (result); -} |