zone.c revision 2f4ffd7f5594c0464f2a872aee5ef102f6f7b10f
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * Copyright (C) 1999-2003 Internet Software Consortium.
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * Permission to use, copy, modify, and distribute this software for any
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * purpose with or without fee is hereby granted, provided that the above
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * copyright notice and this permission notice appear in all copies.
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
a14613fce99dee3cad5bf842fd6be78f8e463582Brian Wellington * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * PERFORMANCE OF THIS SOFTWARE.
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence/* $Id: zone.c,v 1.428 2005/01/10 23:43:22 marka Exp $ */
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington#define DNS_ZONE_VALID(zone) ISC_MAGIC_VALID(zone, ZONE_MAGIC)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define NOTIFY_MAGIC ISC_MAGIC('N', 't', 'f', 'y')
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define DNS_NOTIFY_VALID(notify) ISC_MAGIC_VALID(notify, NOTIFY_MAGIC)
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff#define STUB_MAGIC ISC_MAGIC('S', 't', 'u', 'b')
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff#define DNS_STUB_VALID(stub) ISC_MAGIC_VALID(stub, STUB_MAGIC)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define ZONEMGR_MAGIC ISC_MAGIC('Z', 'm', 'g', 'r')
4108eed5092156cf0407a97a9bd8ab7775164694Brian Wellington#define DNS_ZONEMGR_VALID(stub) ISC_MAGIC_VALID(stub, ZONEMGR_MAGIC)
3f123dcc2fe5d2cd08ca91b732741d86a4036906Brian Wellington#define DNS_LOAD_VALID(load) ISC_MAGIC_VALID(load, LOAD_MAGIC)
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define FORWARD_MAGIC ISC_MAGIC('F', 'o', 'r', 'w')
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington#define DNS_FORWARD_VALID(load) ISC_MAGIC_VALID(load, FORWARD_MAGIC)
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence#define DNS_IO_VALID(load) ISC_MAGIC_VALID(load, IO_MAGIC)
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence * Ensure 'a' is at least 'min' but not more than 'max'.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein (((a) < (min)) ? (min) : ((a) < (max) ? (a) : (max)))
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence * Default values.
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence#define MAX_XFER_TIME (2*3600) /* Documented default is 2 hours */
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews do { (z)->locked = ISC_FALSE; UNLOCK(&(z)->lock); } while (0)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt /* Unlocked */
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews unsigned int magic;
f02c22d58ac88777655e0b407b22b07864d39184Evan Hunt /* Locked */
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater ISC_LINK(dns_zone_t) link; /* Used by zmgr. */
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews unsigned int irefs;
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews unsigned int flags;
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews unsigned int options;
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews unsigned int db_argc;
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn dns_tsigkey_t *tsigkey; /* key used for xfr */
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn /* Access Control Lists */
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington * Zones in certain states such as "waiting for zone transfer"
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews * or "zone transfer in progress" are kept on per-state linked lists
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews * in the zone manager using the 'statelink' field. The 'statelist'
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews * field points at the list the zone is currently on. It the zone
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews * is not on any such list, statelist is NULL.
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt * Optional per-zone statistics counters (NULL if not present).
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn#define DNS_ZONE_FLAG(z,f) (ISC_TF(((z)->flags & (f)) != 0))
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn#define DNS_ZONE_SETFLAG(z,f) do { \
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn (z)->flags |= (f); \
9a97696b543b9957049a663b4f73245589c47921Mark Andrews#define DNS_ZONE_CLRFLAG(z,f) do { \
9a97696b543b9957049a663b4f73245589c47921Mark Andrews (z)->flags &= ~(f); \
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews /* XXX MPA these may need to go back into zone.h */
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews#define DNS_ZONEFLG_REFRESH 0x00000001U /* refresh check in progress */
9a97696b543b9957049a663b4f73245589c47921Mark Andrews#define DNS_ZONEFLG_NEEDDUMP 0x00000002U /* zone need consolidation */
9a97696b543b9957049a663b4f73245589c47921Mark Andrews#define DNS_ZONEFLG_USEVC 0x00000004U /* use tcp for refresh query */
9a97696b543b9957049a663b4f73245589c47921Mark Andrews#define DNS_ZONEFLG_DUMPING 0x00000008U /* a dump is in progress */
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman#define DNS_ZONEFLG_HASINCLUDE 0x00000010U /* $INCLUDE in zone file */
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman#define DNS_ZONEFLG_LOADED 0x00000020U /* database has loaded */
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman#define DNS_ZONEFLG_EXITING 0x00000040U /* zone is being destroyed */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews#define DNS_ZONEFLG_EXPIRED 0x00000080U /* zone has expired */
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley#define DNS_ZONEFLG_NEEDREFRESH 0x00000100U /* refresh check needed */
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley#define DNS_ZONEFLG_UPTODATE 0x00000200U /* zone contents are
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User * uptodate */
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User#define DNS_ZONEFLG_NEEDNOTIFY 0x00000400U /* need to send out notify
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User * messages */
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#define DNS_ZONEFLG_DIFFONRELOAD 0x00000800U /* generate a journal diff on
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#define DNS_ZONEFLG_NOMASTERS 0x00001000U /* an attempt to refresh a
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews * zone with no masters
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews * occured */
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#define DNS_ZONEFLG_LOADING 0x00002000U /* load from disk in progress*/
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt#define DNS_ZONEFLG_HAVETIMERS 0x00004000U /* timer values have been set
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt * from SOA (if not set, we
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt * are still using
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt * default timer values) */
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt#define DNS_ZONEFLG_FORCEXFER 0x00008000U /* Force a zone xfer */
8bcd80824c51c802c2927236b012cd526f569b04Mark Andrews#define DNS_ZONEFLAG_NOIXFR 0x00100000U /* IXFR failed, force AXFR */
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont#define DNS_ZONE_OPTION(z,o) (((z)->options & (o)) != 0)
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews/* Flags for zone_load() */
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews#define DNS_ZONELOADFLAG_NOSTAT 0x00000001U /* Do not stat() master files */
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt unsigned int magic;
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews /* Locked by rwlock. */
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrews /* Configuration data. */
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews /* Locked by iolock */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews * Hold notify state.
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt unsigned int magic;
9a97696b543b9957049a663b4f73245589c47921Mark Andrews unsigned int flags;
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews * dns_stub holds state while performing a 'stub' transfer.
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews * 'db' is the zone's 'db' or a new one if this is the initial
6fa84a3e255ef9e6233f0a8d134fc6d273f04599Evan Hunt unsigned int magic;
186e7f37c9fc985a7a7264cc8170e48a25bed434Mark Andrews * Hold load state.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews unsigned int magic;
c174d5c13c03dd59283243e3fd5461d41140a798Evan Hunt * Hold forward state.
801707fe19600313a0b1f7845a518100f69e58b6Evan Hunt unsigned int magic;
9935447b51456f598b45246d0114b8006049244dMark Andrews * Hold IO request state.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews unsigned int magic;
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrewsstatic void zone_settimer(dns_zone_t *, isc_time_t *);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstatic void zone_debuglog(dns_zone_t *zone, const char *, int debuglevel,
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupont const char *msg, ...) ISC_FORMAT_PRINTF(4, 5);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstatic void notify_log(dns_zone_t *zone, int level, const char *fmt, ...)
98922b2b2b024dcca25be7c220cf3b16b1e6c4b5Evan Huntstatic void zone_iattach(dns_zone_t *source, dns_zone_t **target);
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrewsstatic isc_result_t zone_replacedb(dns_zone_t *zone, dns_db_t *db,
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrewsstatic inline void zone_attachdb(dns_zone_t *zone, dns_db_t *db);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntstatic inline void zone_detachdb(dns_zone_t *zone);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntstatic isc_result_t default_journal(dns_zone_t *zone);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntstatic void zone_xfrdone(dns_zone_t *zone, isc_result_t result);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstatic isc_result_t zone_postload(dns_zone_t *zone, dns_db_t *db,
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstatic void zone_needdump(dns_zone_t *zone, unsigned int delay);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstatic void zone_shutdown(isc_task_t *, isc_event_t *);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstatic void zone_loaddone(void *arg, isc_result_t result);
78608b0a454246d0e1e0169f1d671b8427e48199Francis Dupontstatic isc_result_t zone_startload(dns_db_t *db, dns_zone_t *zone,
8cbf3b6fc35091abde426930f2eadb8f53476c98Evan Hunt/* ondestroy example */
8cbf3b6fc35091abde426930f2eadb8f53476c98Evan Huntstatic void dns_zonemgr_dbdestroyed(isc_task_t *task, isc_event_t *event);
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Huntstatic void refresh_callback(isc_task_t *, isc_event_t *);
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Huntstatic void stub_callback(isc_task_t *, isc_event_t *);
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Huntstatic void soa_query(isc_task_t *, isc_event_t *);
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Huntstatic void ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset,
8b9c4592ed718c4187971f1104381faf538bf4f7Evan Huntstatic int message_count(dns_message_t *msg, dns_section_t section,
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrewsstatic void notify_find_address(dns_notify_t *notify);
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrewsstatic isc_result_t notify_createmessage(dns_zone_t *zone,
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrews unsigned int flags,
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Huntstatic void notify_done(isc_task_t *task, isc_event_t *event);
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Huntstatic void notify_send_toaddr(isc_task_t *task, isc_event_t *event);
1d32b1df372d6be6bac6450739b9e5ea23819995Evan Huntstatic isc_result_t zone_dump(dns_zone_t *, isc_boolean_t);
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsstatic void got_transfer_quota(isc_task_t *task, isc_event_t *event);
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsstatic isc_result_t zmgr_start_xfrin_ifquota(dns_zonemgr_t *zmgr,
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsstatic void zmgr_resume_xfrs(dns_zonemgr_t *zmgr, isc_boolean_t multi);
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsstatic isc_result_t zonemgr_getio(dns_zonemgr_t *zmgr, isc_boolean_t high,
03152360db6fcb0fcc95fa63c20c5c829c95f1f6Mark Andrewszone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount,
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Hunt unsigned int *cnames);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Huntstatic void forward_callback(isc_task_t *task, isc_event_t *event);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Huntstatic void zone_saveunique(dns_zone_t *zone, const char *path,
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews const char *templat);
38cd4d14cc341c2663e574035074788bb6f0fce2Evan Huntstatic void dump_done(void *arg, isc_result_t result);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews#define DNS_ZONE_JITTER_ADD(a, b, c) \
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (isc_time_add((a), &_i, (c)) != ISC_R_SUCCESS) { \
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews "epoch approaching: upgrade required: " \
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews "now + %s failed", #b); \
101a7960b7989a18d873f3302b3b2415aeafb108Mark Andrews#define DNS_ZONE_TIME_ADD(a, b, c) \
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrews if (isc_time_add((a), &_i, (c)) != ISC_R_SUCCESS) { \
5506903c9215faf42586307c2288942fd804c579Evan Hunt "epoch approaching: upgrade required: " \
5506903c9215faf42586307c2288942fd804c579Evan Hunt "now + %s failed", #b); \
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews *** Public functions.
62ec9fd1681ffae7d6b0d54618599ecf650e3100Mark Andrewsdns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews "isc_mutex_init() failed: %s",
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews /* XXX MPA check that all elements are initialised */
a239044323418956d7d48c14d61d19f721cc5ba5Witold Krecicki isc_refcount_init(&zone->erefs, 1); /* Implicit attach. */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews /* Must be after magic is set. */
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews result = dns_zone_setdbtype(zone, dbargc_default, dbargv_default);
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews ISC_EVENT_INIT(&zone->ctlevent, sizeof(zone->ctlevent), 0, NULL,
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews DNS_EVENT_ZONECONTROL, zone_shutdown, zone, zone,
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater * Free a zone. Because we require that there be no more
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater * outstanding events or references, no locking is necessary.
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater REQUIRE(isc_refcount_current(&zone->erefs) == 0);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews * Managed objects. Order is important.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews dns_request_destroy(&zone->request); /* XXXMPA */
8486ce1efa5deded85415d21d5696e5a51c63357Mark Andrews /* Unmanaged objects */
== ISC_R_SUCCESS);
== ISC_R_SUCCESS);
goto nomem;
for (i = 0; i < dbargc; i++)
for (i = 0; i < dbargc; i++) {
goto nomem;
goto unlock;
for (i = 0; i < dbargc; i++) {
return (result);
return (result);
static isc_result_t
char *copy;
return (ISC_R_NOMEMORY);
return (ISC_R_SUCCESS);
return (result);
static isc_result_t
char *journal;
return (ISC_R_NOMEMORY);
return (result);
return (result);
static isc_boolean_t
static isc_result_t
goto cleanup;
goto cleanup;
goto cleanup;
goto cleanup;
&filetime);
goto cleanup;
goto cleanup;
&db);
goto cleanup;
goto cleanup;
goto cleanup;
return (result);
unsigned int options;
goto fail;
goto fail;
fail:
goto fail;
goto fail;
fail:
static isc_result_t
unsigned int options;
return (ISC_R_NOMEMORY);
goto cleanup;
goto cleanup;
return (result);
return (result);
return (result);
static isc_result_t
unsigned int soacount = 0;
unsigned int nscount = 0;
unsigned int cnames = 0;
goto cleanup;
goto cleanup;
goto cleanup;
&cnames);
case dns_zone_master:
case dns_zone_slave:
case dns_zone_stub:
if (nscount == 0) {
goto cleanup;
goto cleanup;
isc_time_t t;
goto cleanup;
zone,
sizeof(isc_event_t));
goto cleanup;
if (needdump)
return (result);
return (result);
static isc_boolean_t
return (ISC_TRUE);
return (ISC_FALSE);
static isc_boolean_t
int level;
return (ISC_TRUE);
return (ISC_TRUE);
namebuf);
return (ISC_FALSE);
namebuf);
return (ISC_FALSE);
return (ISC_FALSE);
return (ISC_TRUE);
static isc_result_t
unsigned int *cnames)
unsigned int count = 0;
unsigned int ccount = 0;
goto success;
goto invalidate_rdataset;
ccount++;
count++;
return (result);
static isc_result_t
unsigned int *soacount,
unsigned int count;
*soacount = 0;
*serial = 0;
*refresh = 0;
*retry = 0;
*expire = 0;
*minimum = 0;
goto invalidate_rdataset;
goto invalidate_rdataset;
count = 0;
count++;
if (count > 0) {
return (result);
static isc_result_t
unsigned int *cnames)
goto closeversion;
minimum);
return (answer);
unsigned int refs;
if (refs == 0) {
if (free_now)
if (free_needed)
if (value)
if (value)
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
if (count != 0) {
return (ISC_R_NOMEMORY);
return (ISC_R_SUCCESS);
return (result);
sizeof(dns_name_t));
if (count == 0)
goto unlock;
goto unlock;
goto unlock;
for (i = 0; i < count; i++)
for (i = 0; i < count; i++) {
sizeof(dns_name_t));
goto allocfail;
newname[i]);
for (i = 0; i < count; i++)
newname[i],
goto unlock;
return (result);
return (result);
static inline isc_boolean_t
if (!dumping) {
return (dumping);
case dns_zone_slave:
case dns_zone_stub:
case dns_zone_slave:
case dns_zone_stub:
case dns_zone_master:
case dns_zone_slave:
if (!dumping) {
case dns_zone_master:
case dns_zone_slave:
goto unlock;
goto unlock;
if (!dumping)
return (result);
if (!dumping)
return (result);
switch (tresult) {
case ISC_R_SUCCESS:
case ISC_R_NOSPACE:
case ISC_R_NOTFOUND:
if (again)
static isc_result_t
redo:
goto fail;
goto fail;
if (compact) {
fail:
if (again)
goto redo;
return (result);
static isc_result_t
return (DNS_R_NOTLOADED);
return (result);
static isc_boolean_t
return (ISC_TRUE);
return (ISC_TRUE);
return (ISC_FALSE);
if (!locked)
if (!locked)
if (locked)
static isc_result_t
return (ISC_R_NOMEMORY);
return (ISC_R_SUCCESS);
unsigned int options;
goto destroy;
goto destroy;
static isc_result_t
isc_event_t *e;
if (e == NULL)
return (ISC_R_NOMEMORY);
isc_event_free(&e);
return (result);
int timeout;
goto cleanup;
goto cleanup;
addrbuf);
goto cleanup;
goto cleanup;
addrbuf);
case PF_INET:
case PF_INET6:
goto cleanup_key;
&new);
goto cleanup;
goto cleanup;
unsigned int flags = 0;
goto cleanup1;
goto cleanup2;
goto cleanup3;
goto cleanup3;
if (!loggednotify) {
serial);
goto cleanup3;
goto cleanup3;
if (!loggednotify) {
serial);
if (isqueued) {
static inline isc_result_t
goto fail;
goto fail;
goto fail;
&rdataset);
goto fail;
goto fail;
&rdataset);
goto fail;
goto fail;
goto fail;
return (ISC_R_SUCCESS);
fail:
return (result);
goto next_master;
goto same_master;
goto next_master;
goto next_master;
goto next_master;
goto same_master;
goto next_master;
goto next_master;
goto same_master;
goto next_master;
if (cnamecnt != 0) {
goto next_master;
if (nscnt == 0) {
goto next_master;
goto next_master;
goto free_stub;
if (!exiting &&
goto free_stub;
goto free_stub;
goto done;
done:
goto same_master;
goto tcp_transfer;
goto next_master;
goto next_master;
goto next_master;
goto same_master;
goto tcp_transfer;
goto next_master;
goto tcp_transfer;
goto next_master;
goto same_master;
goto next_master;
if (cnamecnt != 0) {
goto next_master;
goto next_master;
goto next_master;
goto next_master;
goto next_master;
goto next_master;
&now);
&now);
goto next_master;
goto next_master;
goto detach;
goto requeue;
goto detach;
goto detach;
isc_event_t *e;
if (e == NULL) {
isc_event_free(&e);
static inline isc_result_t
&message);
goto cleanup;
goto cleanup;
goto cleanup;
return (ISC_R_SUCCESS);
return (result);
static isc_result_t
goto cleanup;
goto cleanup;
goto cleanup;
== ISC_R_SUCCESS);
return (result);
int timeout;
goto cleanup;
goto cleanup;
case PF_INET:
goto skip_master;
} else if (!have_xfrsource)
case PF_INET6:
goto skip_master;
} else if (!have_xfrsource)
goto cleanup;
DNS_REQUESTOPT_TCP : 0;
goto cleanup;
if (cancel)
goto again;
goto cleanup;
int timeout;
goto cleanup;
goto cleanup;
&node);
goto cleanup;
goto cleanup;
case PF_INET:
else if (!have_xfrsource)
case PF_INET6:
else if (!have_xfrsource)
goto cleanup;
goto cleanup;
goto unlock;
if (linked) {
if (free_needed)
case dns_zone_master:
case dns_zone_slave:
case dns_zone_stub:
static isc_result_t
isc_region_t r;
&message);
return (result);
goto cleanup;
goto cleanup;
goto done;
goto soa_cleanup;
goto soa_cleanup;
goto soa_cleanup;
goto soa_cleanup;
goto soa_cleanup;
NULL);
goto soa_cleanup;
goto soa_cleanup;
goto soa_cleanup;
isc_buffer_usedregion(b, &r);
goto soa_cleanup;
goto soa_cleanup;
done:
return (ISC_R_SUCCESS);
return (result);
int match = 0;
return (DNS_R_FORMERR);
return (DNS_R_NOTIMP);
return (ISC_R_SUCCESS);
match > 0)
return (DNS_R_REFUSED);
&rdataset);
fromtext);
return (ISC_R_SUCCESS);
fromtext);
return (ISC_R_SUCCESS);
return (ISC_R_SUCCESS);
const char *fmt, ...)
int count = 0;
count++;
return (count);
if (idlein == 0)
return (result);
static isc_result_t
unsigned int soacount = 0;
unsigned int nscount = 0;
if (nscount == 0) {
return (result);
return (result);
goto fail;
if (dump)
switch (result) {
case ISC_R_SUCCESS:
case ISC_R_NOSPACE:
case ISC_R_NOTFOUND:
goto fail;
return (ISC_R_SUCCESS);
fail:
return (result);
unsigned int soacount;
unsigned int nscount;
switch (result) {
case ISC_R_SUCCESS:
case DNS_R_UPTODATE:
goto same_master;
nscount = 0;
soacount = 0;
if (nscount == 0) {
goto next_master;
sizeof(namebuf));
namebuf);
&now);
case DNS_R_BADIXFR:
goto same_master;
if (free_needed)
goto cleanup;
static isc_result_t
return (ISC_R_NOMORE);
case PF_INET:
case PF_INET6:
goto unlock;
return (result);
goto next_master;
goto next_master;
goto next_master;
case dns_rcode_noerror:
case dns_rcode_yxdomain:
case dns_rcode_yxrrset:
case dns_rcode_nxrrset:
case dns_rcode_refused:
case dns_rcode_nxdomain:
case dns_rcode_notzone:
case dns_rcode_notauth: {
goto next_master;
case dns_rcode_formerr:
case dns_rcode_servfail:
case dns_rcode_notimp:
case dns_rcode_badvers:
goto next_master;
return (ISC_R_NOMEMORY);
goto cleanup;
goto cleanup;
goto cleanup;
return (result);
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
return (ISC_R_NOMORE);
return (ISC_R_SUCCESS);
return (ISC_R_NOMEMORY);
goto free_mem;
goto free_rwlock;
goto free_taskpool;
goto free_task;
goto free_rl;
return (ISC_R_SUCCESS);
return (result);
goto cleanup_task;
goto unlock;
return (result);
if (free_now)
if (free_now)
dns_zone_t *p;
p != NULL;
return (ISC_R_SUCCESS);
if (multi)
static isc_result_t
dns_zone_t *x;
isc_event_t *e;
x != NULL;
nxfrsin++;
nxfrsperns++;
return (ISC_R_QUOTA);
return (ISC_R_QUOTA);
sizeof(isc_event_t));
if (e == NULL)
return (ISC_R_NOMEMORY);
return (ISC_R_SUCCESS);
static isc_result_t
return (ISC_R_NOMEMORY);
return (ISC_R_NOMEMORY);
if (queue) {
if (!queue) {
return (ISC_R_SUCCESS);
if (send_event) {
char *buf;
int buflen;
goto cleanup;
goto cleanup;
if (value == 0)
ns = 0;
if (on) {
goto done;
goto done;
done:
return (result);
switch (dialup) {
case dns_dialuptype_no:
case dns_dialuptype_yes:
case dns_dialuptype_notify:
case dns_dialuptype_refresh:
case dns_dialuptype_passive:
INSIST(0);
return (result);
unsigned int count = 0;
switch (state) {
count++;
count++;
case DNS_ZONESTATE_SOAQUERY:
count++;
case DNS_ZONESTATE_ANY:
count++;
INSIST(0);
return (count);
return (ISC_R_SUCCESS);
if (!ok) {
if (fail)
return (DNS_R_BADOWNERNAME);
if (!ok) {
if (fail)
return (DNS_R_BADNAME);
return (ISC_R_SUCCESS);