From 24a2d84aedbad12fba2ca319c98745e62ef0bc16 Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Thu, 6 Jan 2000 00:56:37 +0000 Subject: [PATCH] add DNS_ADBFIND_STARTATROOT --- lib/dns/adb.c | 43 ++++++++++++++++++++++++++++++--------- lib/dns/include/dns/adb.h | 1 + 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/dns/adb.c b/lib/dns/adb.c index 6100bbd290..708e34a9d7 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -304,10 +304,11 @@ static void check_expire_namehooks(dns_adbname_t *, isc_stdtime_t); static void cancel_fetches_at_name(dns_adb_t *, dns_adbname_t *); static isc_result_t dbfind_name(dns_adbname_t *, isc_stdtime_t, isc_boolean_t, dns_rdatatype_t); -static isc_result_t fetch_name_v4(dns_adbname_t *, isc_stdtime_t); +static isc_result_t fetch_name_v4(dns_adbname_t *, isc_stdtime_t, + isc_boolean_t); static isc_result_t fetch_name_aaaa(dns_adbname_t *, isc_stdtime_t); static isc_result_t fetch_name_a6(dns_adbname_t *, isc_stdtime_t, - isc_boolean_t); + isc_boolean_t, isc_boolean_t); static inline void check_exit(dns_adb_t *); static void timer_cleanup(isc_task_t *, isc_event_t *); static void destroy(dns_adb_t *); @@ -368,6 +369,8 @@ static isc_result_t dbfind_a6(dns_adbname_t *, isc_stdtime_t, isc_boolean_t); #define FIND_WANTEMPTYEVENT(fn) (((fn)->options & DNS_ADBFIND_EMPTYEVENT) != 0) #define FIND_AVOIDFETCHES(fn) (((fn)->options & DNS_ADBFIND_AVOIDFETCHES) \ != 0) +#define FIND_STARTATROOT(fn) (((fn)->options & DNS_ADBFIND_STARTATROOT) \ + != 0) #define FIND_HAS_ADDRS(fn) (!ISC_LIST_EMPTY((fn)->list)) @@ -2150,9 +2153,8 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action, dns_adbfind_t *find; dns_adbname_t *adbname; int bucket; - isc_boolean_t use_hints; + isc_boolean_t use_hints, want_event, start_at_root; isc_result_t result; - isc_boolean_t want_event; unsigned int wanted_addresses; unsigned int wanted_fetches; unsigned int query_pending; @@ -2172,6 +2174,7 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action, wanted_fetches = 0; query_pending = 0; want_event = ISC_FALSE; + start_at_root = ISC_FALSE; if (now == 0) isc_stdtime_get(&now); @@ -2300,11 +2303,15 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action, * be acceptable so we have to launch fetches. */ + if (FIND_STARTATROOT(find)) + start_at_root = ISC_TRUE; + /* * Start V4. */ if (WANT_INET(wanted_fetches) && - fetch_name_v4(adbname, now) == ISC_R_SUCCESS) { + fetch_name_v4(adbname, now, start_at_root) == + ISC_R_SUCCESS) { DP(DEF_LEVEL, "dns_adb_createfind: Started A fetch for name %p", adbname); @@ -2314,7 +2321,8 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action, * Start V6. */ if (WANT_INET6(wanted_fetches) && - fetch_name_a6(adbname, now, use_hints) == ISC_R_SUCCESS) { + fetch_name_a6(adbname, now, use_hints, start_at_root) == + ISC_R_SUCCESS) { DP(DEF_LEVEL, "dns_adb_createfind: Started A6 fetch for name %p", adbname); @@ -3343,7 +3351,8 @@ fetch_callback_a6(isc_task_t *task, isc_event_t *ev) } static isc_result_t -fetch_name_v4(dns_adbname_t *adbname, isc_stdtime_t now) +fetch_name_v4(dns_adbname_t *adbname, isc_stdtime_t now, + isc_boolean_t start_at_root) { isc_result_t result; dns_adbfetch_t *fetch; @@ -3352,6 +3361,7 @@ fetch_name_v4(dns_adbname_t *adbname, isc_stdtime_t now) isc_buffer_t buffer; unsigned char ndata[256]; dns_adb_t *adb; + dns_name_t *name; INSIST(DNS_ADBNAME_VALID(adbname)); adb = adbname->adb; @@ -3366,7 +3376,13 @@ fetch_name_v4(dns_adbname_t *adbname, isc_stdtime_t now) dns_name_setbuffer(&fname, &buffer); dns_rdataset_init(&nameservers); - result = dns_view_findzonecut(adb->view, &adbname->name, &fname, now, + if (start_at_root) { + DP(50, "fetch_name_v4: starting at DNS root for name %p", + adbname); + name = dns_rootname; + } else + name = &adbname->name; + result = dns_view_findzonecut(adb->view, name, &fname, now, 0, ISC_TRUE, &nameservers, NULL); if (result != ISC_R_SUCCESS) goto cleanup; @@ -3458,7 +3474,7 @@ fetch_name_aaaa(dns_adbname_t *adbname, isc_stdtime_t now) static isc_result_t fetch_name_a6(dns_adbname_t *adbname, isc_stdtime_t now, - isc_boolean_t use_hints) + isc_boolean_t use_hints, isc_boolean_t start_at_root) { isc_result_t result; dns_adbfetch6_t *fetch; @@ -3467,6 +3483,7 @@ fetch_name_a6(dns_adbname_t *adbname, isc_stdtime_t now, isc_buffer_t buffer; unsigned char ndata[256]; dns_adb_t *adb; + dns_name_t *name; INSIST(DNS_ADBNAME_VALID(adbname)); adb = adbname->adb; @@ -3481,7 +3498,13 @@ fetch_name_a6(dns_adbname_t *adbname, isc_stdtime_t now, dns_name_setbuffer(&fname, &buffer); dns_rdataset_init(&nameservers); - result = dns_view_findzonecut(adb->view, &adbname->name, &fname, now, + if (start_at_root) { + DP(50, "fetch_name_a6: starting at DNS root for name %p", + adbname); + name = dns_rootname; + } else + name = &adbname->name; + result = dns_view_findzonecut(adb->view, name, &fname, now, 0, ISC_TRUE, &nameservers, NULL); if (result != ISC_R_SUCCESS) goto cleanup; diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index 88a53e5315..51e34c8964 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -141,6 +141,7 @@ struct dns_adbfind { #define DNS_ADBFIND_EMPTYEVENT 0x00000004 #define DNS_ADBFIND_WANTEVENT 0x00000008 #define DNS_ADBFIND_AVOIDFETCHES 0x00000010 +#define DNS_ADBFIND_STARTATROOT 0x00000020 /* dns_adbaddrinfo_t *