adb.c revision cc2720da38bb7bab2bf283de56dd90e9093d7f00
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
499b34cea04a46823d003d4c0520c8b03e8513cbBrian Wellington * Copyright (C) 1999-2003 Internet Software Consortium.
a3ab70dae26d009bf78b0594b2ab5eb9208f4b91Michael Graff * Permission to use, copy, modify, and distribute this software for any
a3ab70dae26d009bf78b0594b2ab5eb9208f4b91Michael Graff * purpose with or without fee is hereby granted, provided that the above
a3ab70dae26d009bf78b0594b2ab5eb9208f4b91Michael Graff * copyright notice and this permission notice appear in all copies.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * PERFORMANCE OF THIS SOFTWARE.
b6b21d80450f81d873d7e8cd21e7b72fdf512507Mark Andrews/* $Id: adb.c,v 1.229 2007/02/25 23:24:36 marka Exp $ */
a3ab70dae26d009bf78b0594b2ab5eb9208f4b91Michael Graff * In finds, if task == NULL, no events will be generated, and no events
142784f574e0b63e8bbcccb762eb8727ac7c76feBrian Wellington * have been sent. If task != NULL but taskaction == NULL, an event has been
a3ab70dae26d009bf78b0594b2ab5eb9208f4b91Michael Graff * posted but not yet freed. If neither are NULL, no event was posted.
a3ab70dae26d009bf78b0594b2ab5eb9208f4b91Michael Graff * After we have cleaned all buckets, dump the database contents.
1b6d529cb5ee0ad44f8518e1b8c2cbca54bbdf18David Lawrence#include <isc/string.h> /* Required for HP/UX (and others?) */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADB_MAGIC ISC_MAGIC('D', 'a', 'd', 'b')
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADB_VALID(x) ISC_MAGIC_VALID(x, DNS_ADB_MAGIC)
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBNAME_MAGIC ISC_MAGIC('a', 'd', 'b', 'N')
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBNAME_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBNAME_MAGIC)
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBNAMEHOOK_MAGIC ISC_MAGIC('a', 'd', 'N', 'H')
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBNAMEHOOK_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBNAMEHOOK_MAGIC)
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBLAMEINFO_MAGIC ISC_MAGIC('a', 'd', 'b', 'Z')
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBLAMEINFO_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBLAMEINFO_MAGIC)
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBENTRY_MAGIC ISC_MAGIC('a', 'd', 'b', 'E')
1b6d529cb5ee0ad44f8518e1b8c2cbca54bbdf18David Lawrence#define DNS_ADBENTRY_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBENTRY_MAGIC)
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graff#define DNS_ADBFETCH_MAGIC ISC_MAGIC('a', 'd', 'F', '4')
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADBFETCH_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBFETCH_MAGIC)
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graff#define DNS_ADBFETCH6_MAGIC ISC_MAGIC('a', 'd', 'F', '6')
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#define DNS_ADBFETCH6_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBFETCH6_MAGIC)
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff * The number of buckets needs to be a prime (for good hashing).
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff * XXXRTH How many buckets do we need?
58ff88cca7c169f7fbebc9b6e93bbba1fb345157Michael Graff#define NBUCKETS 1009 /*%< how many buckets for names/addrs */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff * For type 3 negative cache entries, we will remember that the address is
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff * broken for this long. XXXMLG This is also used for actual addresses, too.
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff * The intent is to keep us from constantly asking about A/AAAA records
1b6d529cb5ee0ad44f8518e1b8c2cbca54bbdf18David Lawrence * if the zone has extremely low TTLs.
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define ADB_CACHE_MAXIMUM 86400 /*%< seconds (86400 = 24 hours) */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff * Wake up every CLEAN_SECONDS and clean CLEAN_BUCKETS buckets, so that all
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff * buckets are cleaned in CLEAN_PERIOD seconds.
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff/*% See #CLEAN_PERIOD */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff/*% See #CLEAN_PERIOD */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define CLEAN_BUCKETS ((NBUCKETS * CLEAN_SECONDS) / CLEAN_PERIOD)
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define FREE_ITEMS 64 /*%< free count for memory pools */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define FILL_COUNT 16 /*%< fill count for memory pools */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADB_INVALIDBUCKET (-1) /*%< invalid bucket address */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graff#define DNS_ADB_MINADBSIZE (1024*1024) /*%< 1 Megabyte */
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Grafftypedef ISC_LIST(dns_adbname_t) dns_adbnamelist_t;
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Grafftypedef struct dns_adbnamehook dns_adbnamehook_t;
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Grafftypedef ISC_LIST(dns_adbnamehook_t) dns_adbnamehooklist_t;
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Grafftypedef struct dns_adblameinfo dns_adblameinfo_t;
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Grafftypedef ISC_LIST(dns_adbentry_t) dns_adbentrylist_t;
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff/*% dns adb structure */
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff unsigned int magic;
1b6d529cb5ee0ad44f8518e1b8c2cbca54bbdf18David Lawrence isc_mutex_t reflock; /*%< Covers irefcnt, erefcnt */
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff unsigned int irefcnt;
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff unsigned int erefcnt;
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff isc_mempool_t *nhmp; /*%< dns_adbnamehook_t */
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff isc_mempool_t *limp; /*%< dns_adblameinfo_t */
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff isc_mempool_t *aimp; /*%< dns_adbaddrinfo_t */
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff * Bucketized locks and lists for names.
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graff * XXXRTH Have a per-bucket structure that contains all of these?
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graff /*% See dns_adbnamelist_t */
1b6d529cb5ee0ad44f8518e1b8c2cbca54bbdf18David Lawrence /*% See dns_adbnamelist_t */
d736db6dc53e615e3f2d66d1ddbe28473694d107Michael Graff /*% See dns_adbnamelist_t */
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graff * Bucketized locks for entries.
1a0e33bc2044e1902493111db14cbf793083ac47Michael Graff * XXXRTH Have a per-bucket structure that contains all of these?
4e675038a097065ff13944232cd7c89ac5961984Michael Graff isc_boolean_t entry_sd[NBUCKETS]; /*%< shutting down */
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson * XXXMLG Document these structures.
d736db6dc53e615e3f2d66d1ddbe28473694d107Michael Graff/*% dns_adbname structure */
d736db6dc53e615e3f2d66d1ddbe28473694d107Michael Graff unsigned int magic;
e24f605ad64182532640dc6721070456b13112d5Michael Graff unsigned int flags;
d736db6dc53e615e3f2d66d1ddbe28473694d107Michael Graff unsigned int chains;
e24f605ad64182532640dc6721070456b13112d5Michael Graff/*% The adbfetch structure */
e24f605ad64182532640dc6721070456b13112d5Michael Graff unsigned int magic;
e24f605ad64182532640dc6721070456b13112d5Michael Graff * This is a small widget that dangles off a dns_adbname_t. It contains a
e24f605ad64182532640dc6721070456b13112d5Michael Graff * pointer to the address information about this host, and a link to the next
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff * namehook that will contain the next address this host has.
1a0e33bc2044e1902493111db14cbf793083ac47Michael Graff unsigned int magic;
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff * This is a small widget that holds qname-specific information about an
f1b68725503ff3e46001eee5a1751e29a43a09d1Andreas Gustafsson * address. Currently limited to lameness, but could just as easily be
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff * extended to other types of information about zones.
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff unsigned int magic;
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff * An address entry. It holds quite a bit of information about addresses,
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff * including edns state (in "flags"), rtt, and of course the address of
74889a341cac183d477e15cfead391a8f7bdba95Michael Graff unsigned int magic;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence unsigned int refcnt;
74889a341cac183d477e15cfead391a8f7bdba95Michael Graff unsigned int flags;
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff unsigned int srtt;
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graff * A nonzero 'expires' field indicates that the entry should
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graff * persist until that time. This allows entries found
74889a341cac183d477e15cfead391a8f7bdba95Michael Graff * using dns_adb_findaddrinfo() to persist for a limited time
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graff * even though they are not necessarily associated with a
efe2f579ba6fbec4229129015780f2d925085b04Michael Graff * Internal functions (and prototypes).
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline dns_adbname_t *new_adbname(dns_adb_t *, dns_name_t *);
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graffstatic inline void free_adbname(dns_adb_t *, dns_adbname_t **);
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graffstatic inline dns_adbnamehook_t *new_adbnamehook(dns_adb_t *,
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline void free_adbnamehook(dns_adb_t *, dns_adbnamehook_t **);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline dns_adblameinfo_t *new_adblameinfo(dns_adb_t *, dns_name_t *,
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline void free_adblameinfo(dns_adb_t *, dns_adblameinfo_t **);
7dbf5a0b64237aa3052f04f4c8f7d56be8ec5d79Michael Graffstatic inline dns_adbentry_t *new_adbentry(dns_adb_t *);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline void free_adbentry(dns_adb_t *, dns_adbentry_t **);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline dns_adbfind_t *new_adbfind(dns_adb_t *);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline isc_boolean_t free_adbfind(dns_adb_t *, dns_adbfind_t **);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline dns_adbaddrinfo_t *new_adbaddrinfo(dns_adb_t *, dns_adbentry_t *,
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline dns_adbfetch_t *new_adbfetch(dns_adb_t *);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline void free_adbfetch(dns_adb_t *, dns_adbfetch_t **);
1a0e33bc2044e1902493111db14cbf793083ac47Michael Graffstatic inline dns_adbname_t *find_name_and_lock(dns_adb_t *, dns_name_t *,
e24f605ad64182532640dc6721070456b13112d5Michael Graff unsigned int, int *);
4e675038a097065ff13944232cd7c89ac5961984Michael Graffstatic inline dns_adbentry_t *find_entry_and_lock(dns_adb_t *,
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic void dump_adb(dns_adb_t *, FILE *, isc_boolean_t debug, isc_stdtime_t);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic void print_dns_name(FILE *, dns_name_t *);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic void print_namehook_list(FILE *, const char *legend,
e24f605ad64182532640dc6721070456b13112d5Michael Graffstatic void print_find_list(FILE *, dns_adbname_t *);
c05e003dce672b2f8555a3e56857f29ce89c1677Michael Graffstatic void print_fetch_list(FILE *, dns_adbname_t *);
2311073ce0ef26c0250e91e4a083d7cc94fa7d33Michael Graffstatic inline isc_boolean_t dec_adb_irefcnt(dns_adb_t *);
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graffstatic inline void inc_adb_irefcnt(dns_adb_t *);
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graffstatic inline void inc_adb_erefcnt(dns_adb_t *);
74889a341cac183d477e15cfead391a8f7bdba95Michael Graffstatic inline void inc_entry_refcnt(dns_adb_t *, dns_adbentry_t *,
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graffstatic inline isc_boolean_t dec_entry_refcnt(dns_adb_t *, dns_adbentry_t *,
ae7d0a4375abaecfd5c5b0816616d9882831e69bMichael Graffstatic inline void violate_locking_hierarchy(isc_mutex_t *, isc_mutex_t *);
e4f074a2c2340ea80099beebecc3b89aa234fa8fMichael Graffstatic isc_boolean_t clean_namehooks(dns_adb_t *, dns_adbnamehooklist_t *);
a3ab70dae26d009bf78b0594b2ab5eb9208f4b91Michael Graffstatic void clean_target(dns_adb_t *, dns_name_t *);
static void water(void *, int);
((o) & DNS_ADBFIND_STARTATZONE))
(r) == DNS_R_NCACHENXRRSET)
(r) == DNS_R_NXRRSET)
(r) == DNS_R_NCACHENXDOMAIN)
(r) == DNS_R_NXRRSET || \
(r) == DNS_R_HINTNXRRSET)
static const char *errnames[] = {
static inline dns_ttl_t
return (ttl);
static isc_result_t
int addr_bucket;
unsigned int findoptions;
goto fail;
goto fail;
fail:
if (new_addresses_added) {
return (ISC_R_SUCCESS);
return (result);
static isc_boolean_t
name = *n;
*n = NULL;
if (result)
return (result);
if (result)
return (result);
static isc_boolean_t
if (overmem) {
static inline isc_boolean_t
int bucket;
return (result);
static inline isc_boolean_t
int bucket;
return (result);
static isc_boolean_t
int bucket;
return (result);
static isc_boolean_t
int bucket;
if (result)
return (result);
static isc_boolean_t
int addr_bucket;
return (result);
static isc_result_t
unsigned int nlabels;
int order;
return (result);
return (result);
return (result);
return (result);
return (result);
NULL);
return (result);
return (result);
return (ISC_R_SUCCESS);
unsigned int addrs)
switch (evtype) {
if ((notify) != 0) {
if (wanted == 0)
if (process) {
static inline isc_boolean_t
return (result);
int bucket;
if (lock)
if (lock)
static inline isc_boolean_t
int bucket;
if (lock)
if (lock)
if (!destroy_entry)
return (result);
if (result)
return (result);
static inline dns_adbname_t *
return (NULL);
return (NULL);
return (name);
dns_adbname_t *n;
n = *name;
n->magic = 0;
static inline dns_adbnamehook_t *
return (NULL);
return (nh);
static inline dns_adblameinfo_t *
return (NULL);
return (NULL);
return (li);
static inline dns_adbentry_t *
dns_adbentry_t *e;
isc_uint32_t r;
if (e == NULL)
return (NULL);
e->refcnt = 0;
e->flags = 0;
isc_random_get(&r);
e->expires = 0;
dns_adbentry_t *e;
e = *entry;
e->magic = 0;
static inline dns_adbfind_t *
dns_adbfind_t *h;
if (h == NULL)
return (NULL);
h->magic = 0;
h->partial_result = 0;
h->options = 0;
h->flags = 0;
return (NULL);
static inline dns_adbfetch_t *
dns_adbfetch_t *f;
if (f == NULL)
return (NULL);
f->magic = 0;
goto err;
goto err;
err:
return (NULL);
dns_adbfetch_t *f;
f = *fetch;
f->magic = 0;
static inline isc_boolean_t
static inline dns_adbaddrinfo_t *
return (NULL);
return (ai);
static inline dns_adbname_t *
int bucket;
return (adbname);
return (NULL);
static inline dns_adbentry_t *
int bucket;
return (entry);
return (NULL);
static isc_boolean_t
return (ISC_FALSE);
return (is_bad);
int bucket;
goto nextv4;
goto out;
goto nextv6;
goto out;
out:
static isc_boolean_t
return (result);
return (result);
return (result);
return (result);
return (result);
return (result);
static isc_boolean_t
return (result);
return (result);
if (result)
return (result);
static isc_boolean_t
return (result);
if (!result)
return (result);
static isc_boolean_t
return (result);
for (i = 0; i < CLEAN_BUCKETS; i++) {
== ISC_FALSE);
#ifdef DUMP_ADB_AFTER_CLEANING
return (ISC_R_NOMEMORY);
goto fail0b;
goto fail0c;
goto fail0d;
goto fail1;
for (i = 0; i < NBUCKETS; i++) {
for (i = 0; i < NBUCKETS; i++) {
goto fail2;
#define MPINIT(t, p, n) do { \
goto fail3; \
isc_mempool_setname((p), n); \
goto fail3;
goto fail3;
return (ISC_R_SUCCESS);
return (result);
if (need_exit_check) {
if (!need_check_exit)
if (need_check_exit)
int bucket;
unsigned int wanted_addresses;
unsigned int wanted_fetches;
unsigned int query_pending;
wanted_fetches = 0;
query_pending = 0;
if (now == 0)
return (ISC_R_NOMEMORY);
goto out;
goto out;
adbname);
goto post_copy;
adbname);
goto v6;
adbname);
goto post_copy;
goto fetch;
goto v6;
v6:
adbname);
goto fetch;
adbname);
goto post_copy;
goto fetch;
if (wanted_fetches != 0 &&
adbname);
adbname);
if (alias)
if (want_event) {
if (alias) {
goto out;
out:
if (want_event) {
return (result);
int bucket;
int bucket;
int unlock_bucket;
goto cleanup;
for (i = 0; i < NBUCKETS; i++)
for (i = 0; i < NBUCKETS; i++)
if (debug)
for (i = 0; i < NBUCKETS; i++)
for (i = 0; i < NBUCKETS; i++)
for (i = 0; i < NBUCKETS; i++) {
if (debug)
if (debug)
if (debug)
if (debug)
for (i = 0; i < NBUCKETS; i++) {
for (i = 0; i < NBUCKETS; i++)
for (i = 0; i < NBUCKETS; i++)
if (debug)
const char *tmpp;
case AF_INET:
case AF_INET6:
if (debug)
if (NAME_FETCH_A(n))
if (NAME_FETCH_AAAA(n))
static isc_result_t
switch (result) {
case DNS_R_GLUE:
case DNS_R_HINT:
case ISC_R_SUCCESS:
case DNS_R_NXDOMAIN:
case DNS_R_NXRRSET:
adbname);
adbname);
case DNS_R_NCACHENXDOMAIN:
case DNS_R_NCACHENXRRSET:
case DNS_R_CNAME:
case DNS_R_DNAME:
adbname);
return (result);
int bucket;
unsigned int address_type;
address_type = 0;
if (want_check_exit) {
goto out;
name);
goto check_result;
goto out;
out:
static isc_result_t
unsigned int options;
if (start_at_zone) {
adbname);
goto cleanup;
goto cleanup;
goto cleanup;
return (result);
int bucket;
goto unlock;
goto unlock;
return (result);
int bucket;
unsigned int new_srtt;
int bucket;
int bucket;
goto unlock;
goto unlock;
return (result);
int bucket;
if (want_check_exit) {
for (i = 0; i < NBUCKETS; i++)
for (i = 0; i < NBUCKETS; i++)
#ifdef DUMP_ADB_AFTER_CLEANING
int bucket;
if (overmem) {