2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 22:15:20 +00:00
Files
bind/lib/dns/include/dns/zone.h
Ondřej Surý 1032681af0 Convert the isc/tid.h to use own signed integer isc_tid_t type
Change the internal type used for isc_tid unit to isc_tid_t to hide the
specific integer type being used for the 'tid'.  Internally, the signed
integer type is being used.  This allows us to have negatively indexed
arrays that works both for threads with assigned tid and the threads
with unassigned tid.  This should be used only in specific situations.
2025-06-28 13:32:12 +02:00

2769 lines
67 KiB
C

/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#pragma once
/*! \file dns/zone.h */
/***
*** Imports
***/
#include <inttypes.h>
#include <stdbool.h>
#include <stdio.h>
#include <isc/formatcheck.h>
#include <isc/rwlock.h>
#include <isc/tls.h>
#include <dns/catz.h>
#include <dns/diff.h>
#include <dns/master.h>
#include <dns/masterdump.h>
#include <dns/rdatastruct.h>
#include <dns/rpz.h>
#include <dns/skr.h>
#include <dns/types.h>
#include <dns/xfrin.h>
#include <dns/zt.h>
/* Add -DDNS_ZONE_TRACE=1 to CFLAGS for detailed reference tracing */
typedef enum {
dns_zone_none,
dns_zone_primary,
dns_zone_secondary,
dns_zone_mirror,
dns_zone_stub,
dns_zone_staticstub,
dns_zone_key,
dns_zone_dlz,
dns_zone_redirect
} dns_zonetype_t;
#ifndef dns_zone_master
#define dns_zone_master dns_zone_primary
#endif /* dns_zone_master */
#ifndef dns_zone_slave
#define dns_zone_slave dns_zone_secondary
#endif /* dns_zone_slave */
typedef enum {
dns_zonestat_none = 0,
dns_zonestat_terse,
dns_zonestat_full
} dns_zonestat_level_t;
typedef enum {
DNS_ZONEOPT_MANYERRORS = 1 << 0, /*%< return many errors on load */
DNS_ZONEOPT_IXFRFROMDIFFS = 1 << 1, /*%< calculate differences */
DNS_ZONEOPT_NOMERGE = 1 << 2, /*%< don't merge journal */
DNS_ZONEOPT_CHECKNS = 1 << 3, /*%< check if NS's are addresses */
DNS_ZONEOPT_FATALNS = 1 << 4, /*%< DNS_ZONEOPT_CHECKNS is fatal */
DNS_ZONEOPT_MULTIMASTER = 1 << 5, /*%< this zone has multiple
primaries */
DNS_ZONEOPT_USEALTXFRSRC = 1 << 6, /*%< use alternate transfer sources.
Obsoleted. */
DNS_ZONEOPT_CHECKNAMES = 1 << 7, /*%< check-names */
DNS_ZONEOPT_CHECKNAMESFAIL = 1 << 8, /*%< fatal check-name failures */
DNS_ZONEOPT_CHECKWILDCARD = 1 << 9, /*%< check for internal wildcards */
DNS_ZONEOPT_CHECKMX = 1 << 10, /*%< check-mx */
DNS_ZONEOPT_CHECKMXFAIL = 1 << 11, /*%< fatal check-mx failures */
DNS_ZONEOPT_CHECKINTEGRITY = 1 << 12, /*%< perform integrity checks */
DNS_ZONEOPT_CHECKSIBLING = 1 << 13, /*%< perform sibling glue checks */
DNS_ZONEOPT_NOCHECKNS = 1 << 14, /*%< disable IN NS address checks */
DNS_ZONEOPT_WARNMXCNAME = 1 << 15, /*%< warn on MX CNAME check */
DNS_ZONEOPT_IGNOREMXCNAME = 1 << 16, /*%< ignore MX CNAME check */
DNS_ZONEOPT_WARNSRVCNAME = 1 << 17, /*%< warn on SRV CNAME check */
DNS_ZONEOPT_IGNORESRVCNAME = 1 << 18, /*%< ignore SRV CNAME check */
DNS_ZONEOPT_UPDATECHECKKSK = 1 << 19, /*%< check dnskey KSK flag */
DNS_ZONEOPT_TRYTCPREFRESH = 1 << 20, /*%< try tcp refresh on udp failure
*/
DNS_ZONEOPT_NOTIFYTOSOA = 1 << 21, /*%< Notify the SOA MNAME */
DNS_ZONEOPT_NSEC3TESTZONE = 1 << 22, /*%< nsec3-test-zone */
DNS_ZONEOPT_LOGREPORTS = 1 << 23, /* Log error-reporting queries */
DNS_ZONEOPT_DNSKEYKSKONLY = 1 << 24, /*%< dnssec-dnskey-kskonly */
DNS_ZONEOPT_CHECKDUPRR = 1 << 25, /*%< check-dup-records */
DNS_ZONEOPT_CHECKDUPRRFAIL = 1 << 26, /*%< fatal check-dup-records
* failures */
DNS_ZONEOPT_CHECKSPF = 1 << 27, /*%< check SPF records */
DNS_ZONEOPT_CHECKTTL = 1 << 28, /*%< check max-zone-ttl */
DNS_ZONEOPT_AUTOEMPTY = 1 << 29, /*%< automatic empty zone */
DNS_ZONEOPT_CHECKSVCB = 1 << 30, /*%< check SVBC records */
DNS_ZONEOPT_ZONEVERSION = 1U << 31, /*%< enable zoneversion */
DNS_ZONEOPT_FULLSIGN = 1ULL << 32, /*%< fully sign zone */
DNS_ZONEOPT___MAX = UINT64_MAX, /* trick to make the ENUM 64-bit wide */
} dns_zoneopt_t;
/*
* Zone states
*/
typedef enum {
DNS_ZONESTATE_XFERRUNNING = 1,
DNS_ZONESTATE_XFERDEFERRED,
DNS_ZONESTATE_XFERFIRSTREFRESH,
DNS_ZONESTATE_SOAQUERY,
DNS_ZONESTATE_ANY,
DNS_ZONESTATE_AUTOMATIC,
} dns_zonestate_t;
#ifndef DNS_ZONE_MINREFRESH
#define DNS_ZONE_MINREFRESH 300 /*%< 5 minutes */
#endif /* ifndef DNS_ZONE_MINREFRESH */
#ifndef DNS_ZONE_MAXREFRESH
#define DNS_ZONE_MAXREFRESH 2419200 /*%< 4 weeks */
#endif /* ifndef DNS_ZONE_MAXREFRESH */
#ifndef DNS_ZONE_DEFAULTREFRESH
#define DNS_ZONE_DEFAULTREFRESH 3600 /*%< 1 hour */
#endif /* ifndef DNS_ZONE_DEFAULTREFRESH */
#ifndef DNS_ZONE_MINRETRY
#define DNS_ZONE_MINRETRY 300 /*%< 5 minutes */
#endif /* ifndef DNS_ZONE_MINRETRY */
#ifndef DNS_ZONE_MAXRETRY
#define DNS_ZONE_MAXRETRY 1209600 /*%< 2 weeks */
#endif /* ifndef DNS_ZONE_MAXRETRY */
#ifndef DNS_ZONE_DEFAULTRETRY
#define DNS_ZONE_DEFAULTRETRY \
60 /*%< 1 minute, subject to \
* exponential backoff */
#endif /* ifndef DNS_ZONE_DEFAULTRETRY */
/***
*** Functions
***/
void
dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx, isc_tid_t tid);
/*%<
* Creates a new empty zone and attach '*zonep' to it.
*
* Requires:
*\li 'zonep' to point to a NULL pointer.
*\li 'mctx' to be a valid memory context.
*
* Ensures:
*\li '*zonep' refers to a valid zone.
*/
isc_result_t
dns_zone_makedb(dns_zone_t *zone, dns_db_t **dbp);
/*%<
* Creates a new empty database for the 'zone'.
*
* Requires:
*\li 'zone' to be a valid zone.
*\li 'dbp' to point to NULL pointer.
*
* Returns:
*\li dns_db_create() error codes.
*/
void
dns_zone_setclass(dns_zone_t *zone, dns_rdataclass_t rdclass);
/*%<
* Sets the class of a zone. This operation can only be performed
* once on a zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li dns_zone_setclass() not to have been called since the zone was
* created.
*\li 'rdclass' != dns_rdataclass_none.
*/
dns_rdataclass_t
dns_zone_getclass(dns_zone_t *zone);
/*%<
* Returns the current zone class.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_getserial(dns_zone_t *zone, uint32_t *serialp);
/*%<
* Returns the current serial number of the zone. On success, the SOA
* serial of the zone will be copied into '*serialp'.
*
* Requires:
*\li 'zone' to be a valid zone.
*\li 'serialp' to be non NULL
*
* Returns:
*\li #ISC_R_SUCCESS
*\li #DNS_R_NOTLOADED zone DB is not loaded
*/
void
dns_zone_settype(dns_zone_t *zone, dns_zonetype_t type);
/*%<
* Sets the zone type. This operation can only be performed once on
* a zone.
*
* Requires:
*\li 'zone' to be a valid zone.
*\li dns_zone_settype() not to have been called since the zone was
* created.
*\li 'type' != dns_zone_none
*/
void
dns_zone_setview(dns_zone_t *zone, dns_view_t *view);
/*%<
* Associate the zone with a view.
*
* Require:
*\li 'zone' to be a valid zone.
*/
dns_view_t *
dns_zone_getview(dns_zone_t *zone);
/*%<
* Returns the zone's associated view.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setviewcommit(dns_zone_t *zone);
/*%<
* Commit the previous view saved internally via dns_zone_setview().
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setviewrevert(dns_zone_t *zone);
/*%<
* Revert the most recent dns_zone_setview() on this zone,
* restoring the previous view.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setorigin(dns_zone_t *zone, const dns_name_t *origin);
/*%<
* Sets the zones origin to 'origin'.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'origin' to be non NULL.
*
* Returns:
*\li #ISC_R_SUCCESS
*/
dns_name_t *
dns_zone_getorigin(dns_zone_t *zone);
/*%<
* Returns the value of the origin.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setfile(dns_zone_t *zone, const char *file, const char *initial_file,
dns_masterformat_t format, const dns_master_style_t *style);
/*%<
* Sets the name of the master file in the format of 'format' from which
* the zone loads its database to 'file'.
*
* For zones that have no associated master file, 'file' will be NULL.
* For some zone types, e.g. secondary zones, 'file' is optional, but
* for primary zones it is mandatory. If the master file does not exist
* during loading, then it will be copied into place from 'initial_file'.
*
* For zones with persistent databases, the file name setting is ignored.
*
* Require:
*\li 'zone' to be a valid zone.
*/
const char *
dns_zone_getfile(dns_zone_t *zone);
/*%<
* Gets the name of the zone's master file, if any.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
*\li Pointer to null-terminated file name, or NULL.
*/
void
dns_zone_setstream(dns_zone_t *zone, const FILE *stream,
dns_masterformat_t format, const dns_master_style_t *style);
/*%<
* Sets the source stream from which the zone will load its database.
*
* Requires:
*\li 'zone' to be a valid zone.
*\li 'stream' to be a valid and open FILE *.
*\li 'zone->masterfile' to be NULL, since we should load data either from
* 'stream' or from a master file, but not both.
*/
void
dns_zone_setmaxrecords(dns_zone_t *zone, uint32_t records);
/*%<
* Sets the maximum number of records permitted in a zone.
* 0 implies unlimited.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
*\li void
*/
uint32_t
dns_zone_getmaxrecords(dns_zone_t *zone);
/*%<
* Gets the maximum number of records permitted in a zone.
* 0 implies unlimited.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
*\li uint32_t maxrecords.
*/
void
dns_zone_setmaxrrperset(dns_zone_t *zone, uint32_t maxrrperset);
/*%<
* Sets the maximum number of records per rrset permitted in a zone.
* 0 implies unlimited.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
*\li void
*/
void
dns_zone_setmaxtypepername(dns_zone_t *zone, uint32_t maxtypepername);
/*%<
* Sets the maximum number of resource record types per owner name
* permitted in a zone. 0 implies unlimited.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
*\li void
*/
void
dns_zone_setmaxttl(dns_zone_t *zone, uint32_t maxttl);
/*%<
* Sets the max ttl of the zone.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
*\li void
*/
dns_ttl_t
dns_zone_getmaxttl(dns_zone_t *zone);
/*%<
* Gets the max ttl of the zone.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
*\li dns_ttl_t maxttl.
*/
void
dns_zone_lock_keyfiles(dns_zone_t *zone);
/*%<
* Lock associated keyfiles for this zone.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_unlock_keyfiles(dns_zone_t *zone);
/*%<
* Unlock associated keyfiles for this zone.
*
* Require:
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_dnskey_inuse(dns_zone_t *zone, dns_rdata_t *rdata, bool *inuse);
/*%<
* Check if the DNSKEY record 'rdata' is used by 'zone' for zone signing.
* Store the result in 'inuse'.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'rdata' to represent a DNSKEY, CDNSKEY, or CDS record.
*
* Returns:
*\li #ISC_R_SUCCESS
*\li Any error result from dns_dnssec_keyfromrdata, dns_rdata_tostruct,
* dns_dnssec_make_dnskey, dns_ds_buildrdata, or
* dns_dnssec_findmatchingkeys.
*
*/
isc_result_t
dns_zone_load(dns_zone_t *zone, bool newonly);
isc_result_t
dns_zone_loadandthaw(dns_zone_t *zone);
/*%<
* Cause the database to be loaded from its backing store.
* Confirm that the minimum requirements for the zone type are
* met, otherwise DNS_R_BADZONE is returned.
*
* If newonly is set dns_zone_load() only loads new zones.
* dns_zone_loadandthaw() is similar to dns_zone_load() but will
* also re-enable DNS UPDATEs when the load completes.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li #ISC_R_UNEXPECTED
*\li #ISC_R_SUCCESS
*\li DNS_R_CONTINUE Incremental load has been queued.
*\li DNS_R_UPTODATE The zone has already been loaded based on
* file system timestamps.
*\li DNS_R_BADZONE
*\li Any result value from dns_db_load().
*/
isc_result_t
dns_zone_asyncload(dns_zone_t *zone, bool newonly, dns_zt_callback_t done,
void *arg);
/*%<
* Cause the database to be loaded from its backing store asynchronously.
* Other zone maintenance functions are suspended until this is complete.
* When finished, 'done' is called to inform the caller, with 'arg' as
* its argument. (Normally, 'arg' is expected to point to the zone table
* but is left undefined for testing purposes.)
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li #ISC_R_ALREADYRUNNING
*\li #ISC_R_SUCCESS
*\li #ISC_R_FAILURE
*/
bool
dns__zone_loadpending(dns_zone_t *zone);
/*%<
* Indicates whether the zone is waiting to be loaded asynchronously.
* (Not currently intended for use outside of this module and associated
* tests.)
*/
void
dns_zone_iattach(dns_zone_t *source, dns_zone_t **target);
/*%<
* Attach '*target' to 'source' incrementing its internal
* reference count. This is intended for use by operations
* such as zone transfers that need to prevent the zone
* object from being freed but not from shutting down.
*
* Require:
*\li The caller is running in the context of the zone's loop.
*\li 'zone' to be a valid zone.
*\li 'target' to be non NULL and '*target' to be NULL.
*/
void
dns_zone_idetach(dns_zone_t **zonep);
/*%<
* Detach from a zone decrementing its internal reference count.
* If there are no more internal or external references to the
* zone, it will be freed.
*
* Require:
*\li The caller is running in the context of the zone's loop.
*\li 'zonep' to point to a valid zone.
*/
isc_result_t
dns_zone_getdb(dns_zone_t *zone, dns_db_t **dbp);
/*%<
* Attach '*dbp' to the database to if it exists otherwise
* return DNS_R_NOTLOADED.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'dbp' to be != NULL && '*dbp' == NULL.
*
* Returns:
*\li #ISC_R_SUCCESS
*\li DNS_R_NOTLOADED
*/
void
dns_zone_setdb(dns_zone_t *zone, dns_db_t *db);
/*%<
* Sets the zone database to 'db'.
*
* This function is expected to be used to configure a zone with a
* database which is not loaded from a file or zone transfer.
* It can be used for a general purpose zone, but right now its use
* is limited to static-stub zones to avoid possible undiscovered
* problems in the general cases.
*
* Require:
*\li 'zone' to be a valid zone of static-stub.
*\li zone doesn't have a database.
*/
void
dns_zone_setdbtype(dns_zone_t *zone, unsigned int dbargc,
const char *const *dbargv);
/*%<
* Sets the database type to dbargv[0] and database arguments
* to subsequent dbargv elements.
* 'db_type' is not checked to see if it is a valid database type.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'database' to be non NULL.
*\li 'dbargc' to be >= 1
*\li 'dbargv' to point to dbargc NULL-terminated strings
*/
void
dns_zone_getdbtype(dns_zone_t *zone, char ***argv, isc_mem_t *mctx);
/*%<
* Returns the current dbtype. isc_mem_free() should be used
* to free 'argv' after use.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'argv' to be non NULL and *argv to be NULL.
*\li 'mctx' to be valid.
*/
void
dns_zone_markdirty(dns_zone_t *zone);
/*%<
* Mark a zone as 'dirty'.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_expire(dns_zone_t *zone);
/*%<
* Mark the zone as expired. If the zone requires dumping cause it to
* be initiated. Set the refresh and retry intervals to there default
* values and unload the zone.
*
* Require
*\li 'zone' to be a valid zone.
*/
void
dns_zone_refresh(dns_zone_t *zone);
/*%<
* Initiate zone up to date checks. The zone must already be being
* managed.
*
* Require
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_flush(dns_zone_t *zone);
/*%<
* Write the zone to database if there are uncommitted changes.
*
* Require:
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_dump(dns_zone_t *zone);
/*%<
* Write the zone to database.
*
* Require:
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_dumptostream(dns_zone_t *zone, FILE *fd, dns_masterformat_t format,
const dns_master_style_t *style,
const uint32_t rawversion);
/*%<
* Write the zone to stream 'fd' in the specified 'format'.
* If the 'format' is dns_masterformat_text (RFC1035), 'style' also
* specifies the file style (e.g., &dns_master_style_default).
*
* dns_zone_dumptostream() is a backward-compatible form of
* dns_zone_dumptostream2(), which always uses the dns_masterformat_text
* format and the dns_master_style_default style.
*
* dns_zone_dumptostream2() is a backward-compatible form of
* dns_zone_dumptostream3(), which always uses the current
* default raw file format version.
*
* Note that dns_zone_dumptostream3() is the most flexible form. It
* can also provide the functionality of dns_zone_fulldumptostream().
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'fd' to be a stream open for writing.
*/
void
dns_zone_setprimaries(dns_zone_t *zone, isc_sockaddr_t *addresses,
isc_sockaddr_t *sources, dns_name_t **keynames,
dns_name_t **tlsnames, uint32_t count);
/*%<
* Set the list of primary servers for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'addresses' array of isc_sockaddr_t with port set or NULL.
*\li 'count' the number of primaries.
*\li 'keynames' array of dns_name_t's for tsig keys or NULL.
*
*\li If 'addresses' is NULL then 'count' must be zero.
*/
void
dns_zone_setparentals(dns_zone_t *zone, isc_sockaddr_t *addresses,
isc_sockaddr_t *sources, dns_name_t **keynames,
dns_name_t **tlsnames, uint32_t count);
/*%<
* Set the list of parental agents for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'addresses' array of isc_sockaddr_t with port set or NULL.
*\li 'count' the number of primaries.
*\li 'keynames' array of dns_name_t's for tsig keys or NULL.
*
*\li If 'addresses' is NULL then 'count' must be zero.
*/
void
dns_zone_setalsonotify(dns_zone_t *zone, isc_sockaddr_t *addresses,
isc_sockaddr_t *sources, dns_name_t **keynames,
dns_name_t **tlsnames, uint32_t count);
/*%<
* Set the list of additional servers to be notified when
* a zone changes. To clear the list use 'count = 0'.
*
* dns_zone_alsonotifywithkeys() allows each notify address to
* be associated with a TSIG key.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'addresses' to be non-NULL if count != 0.
*\li 'count' to be the number of notifiees.
*/
void
dns_zone_unload(dns_zone_t *zone);
/*%<
* detach the database from the zone structure.
*
* Require:
*\li 'zone' to be a valid zone.
*/
dns_kasp_t *
dns_zone_getkasp(dns_zone_t *zone);
/*%<
* Returns the current kasp.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setkasp(dns_zone_t *zone, dns_kasp_t *kasp);
void
dns_zone_setdefaultkasp(dns_zone_t *zone, dns_kasp_t *kasp);
/*%<
* Set kasp for zone. If a kasp is already set, it will be detached.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
dns_skrbundle_t *
dns_zone_getskrbundle(dns_zone_t *zone);
/*%<
* Returns the current SKR bundle.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setoption(dns_zone_t *zone, dns_zoneopt_t option, bool value);
/*%<
* Set the given options on ('value' == true) or off
* ('value' == #false).
*
* Require:
*\li 'zone' to be a valid zone.
*/
dns_zoneopt_t
dns_zone_getoptions(dns_zone_t *zone);
/*%<
* Returns the current zone options.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setminrefreshtime(dns_zone_t *zone, uint32_t val);
/*%<
* Set the minimum refresh time.
*
* Requires:
*\li 'zone' is valid.
*\li val > 0.
*/
void
dns_zone_setmaxrefreshtime(dns_zone_t *zone, uint32_t val);
/*%<
* Set the maximum refresh time.
*
* Requires:
*\li 'zone' is valid.
*\li val > 0.
*/
void
dns_zone_setminretrytime(dns_zone_t *zone, uint32_t val);
/*%<
* Set the minimum retry time.
*
* Requires:
*\li 'zone' is valid.
*\li val > 0.
*/
void
dns_zone_setmaxretrytime(dns_zone_t *zone, uint32_t val);
/*%<
* Set the maximum retry time.
*
* Requires:
*\li 'zone' is valid.
* val > 0.
*/
void
dns_zone_setxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource);
/*%<
* Set the source address to be used in IPv4 zone transfers.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'xfrsource' to contain the address.
*/
void
dns_zone_getxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource);
/*%<
* Returns the source address set by a previous dns_zone_setxfrsource4
* call, or the default of inaddr_any, port 0.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'xfrsource' to not be NULL
*/
void
dns_zone_setxfrsource6(dns_zone_t *zone, const isc_sockaddr_t *xfrsource);
/*%<
* Set the source address to be used in IPv6 zone transfers.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'xfrsource' to contain the address.
*/
void
dns_zone_getxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource);
/*%<
* Returns the source address set by a previous dns_zone_setxfrsource6
* call, or the default of in6addr_any, port 0.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'xfrsource' to not be NULL
*/
void
dns_zone_setparentalsrc4(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc);
/*%<
* Set the source address to be used with IPv4 parental DS queries.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'parentalsrc' to contain the address.
*/
void
dns_zone_getparentalsrc4(dns_zone_t *zone, isc_sockaddr_t *parentalsrc);
/*%<
* Returns the source address set by a previous dns_zone_setparentalsrc4
* call, or the default of inaddr_any, port 0.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'parentalsrc' to be non NULL.
*/
void
dns_zone_setparentalsrc6(dns_zone_t *zone, const isc_sockaddr_t *parentalsrc);
/*%<
* Set the source address to be used with IPv6 parental DS queries.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'parentalsrc' to contain the address.
*/
void
dns_zone_getparentalsrc6(dns_zone_t *zone, isc_sockaddr_t *parentalsrc);
/*%<
* Returns the source address set by a previous dns_zone_setparentalsrc6
* call, or the default of in6addr_any, port 0.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'parentalsrc' to be non NULL.
*/
void
dns_zone_setnotifysrc4(dns_zone_t *zone, const isc_sockaddr_t *notifysrc);
/*%<
* Set the source address to be used with IPv4 NOTIFY messages.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'notifysrc' to contain the address.
*/
void
dns_zone_getnotifysrc4(dns_zone_t *zone, isc_sockaddr_t *notifysrc);
/*%<
* Returns the source address set by a previous dns_zone_setnotifysrc4
* call, or the default of inaddr_any, port 0.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'notifysrc' to be non NULL.
*/
void
dns_zone_setnotifysrc6(dns_zone_t *zone, const isc_sockaddr_t *notifysrc);
/*%<
* Set the source address to be used with IPv6 NOTIFY messages.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'notifysrc' to contain the address.
*/
void
dns_zone_getnotifysrc6(dns_zone_t *zone, isc_sockaddr_t *notifysrc);
/*%<
* Returns the source address set by a previous dns_zone_setnotifysrc6
* call, or the default of in6addr_any, port 0.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'notifysrc' to be non NULL.
*/
void
dns_zone_setnotifyacl(dns_zone_t *zone, dns_acl_t *acl);
/*%<
* Sets the notify acl list for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'acl' to be a valid acl.
*/
void
dns_zone_setqueryacl(dns_zone_t *zone, dns_acl_t *acl);
/*%<
* Sets the query acl list for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'acl' to be a valid acl.
*/
void
dns_zone_setqueryonacl(dns_zone_t *zone, dns_acl_t *acl);
/*%<
* Sets the query-on acl list for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'acl' to be a valid acl.
*/
void
dns_zone_setupdateacl(dns_zone_t *zone, dns_acl_t *acl);
/*%<
* Sets the update acl list for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'acl' to be valid acl.
*/
void
dns_zone_setforwardacl(dns_zone_t *zone, dns_acl_t *acl);
/*%<
* Sets the forward unsigned updates acl list for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'acl' to be valid acl.
*/
void
dns_zone_setxfracl(dns_zone_t *zone, dns_acl_t *acl);
/*%<
* Sets the transfer acl list for the zone.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'acl' to be valid acl.
*/
dns_acl_t *
dns_zone_getnotifyacl(dns_zone_t *zone);
/*%<
* Returns the current notify acl or NULL.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li acl a pointer to the acl.
*\li NULL
*/
dns_acl_t *
dns_zone_getqueryacl(dns_zone_t *zone);
/*%<
* Returns the current query acl or NULL.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li acl a pointer to the acl.
*\li NULL
*/
dns_acl_t *
dns_zone_getqueryonacl(dns_zone_t *zone);
/*%<
* Returns the current query-on acl or NULL.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li acl a pointer to the acl.
*\li NULL
*/
dns_acl_t *
dns_zone_getupdateacl(dns_zone_t *zone);
/*%<
* Returns the current update acl or NULL.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li acl a pointer to the acl.
*\li NULL
*/
dns_acl_t *
dns_zone_getforwardacl(dns_zone_t *zone);
/*%<
* Returns the current forward unsigned updates acl or NULL.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li acl a pointer to the acl.
*\li NULL
*/
dns_acl_t *
dns_zone_getxfracl(dns_zone_t *zone);
/*%<
* Returns the current transfer acl or NULL.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
*\li acl a pointer to the acl.
*\li NULL
*/
void
dns_zone_clearupdateacl(dns_zone_t *zone);
/*%<
* Clear the current update acl.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_clearforwardacl(dns_zone_t *zone);
/*%<
* Clear the current forward unsigned updates acl.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_clearnotifyacl(dns_zone_t *zone);
/*%<
* Clear the current notify acl.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_clearqueryacl(dns_zone_t *zone);
/*%<
* Clear the current query acl.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_clearqueryonacl(dns_zone_t *zone);
/*%<
* Clear the current query-on acl.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_clearxfracl(dns_zone_t *zone);
/*%<
* Clear the current transfer acl.
*
* Require:
*\li 'zone' to be a valid zone.
*/
bool
dns_zone_getupdatedisabled(dns_zone_t *zone);
/*%<
* Return true if updates are disabled.
*/
void
dns_zone_setupdatedisabled(dns_zone_t *zone, bool state);
/*%<
* Enable or disable updates.
*
* This should only be called when running in exclusive mode;
* otherwise, updates that were already in progress could be
* committed after disabling.
*/
bool
dns_zone_getzeronosoattl(dns_zone_t *zone);
/*%<
* Return zero-no-soa-ttl status.
*/
void
dns_zone_setzeronosoattl(dns_zone_t *zone, bool state);
/*%<
* Set zero-no-soa-ttl status.
*/
void
dns_zone_setchecknames(dns_zone_t *zone, dns_severity_t severity);
/*%<
* Set the severity of name checking when loading a zone.
*
* Require:
* \li 'zone' to be a valid zone.
*/
dns_severity_t
dns_zone_getchecknames(dns_zone_t *zone);
/*%<
* Return the current severity of name checking.
*
* Require:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_setjournalsize(dns_zone_t *zone, int32_t size);
/*%<
* Sets the journal size for the zone.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
int32_t
dns_zone_getjournalsize(dns_zone_t *zone);
/*%<
* Return the journal size as set with a previous call to
* dns_zone_setjournalsize().
*
* Requires:
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
isc_sockaddr_t *to, dns_message_t *msg);
/*%<
* Tell the zone that it has received a NOTIFY message from another
* server. This may cause some zone maintenance activity to occur.
*
* Requires:
*\li 'zone' to be a valid zone.
*\li '*from' to contain the address of the server from which 'msg'
* was received.
*\li 'msg' a message with opcode NOTIFY and qr clear.
*
* Returns:
*\li DNS_R_REFUSED
*\li DNS_R_NOTIMP
*\li DNS_R_FORMERR
*\li DNS_R_SUCCESS
*/
void
dns_zone_setminxfrratein(dns_zone_t *zone, uint32_t bytes, uint32_t seconds);
/*%<
* Set the minumum traffic rate (in bytes per seconds) that a zone transfer in
* (AXFR/IXFR) of this zone will use before being aborted.
*
* Requires:
* \li 'zone' to be valid initialised zone.
*/
uint32_t
dns_zone_getminxfrratebytesin(dns_zone_t *zone);
/*%<
* Returns the 'bytes' portion of the minimum traffic rate for the transfer in
* for this zone.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*/
uint32_t
dns_zone_getminxfrratesecondsin(dns_zone_t *zone);
/*%<
* Returns the 'seconds' portion of the minimum traffic rate for the transfer in
* for this zone.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*/
void
dns_zone_setmaxxfrin(dns_zone_t *zone, uint32_t maxxfrin);
/*%<
* Set the maximum time (in seconds) that a zone transfer in (AXFR/IXFR)
* of this zone will use before being aborted.
*
* Requires:
* \li 'zone' to be valid initialised zone.
*/
uint32_t
dns_zone_getmaxxfrin(dns_zone_t *zone);
/*%<
* Returns the maximum transfer time for this zone. This will be
* either the value set by the last call to dns_zone_setmaxxfrin() or
* the default value of 1 hour.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*/
void
dns_zone_setmaxxfrout(dns_zone_t *zone, uint32_t maxxfrout);
/*%<
* Set the maximum time (in seconds) that a zone transfer out (AXFR/IXFR)
* of this zone will use before being aborted.
*
* Requires:
* \li 'zone' to be valid initialised zone.
*/
uint32_t
dns_zone_getmaxxfrout(dns_zone_t *zone);
/*%<
* Returns the maximum transfer time for this zone. This will be
* either the value set by the last call to dns_zone_setmaxxfrout() or
* the default value of 1 hour.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*/
void
dns_zone_setjournal(dns_zone_t *zone, const char *myjournal);
/*%<
* Sets the filename used for journaling updates / IXFR transfers.
* The default journal name is set by dns_zone_setfile() to be
* "file.jnl". If 'myjournal' is NULL, the zone will have no
* journal name.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
char *
dns_zone_getjournal(dns_zone_t *zone);
/*%<
* Returns the journal name associated with this zone.
* If no journal has been set this will be NULL.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*/
dns_zonetype_t
dns_zone_gettype(dns_zone_t *zone);
/*%<
* Returns the type of the zone (primary/secondary/etc.)
*
* Requires:
*\li 'zone' to be valid initialised zone.
*/
dns_zonetype_t
dns_zone_getredirecttype(dns_zone_t *zone);
/*%<
* Returns whether the redirect zone is configured as a primary or a
* secondary zone.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*\li 'zone' to be a redirect zone.
*
* Returns:
*\li 'dns_zone_primary'
*\li 'dns_zone_secondary'
*/
void
dns_zone_notify(dns_zone_t *zone, bool nodefer);
/*%<
* Generate notify events for this zone. If 'nodefer' is true, the
* 'notify-defer' configuration option is ingored.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_replacedb(dns_zone_t *zone, dns_db_t *db, bool dump);
/*%<
* Replace the database of "zone" with a new database "db".
*
* If "dump" is true, then the new zone contents are dumped
* into to the zone's master file for persistence. When replacing
* a zone database by one just loaded from a master file, set
* "dump" to false to avoid a redundant redump of the data just
* loaded. Otherwise, it should be set to true.
*
* If the "diff-on-reload" option is enabled in the configuration file,
* the differences between the old and the new database are added to the
* journal file, and the master file dump is postponed.
*
* Requires:
* \li 'zone' to be a valid zone.
*
* Returns:
* \li DNS_R_SUCCESS
* \li DNS_R_BADZONE zone failed basic consistency checks:
* * a single SOA must exist
* * some NS records must exist.
* Others
*/
uint32_t
dns_zone_getidlein(dns_zone_t *zone);
/*%<
* Requires:
* \li 'zone' to be a valid zone.
*
* Returns:
* \li number of seconds of idle time before we abort the transfer in.
*/
void
dns_zone_setidlein(dns_zone_t *zone, uint32_t idlein);
/*%<
* \li Set the idle timeout for transfer the.
* \li Zero set the default value, 1 hour.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
uint32_t
dns_zone_getidleout(dns_zone_t *zone);
/*%<
*
* Requires:
* \li 'zone' to be a valid zone.
*
* Returns:
* \li number of seconds of idle time before we abort a transfer out.
*/
void
dns_zone_setidleout(dns_zone_t *zone, uint32_t idleout);
/*%<
* \li Set the idle timeout for transfers out.
* \li Zero set the default value, 1 hour.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns_zone_getssutable(dns_zone_t *zone, dns_ssutable_t **table);
/*%<
* Get the simple-secure-update policy table.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns_zone_setssutable(dns_zone_t *zone, dns_ssutable_t *table);
/*%<
* Set / clear the simple-secure-update policy table.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
isc_mem_t *
dns_zone_getmctx(dns_zone_t *zone);
/*%<
* Get the memory context of a zone.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
dns_zonemgr_t *
dns_zone_getmgr(dns_zone_t *zone);
/*%<
* If 'zone' is managed return the zone manager otherwise NULL.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns_zone_setsigvalidityinterval(dns_zone_t *zone, uint32_t interval);
/*%<
* Set the zone's general signature validity interval. This is the length
* of time for which DNSSEC signatures created as a result of dynamic
* updates to secure zones will remain valid, in seconds.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
uint32_t
dns_zone_getsigvalidityinterval(dns_zone_t *zone);
/*%<
* Get the zone's general signature validity interval.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns_zone_setkeyvalidityinterval(dns_zone_t *zone, uint32_t interval);
/*%<
* Set the zone's DNSKEY signature validity interval. This is the length
* of time for which DNSSEC signatures created for DNSKEY records
* will remain valid, in seconds.
*
* If this value is set to zero, then the regular signature validity
* interval (see dns_zone_setsigvalidityinterval(), above) is used
* for all RRSIGs. However, if this value is nonzero, then it is used
* as the validity interval for RRSIGs covering DNSKEY and CDNSKEY
* RRsets.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
uint32_t
dns_zone_getkeyvalidityinterval(dns_zone_t *zone);
/*%<
* Get the zone's DNSKEY signature validity interval.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns_zone_setsigresigninginterval(dns_zone_t *zone, uint32_t interval);
/*%<
* Set the zone's RRSIG re-signing interval. A dynamic zone's RRSIG's
* will be re-signed 'interval' amount of time before they expire.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
uint32_t
dns_zone_getsigresigninginterval(dns_zone_t *zone);
/*%<
* Get the zone's RRSIG re-signing interval.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns_zone_getsourceaddr(dns_zone_t *zone, isc_sockaddr_t *sourceaddr);
/*%<
* Get the zone's source address from which it has last contacted the current
* primary server.
*
* Requires:
* \li 'zone' to be a valid zone.
* \li 'zone' has a non-empty primaries list.
* \li 'sourceaddr' to be non-NULL.
*/
isc_result_t
dns_zone_getprimaryaddr(dns_zone_t *zone, isc_sockaddr_t *primaryaddr);
/*%<
* Get the zone's current primary server into '*primaryaddr'.
*
* Requires:
* \li 'zone' to be a valid zone.
* \li 'zone' has a non-empty primaries list.
* \li 'primaryaddr' to be non-NULL.
*
* Returns:
*\li #ISC_R_SUCCESS if the current primary server was found
*\li #ISC_R_NOMORE if all the primaries were already iterated over
*/
isc_time_t
dns_zone_getxfrintime(dns_zone_t *zone);
/*%<
* Get the start time of the zone's latest major step before an incoming zone
* transfer is initiated. The time is set to the current time before the
* precursory SOA query is queued, then it gets reset when the query starts,
* when the query restarts (using another transport or another primary server),
* when an incoming zone transfer is initated and deferred, and, finally, when
* it gets started.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
dns_transport_type_t
dns_zone_getrequesttransporttype(dns_zone_t *zone);
/*%<
* Get the transport type used for the SOA query to the current primary server
* before an ongoing incoming zone transfer is lanunched. When the transfer is
* already running, this information should be retrieved from the xfrin object
* instead, using the dns_xfrin_gettransporttype() function.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
void
dns_zone_setnotifytype(dns_zone_t *zone, dns_notifytype_t notifytype);
/*%<
* Sets zone notify method to "notifytype"
*/
void
dns_zone_setcheckdstype(dns_zone_t *zone, dns_checkdstype_t checkdstype);
/*%<
* Sets zone checkds method to "checkdstype"
*/
isc_result_t
dns_zone_forwardupdate(dns_zone_t *zone, dns_message_t *msg,
dns_updatecallback_t callback, void *callback_arg);
/*%<
* Forward 'msg' to each primary in turn until we get an answer or we
* have exhausted the list of primaries. 'callback' will be called with
* ISC_R_SUCCESS if we get an answer and the returned message will be
* passed as 'answer_message', otherwise a non ISC_R_SUCCESS result code
* will be passed and answer_message will be NULL. The callback function
* is responsible for destroying 'answer_message'.
* (callback)(callback_arg, result, answer_message);
*
* Require:
*\li 'zone' to be valid
*\li 'msg' to be valid.
*\li 'callback' to be non NULL.
* Returns:
*\li #ISC_R_SUCCESS if the message has been forwarded,
*\li Others
*/
isc_result_t
dns_zone_next(dns_zone_t *zone, dns_zone_t **next);
/*%<
* Find the next zone in the list of managed zones.
*
* Requires:
*\li 'zone' to be valid
*\li The zone manager for the indicated zone MUST be locked
* by the caller. This is not checked.
*\li 'next' be non-NULL, and '*next' be NULL.
*
* Ensures:
*\li 'next' points to a valid zone (result ISC_R_SUCCESS) or to NULL
* (result ISC_R_NOMORE).
*/
isc_result_t
dns_zone_first(dns_zonemgr_t *zmgr, dns_zone_t **first);
/*%<
* Find the first zone in the list of managed zones.
*
* Requires:
*\li 'zonemgr' to be valid
*\li The zone manager for the indicated zone MUST be locked
* by the caller. This is not checked.
*\li 'first' be non-NULL, and '*first' be NULL
*
* Ensures:
*\li 'first' points to a valid zone (result ISC_R_SUCCESS) or to NULL
* (result ISC_R_NOMORE).
*/
void
dns_zone_setkeydirectory(dns_zone_t *zone, const char *directory);
/*%<
* Sets the name of the directory where private keys used for
* online signing or dynamic zones are found.
*
* Require:
*\li 'zone' to be a valid zone.
*/
const char *
dns_zone_getkeydirectory(dns_zone_t *zone);
/*%<
* Gets the name of the directory where private keys used for
* online signing of dynamic zones are found.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*
* Returns:
* Pointer to null-terminated file name, or NULL.
*/
void
dns_zone_setkeystores(dns_zone_t *zone, dns_keystorelist_t *keystores);
/*%<
* Sets the keystore list where private keys used for
* online signing or dynamic zones are found.
*
* Require:
*\li 'zone' to be a valid zone.
*/
dns_keystorelist_t *
dns_zone_getkeystores(dns_zone_t *zone);
/*%<
* Gets the keystore list where private keys used for
* online signing or dynamic zones are found.
*
* Require:
*\li 'zone' to be a valid zone.
*
* Returns:
* Pointer to the keystore list, or NULL.
*/
isc_result_t
dns_zone_getdnsseckeys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
isc_stdtime_t now, dns_dnsseckeylist_t *keys);
/*%<
* Find DNSSEC keys used for signing with dnssec-policy. Load these keys
* into 'keys'.
*
* Requires:
*\li 'zone' to be valid initialised zone.
*\li 'keys' to be an initialised DNSSEC keylist.
*
* Returns:
*\li #ISC_R_SUCCESS
*\li Error
*/
isc_result_t
dns_zone_findkeys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
isc_stdtime_t now, isc_mem_t *mctx, unsigned int maxkeys,
dst_key_t **keys, unsigned int *nkeys);
/*%<
* Finds a set of zone keys. Searches in the applicable key stores for the
* given 'zone' if there is a dnssec-policy attached, otherwise it looks up
* the keys in the zone's key-directory. The found keys are loaded into 'keys'.
*
* Requires:
*\li 'zone' to be a valid initialised zone.
*\li 'mctx' is not NULL.
*\li 'keys' is not NULL and has enough space form 'nkeys' keys.
*\li 'nkeys' is not NULL.
*
* Returns:
*\li #ISC_R_SUCCESS
*\li Error
*/
void
dns_zone_prepare_shutdown(dns_zone_t *zone);
/*%<
* Prepare a zone for shutdown by setting the DNS_ZONEFLG_EXITING flag even
* before the final reference is detached. Useful, because the zone object can
* be kept around with a valid reference from the zonetable until qp garbage
* collector runs, and we don't want, for example, zone maintenance to happen
* while waiting for it. Note that the zone can not be used normally again after
* this function is called.
*
* Requires:
*\li 'zone' to be a valid initialised zone.
*/
void
dns_zonemgr_create(isc_mem_t *mctx, isc_nm_t *netmgr, dns_zonemgr_t **zmgrp);
/*%<
* Create a zone manager.
*
* Requires:
*\li 'mctx' to be a valid memory context.
*\li 'zmgrp' to point to a NULL pointer.
*/
isc_result_t
dns_zonemgr_createzone(dns_zonemgr_t *zmgr, dns_zone_t **zonep);
/*%<
* Allocate a new zone using a memory context from the
* zone manager's memory context pool.
*
* Require:
*\li 'zmgr' to be a valid zone manager.
*\li 'zonep' != NULL and '*zonep' == NULL.
*/
isc_result_t
dns_zonemgr_managezone(dns_zonemgr_t *zmgr, dns_zone_t *zone);
/*%<
* Bring the zone under control of a zone manager.
*
* Require:
*\li 'zmgr' to be a valid zone manager.
*\li 'zone' to be a valid zone.
*/
isc_result_t
dns_zonemgr_forcemaint(dns_zonemgr_t *zmgr);
/*%<
* Force zone maintenance of all loaded zones managed by 'zmgr'
* to take place at the system's earliest convenience.
*/
void
dns_zonemgr_shutdown(dns_zonemgr_t *zmgr);
/*%<
* Shut down the zone manager.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*/
void
dns_zonemgr_attach(dns_zonemgr_t *source, dns_zonemgr_t **target);
/*%<
* Attach '*target' to 'source' incrementing its external
* reference count.
*
* Require:
*\li 'zone' to be a valid zone.
*\li 'target' to be non NULL and '*target' to be NULL.
*/
void
dns_zonemgr_detach(dns_zonemgr_t **zmgrp);
/*%<
* Detach from a zone manager.
*
* Requires:
*\li '*zmgrp' is a valid, non-NULL zone manager pointer.
*
* Ensures:
*\li '*zmgrp' is NULL.
*/
void
dns_zonemgr_releasezone(dns_zonemgr_t *zmgr, dns_zone_t *zone);
/*%<
* Release 'zone' from the managed by 'zmgr'. 'zmgr' is implicitly
* detached from 'zone'.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*\li 'zone' to be a valid zone.
*\li 'zmgr' == 'zone->zmgr'
*
* Ensures:
*\li 'zone->zmgr' == NULL;
*/
void
dns_zonemgr_settransfersin(dns_zonemgr_t *zmgr, uint32_t value);
/*%<
* Set the maximum number of simultaneous transfers in allowed by
* the zone manager.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*/
uint32_t
dns_zonemgr_gettransfersin(dns_zonemgr_t *zmgr);
/*%<
* Return the maximum number of simultaneous transfers in allowed.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*/
void
dns_zonemgr_settransfersperns(dns_zonemgr_t *zmgr, uint32_t value);
/*%<
* Set the number of zone transfers allowed per nameserver.
*
* Requires:
*\li 'zmgr' to be a valid zone manager
*/
uint32_t
dns_zonemgr_gettransfersperns(dns_zonemgr_t *zmgr);
/*%<
* Return the number of transfers allowed per nameserver.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*/
void
dns_zonemgr_setcheckdsrate(dns_zonemgr_t *zmgr, unsigned int value);
/*%<
* Set the number of parental DS queries sent per second.
*
* Requires:
*\li 'zmgr' to be a valid zone manager
*/
void
dns_zonemgr_setnotifyrate(dns_zonemgr_t *zmgr, unsigned int value);
/*%<
* Set the number of NOTIFY requests sent per second.
*
* Requires:
*\li 'zmgr' to be a valid zone manager
*/
void
dns_zonemgr_setstartupnotifyrate(dns_zonemgr_t *zmgr, unsigned int value);
/*%<
* Set the number of startup NOTIFY requests sent per second.
*
* Requires:
*\li 'zmgr' to be a valid zone manager
*/
void
dns_zonemgr_setserialqueryrate(dns_zonemgr_t *zmgr, unsigned int value);
/*%<
* Set the number of SOA queries sent per second.
*
* Requires:
*\li 'zmgr' to be a valid zone manager
*/
unsigned int
dns_zonemgr_getnotifyrate(dns_zonemgr_t *zmgr);
/*%<
* Return the number of NOTIFY requests sent per second.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*/
unsigned int
dns_zonemgr_getstartupnotifyrate(dns_zonemgr_t *zmgr);
/*%<
* Return the number of startup NOTIFY requests sent per second.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*/
unsigned int
dns_zonemgr_getserialqueryrate(dns_zonemgr_t *zmgr);
/*%<
* Return the number of SOA queries sent per second.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*/
unsigned int
dns_zonemgr_getcount(dns_zonemgr_t *zmgr, dns_zonestate_t state);
/*%<
* Returns the number of zones in the specified state.
*
* Requires:
*\li 'zmgr' to be a valid zone manager.
*\li 'state' to be a valid DNS_ZONESTATE_ enum.
*/
isc_result_t
dns_zone_getxfr(dns_zone_t *zone, dns_xfrin_t **xfrp, bool *is_firstrefresh,
bool *is_running, bool *is_deferred, bool *is_presoa,
bool *is_pending, bool *needs_refresh);
/*%<
* Returns the xfrin associated with the zone (if any) with the current
* transfer states (as booleans). When no longer needed, the returned xfrin
* must be detached.
*
* Requires:
*\li 'zone' to be a valid zone.
*\li 'xfrp' to be non NULL and '*xfrp' to be NULL.
*\li 'is_firstrefresh' to be non NULL.
*\li 'is_running' to be non NULL.
*\li 'is_deferred' to be non NULL.
*\li 'is_presoa' to be non NULL.
*\li 'is_pending' to be non NULL.
*\li 'needs_refresh' to be non NULL.
*
* Returns:
* ISC_R_SUCCESS transfer information is returned
* ISC_R_FAILURE error while trying to get the transfer information
*/
void
dns_zonemgr_set_tlsctx_cache(dns_zonemgr_t *zmgr,
isc_tlsctx_cache_t *tlsctx_cache);
/*%<
* Set the TLS client context cache used for zone transfers via
* encrypted transports (e.g. XoT).
*
* Requires:
*\li 'zmgr' is a valid zone manager.
*\li 'tlsctx_cache' is a valid TLS context cache.
*/
void
dns_zone_stopxfr(dns_zone_t *zone);
/*%<
* If 'zone' has an ongoing active transfer, stop it.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
void
dns_zone_forcexfr(dns_zone_t *zone);
/*%<
* Force a zone transfer of the specified zone.
*
* Requires:
*\li 'zone' to be a valid zone.
*/
bool
dns_zone_isforced(dns_zone_t *zone);
/*%<
* Check if the zone is waiting a forced reload.
*
* Requires:
* \li 'zone' to be a valid zone.
*/
isc_result_t
dns_zone_setstatistics(dns_zone_t *zone, bool on);
/*%<
* This function is obsoleted by dns_zone_setrequeststats().
*/
uint64_t *
dns_zone_getstatscounters(dns_zone_t *zone);
/*%<
* This function is obsoleted by dns_zone_getrequeststats().
*/
void
dns_zone_setstats(dns_zone_t *zone, isc_stats_t *stats);
/*%<
* Set a general zone-maintenance statistics set 'stats' for 'zone'. This
* function is expected to be called only on zone creation (when necessary).
* Once installed, it cannot be removed or replaced. Also, there is no
* interface to get the installed stats from the zone; the caller must keep the
* stats to reference (e.g. dump) it later.
*
* Requires:
* \li 'zone' to be a valid zone and does not have a statistics set already
* installed.
*
*\li stats is a valid statistics supporting zone statistics counters
* (see dns/stats.h).
*/
void
dns_zone_setrequeststats(dns_zone_t *zone, isc_stats_t *stats);
void
dns_zone_setrcvquerystats(dns_zone_t *zone, dns_stats_t *stats);
void
dns_zone_setdnssecsignstats(dns_zone_t *zone, dns_stats_t *stats);
/*%<
* Set additional statistics sets to zone. These are attached to the zone
* but are not counted in the zone module; only the caller updates the
* counters.
*
* Requires:
* \li 'zone' to be a valid zone.
*
*\li stats is a valid statistics.
*/
isc_stats_t *
dns_zone_getrequeststats(dns_zone_t *zone);
dns_stats_t *
dns_zone_getrcvquerystats(dns_zone_t *zone);
dns_stats_t *
dns_zone_getdnssecsignstats(dns_zone_t *zone);
/*%<
* Get the additional statistics for zone, if one is installed.
*
* Requires:
* \li 'zone' to be a valid zone.
*
* Returns:
* \li when available, a pointer to the statistics set installed in zone;
* otherwise NULL.
*/
void
dns_zone_logv(dns_zone_t *zone, isc_logcategory_t category, int level,
const char *prefix, const char *msg, va_list ap);
/*%<
* Log the message 'msg...' at 'level' using log category 'category', including
* text that identifies the message as applying to 'zone'. If the (optional)
* 'prefix' is not NULL, it will be placed at the start of the entire log line.
*/
void
dns_zone_log(dns_zone_t *zone, int level, const char *msg, ...)
ISC_FORMAT_PRINTF(3, 4);
/*%<
* Log the message 'msg...' at 'level', including text that identifies
* the message as applying to 'zone'.
*/
void
dns_zone_logc(dns_zone_t *zone, isc_logcategory_t category, int level,
const char *msg, ...) ISC_FORMAT_PRINTF(4, 5);
/*%<
* Log the message 'msg...' at 'level', including text that identifies
* the message as applying to 'zone'.
*/
void
dns_zone_name(dns_zone_t *zone, char *buf, size_t len);
/*%<
* Return the name of the zone with class and view.
*
* Requires:
*\li 'zone' to be valid.
*\li 'buf' to be non NULL.
*/
void
dns_zone_nameonly(dns_zone_t *zone, char *buf, size_t len);
/*%<
* Return the name of the zone only.
*
* Requires:
*\li 'zone' to be valid.
*\li 'buf' to be non NULL.
*/
isc_result_t
dns_zone_checknames(dns_zone_t *zone, const dns_name_t *name,
dns_rdata_t *rdata);
/*%<
* Check if this record meets the check-names policy.
*
* Requires:
* 'zone' to be valid.
* 'name' to be valid.
* 'rdata' to be valid.
*
* Returns:
* DNS_R_SUCCESS passed checks.
* DNS_R_BADOWNERNAME failed ownername checks.
* DNS_R_BADNAME failed rdata checks.
*/
void
dns_zone_setcheckmx(dns_zone_t *zone, dns_checkmxfunc_t checkmx);
/*%<
* Set the post load integrity callback function 'checkmx'.
* 'checkmx' will be called if the MX TARGET is not within the zone.
*
* Require:
* 'zone' to be a valid zone.
*/
void
dns_zone_setchecksrv(dns_zone_t *zone, dns_checkmxfunc_t checksrv);
/*%<
* Set the post load integrity callback function 'checksrv'.
* 'checksrv' will be called if the SRV TARGET is not within the zone.
*
* Require:
* 'zone' to be a valid zone.
*/
void
dns_zone_setcheckns(dns_zone_t *zone, dns_checknsfunc_t checkns);
/*%<
* Set the post load integrity callback function 'checkns'.
* 'checkns' will be called if the NS TARGET is not within the zone.
*
* Require:
* 'zone' to be a valid zone.
*/
void
dns_zone_setcheckisservedby(dns_zone_t *zone,
dns_checkisservedbyfunc_t checkisserverby);
/*%<
* Set the post load integrity callback function 'checkisserverby'.
* 'checkisserverby' will be called if the NS TARGET is not within
* the zone and there are A or AAAA records in the the zone.
*
* Require:
* 'zone' to be a valid zone.
*/
void
dns_zone_setnotifydefer(dns_zone_t *zone, uint32_t defer);
/*%<
* Set the wait/defer time (in seconds) before notify messages are sent when
* they are ready.
*
* Requires:
* 'zone' to be valid.
*/
void
dns_zone_setnotifydelay(dns_zone_t *zone, uint32_t delay);
/*%<
* Set the minimum delay (in seconds) between sets of notify messages.
*
* Requires:
* 'zone' to be valid.
*/
void
dns_zone_setisself(dns_zone_t *zone, dns_isselffunc_t isself, void *arg);
/*%<
* Set the isself callback function and argument.
*
* bool
* isself(dns_view_t *myview, dns_tsigkey_t *mykey,
* const isc_netaddr_t *srcaddr, const isc_netaddr_t *destaddr,
* dns_rdataclass_t rdclass, void *arg);
*
* 'isself' returns true if a non-recursive query from 'srcaddr' to
* 'destaddr' with optional key 'mykey' for class 'rdclass' would be
* delivered to 'myview'.
*/
void
dns_zone_setnodes(dns_zone_t *zone, uint32_t nodes);
/*%<
* Set the number of nodes that will be checked per quantum.
*/
void
dns_zone_setsignatures(dns_zone_t *zone, uint32_t signatures);
/*%<
* Set the number of signatures that will be generated per quantum.
*/
uint32_t
dns_zone_getsignatures(dns_zone_t *zone);
/*%<
* Get the number of signatures that will be generated per quantum.
*/
isc_result_t
dns_zone_signwithkey(dns_zone_t *zone, dst_algorithm_t algorithm,
uint16_t keyid, bool deleteit);
/*%<
* Initiate/resume signing of the entire zone with the zone DNSKEY(s)
* that match the given algorithm and keyid.
*/
isc_result_t
dns_zone_addnsec3chain(dns_zone_t *zone, dns_rdata_nsec3param_t *nsec3param);
/*%<
* Incrementally add a NSEC3 chain that corresponds to 'nsec3param'.
*/
void
dns_zone_setprivatetype(dns_zone_t *zone, dns_rdatatype_t type);
dns_rdatatype_t
dns_zone_getprivatetype(dns_zone_t *zone);
/*
* Get/Set the private record type. It is expected that these interfaces
* will not be permanent.
*/
void
dns_zone_rekey(dns_zone_t *zone, bool fullsign);
/*%<
* Update the zone's DNSKEY set from the key repository.
*
* If 'fullsign' is true, trigger an immediate full signing of
* the zone with the new key. Otherwise, if there are no keys or
* if the new keys are for algorithms that have already signed the
* zone, then the zone can be re-signed incrementally.
*/
isc_result_t
dns_zone_nscheck(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
unsigned int *errors);
/*%
* Check if the name servers for the zone are sane (have address, don't
* refer to CNAMEs/DNAMEs. The number of constiancy errors detected in
* returned in '*errors'
*
* Requires:
* \li 'zone' to be valid.
* \li 'db' to be valid.
* \li 'version' to be valid or NULL.
* \li 'errors' to be non NULL.
*
* Returns:
* ISC_R_SUCCESS if there were no errors examining the zone contents.
*/
isc_result_t
dns_zone_cdscheck(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version);
/*%
* Check if CSD, CDNSKEY and DNSKEY are consistent.
*
* Requires:
* \li 'zone' to be valid.
* \li 'db' to be valid.
* \li 'version' to be valid or NULL.
*
* Returns:
*\li #ISC_R_SUCCESS
*\li #DNS_R_BADCDS
*\li #DNS_R_BADCDNSKEY
* Others
*/
void
dns_zone_setadded(dns_zone_t *zone, bool added);
/*%
* Sets the value of zone->added, which should be true for
* zones that were originally added by "rndc addzone".
*
* Requires:
* \li 'zone' to be valid.
*/
bool
dns_zone_getadded(dns_zone_t *zone);
/*%
* Returns true if the zone was originally added at runtime
* using "rndc addzone".
*
* Requires:
* \li 'zone' to be valid.
*/
void
dns_zone_setautomatic(dns_zone_t *zone, bool automatic);
/*%
* Sets the value of zone->automatic, which should be true for
* zones that were automatically added by named.
*
* Requires:
* \li 'zone' to be valid.
*/
bool
dns_zone_getautomatic(dns_zone_t *zone);
/*%
* Returns true if the zone was added automatically by named.
*
* Requires:
* \li 'zone' to be valid.
*/
isc_result_t
dns_zone_dlzpostload(dns_zone_t *zone, dns_db_t *db);
/*%
* Load the origin names for a writeable DLZ database.
*/
bool
dns_zone_isdynamic(dns_zone_t *zone, bool ignore_freeze);
/*%
* Return true iff the zone is "dynamic", in the sense that the zone's
* master file (if any) is written by the server, rather than being
* updated manually and read by the server.
*
* This is true for secondary zones, stub zones, key zones, and zones that
* allow dynamic updates either by having an update policy ("ssutable")
* or an "allow-update" ACL with a value other than exactly "{ none; }".
*
* If 'ignore_freeze' is true, then the zone which has had updates disabled
* will still report itself to be dynamic.
*
* Requires:
* \li 'zone' to be valid.
*/
isc_result_t
dns_zone_setrefreshkeyinterval(dns_zone_t *zone, uint32_t interval);
/*%
* Sets the frequency, in minutes, with which the key repository will be
* checked to see if the keys for this zone have been updated. Any value
* higher than 1440 minutes (24 hours) will be silently reduced. A
* value of zero will return an out-of-range error.
*
* Requires:
* \li 'zone' to be valid.
*/
bool
dns_zone_getrequestexpire(dns_zone_t *zone);
/*%
* Returns the true/false value of the request-expire option in the zone.
*
* Requires:
* \li 'zone' to be valid.
*/
void
dns_zone_setrequestexpire(dns_zone_t *zone, bool flag);
/*%
* Sets the request-expire option for the zone. Either true or false. The
* default value is determined by the setting of this option in the view.
*
* Requires:
* \li 'zone' to be valid.
*/
bool
dns_zone_getrequestixfr(dns_zone_t *zone);
/*%
* Returns the true/false value of the request-ixfr option in the zone.
*
* Requires:
* \li 'zone' to be valid.
*/
void
dns_zone_setrequestixfr(dns_zone_t *zone, bool flag);
/*%
* Sets the request-ixfr option for the zone. Either true or false. The
* default value is determined by the setting of this option in the view.
*
* Requires:
* \li 'zone' to be valid.
*/
bool
dns_zone_getrequestixfrmaxdiffs(dns_zone_t *zone);
/*%
* Returns the value of the request-ixfr-max-diffs option in the zone.
*
* Requires:
* \li 'zone' to be valid.
*/
void
dns_zone_setrequestixfrmaxdiffs(dns_zone_t *zone, uint32_t maxmsgs);
/*%
* Sets the request-ixfr-max-diffs option for the zone. 0 means unlimited. The
* default value is determined by the setting of this option in the view.
*
* Requires:
* \li 'zone' to be valid.
*/
uint32_t
dns_zone_getixfrratio(dns_zone_t *zone);
/*%
* Returns the zone's current IXFR ratio.
*
* Requires:
* \li 'zone' to be valid.
*/
void
dns_zone_setixfrratio(dns_zone_t *zone, uint32_t ratio);
/*%
* Sets the ratio of IXFR size to zone size above which we use an AXFR
* response, expressed as a percentage. Cannot exceed 100.
*
* Requires:
* \li 'zone' to be valid.
*/
void
dns_zone_setserialupdatemethod(dns_zone_t *zone, dns_updatemethod_t method);
/*%
* Sets the update method to use when incrementing the zone serial number
* due to a DDNS update. Valid options are dns_updatemethod_increment
* and dns_updatemethod_unixtime.
*
* Requires:
* \li 'zone' to be valid.
*/
dns_updatemethod_t
dns_zone_getserialupdatemethod(dns_zone_t *zone);
/*%<
* Returns the update method to be used when incrementing the zone serial
* number due to a DDNS update.
*
* Requires:
* \li 'zone' to be valid.
*/
isc_result_t
dns_zone_link(dns_zone_t *zone, dns_zone_t *raw);
void
dns_zone_getraw(dns_zone_t *zone, dns_zone_t **raw);
bool
dns_zone_israw(dns_zone_t *zone);
bool
dns_zone_issecure(dns_zone_t *zone);
isc_result_t
dns_zone_keydone(dns_zone_t *zone, const char *data);
/*%<
* Delete the private-type record from the top of the zone
* which indicates that signing is complete with the key matching
* 'data'; this is invoked by 'rndc signing -clear'.
*
* Requires:
* \li 'zone' to be valid.
*/
isc_result_t
dns_zone_setnsec3param(dns_zone_t *zone, uint8_t hash, uint8_t flags,
uint16_t iter, uint8_t saltlen, unsigned char *salt,
bool replace, bool resalt);
/*%<
* Set the NSEC3 parameters for the zone.
*
* If 'replace' is true, then the existing NSEC3 chain, if any, will
* be replaced with the new one. If 'hash' is zero, then the replacement
* chain will be NSEC rather than NSEC3. If 'resalt' is true, or if 'salt'
* is NULL, generate a new salt with the given salt length.
*
* Requires:
* \li 'zone' to be valid.
*/
void
dns_zone_setrawdata(dns_zone_t *zone, dns_masterrawheader_t *header);
/*%
* Set the data to be included in the header when the zone is dumped in
* binary format.
*/
isc_result_t
dns_zone_synckeyzone(dns_zone_t *zone);
/*%
* Force the managed key zone to synchronize, and start the key
* maintenance timer.
*/
isc_result_t
dns_zone_getloadtime(dns_zone_t *zone, isc_time_t *loadtime);
/*%
* Return the time when the zone was last loaded.
*/
isc_result_t
dns_zone_getrefreshtime(dns_zone_t *zone, isc_time_t *refreshtime);
/*%
* Return the time when the (secondary) zone will need to be refreshed.
*/
isc_result_t
dns_zone_getexpiretime(dns_zone_t *zone, isc_time_t *expiretime);
/*%
* Return the time when the (secondary) zone will expire.
*/
isc_result_t
dns_zone_getrefreshkeytime(dns_zone_t *zone, isc_time_t *refreshkeytime);
/*%
* Return the time of the next scheduled DNSSEC key event.
*/
unsigned int
dns_zone_getincludes(dns_zone_t *zone, char ***includesp);
/*%
* Return the number include files that were encountered
* during load. If the number is greater than zero, 'includesp'
* will point to an array containing the filenames.
*
* The array and its contents need to be freed using isc_mem_free.
*/
isc_result_t
dns_zone_rpz_enable(dns_zone_t *zone, dns_rpz_zones_t *rpzs,
dns_rpz_num_t rpz_num);
/*%
* Set the response policy associated with a zone.
*/
void
dns_zone_rpz_enable_db(dns_zone_t *zone, dns_db_t *db);
/*%
* If a zone is a response policy zone, mark its new database.
*/
dns_rpz_num_t
dns_zone_get_rpz_num(dns_zone_t *zone);
void
dns_zone_catz_enable(dns_zone_t *zone, dns_catz_zones_t *catzs);
/*%<
* Enable zone as catalog zone.
*
* Requires:
*
* \li 'zone' is a valid zone object
* \li 'catzs' is not NULL
* \li prior to calling, zone->catzs is NULL or is equal to 'catzs'
*/
void
dns_zone_catz_disable(dns_zone_t *zone);
/*%<
* Disable zone as catalog zone, if it is one. Also disables any
* registered callbacks for the catalog zone.
*
* Requires:
*
* \li 'zone' is a valid zone object
*/
bool
dns_zone_catz_is_enabled(dns_zone_t *zone);
/*%<
* Return a boolean indicating whether the zone is enabled as catalog zone.
*
* Requires:
*
* \li 'zone' is a valid zone object
*/
void
dns_zone_catz_enable_db(dns_zone_t *zone, dns_db_t *db);
/*%<
* If 'zone' is a catalog zone, then set up a notify-on-update trigger
* in its database. (If not a catalog zone, this function has no effect.)
*
* Requires:
*
* \li 'zone' is a valid zone object
* \li 'db' is not NULL
*/
void
dns_zone_set_parentcatz(dns_zone_t *zone, dns_catz_zone_t *catz);
/*%<
* Set parent catalog zone for this zone
*
* Requires:
*
* \li 'zone' is a valid zone object
* \li 'catz' is not NULL
*/
dns_catz_zone_t *
dns_zone_get_parentcatz(dns_zone_t *zone);
/*%<
* Get parent catalog zone for this zone
*
* Requires:
*
* \li 'zone' is a valid zone object
*/
void
dns_zone_setstatlevel(dns_zone_t *zone, dns_zonestat_level_t level);
dns_zonestat_level_t
dns_zone_getstatlevel(dns_zone_t *zone);
/*%
* Set and get the statistics reporting level for the zone;
* full, terse, or none.
*/
isc_result_t
dns_zone_setserial(dns_zone_t *zone, uint32_t serial);
/*%
* Set the zone's serial to 'serial'.
*/
isc_stats_t *
dns_zone_getgluecachestats(dns_zone_t *zone);
/*%<
* Get the glue cache statistics for zone.
*
* Requires:
* \li 'zone' to be a valid zone.
*
* Returns:
* \li if present, a pointer to the statistics set installed in zone;
* otherwise NULL.
*/
bool
dns_zone_isloaded(dns_zone_t *zone);
/*%<
* Return true if 'zone' was loaded and has not expired yet, return
* false otherwise.
*/
isc_result_t
dns_zone_verifydb(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver);
/*%<
* If 'zone' is a mirror zone, perform DNSSEC validation of version 'ver' of
* its database, 'db'. Ensure that the DNSKEY RRset at zone apex is signed by
* at least one trust anchor specified for the view that 'zone' is assigned to.
* If 'ver' is NULL, use the current version of 'db'.
*
* If 'zone' is not a mirror zone, return ISC_R_SUCCESS immediately.
*
* Returns:
*
* \li #ISC_R_SUCCESS either 'zone' is not a mirror zone or 'zone' is
* a mirror zone and all DNSSEC checks succeeded
* and the DNSKEY RRset at zone apex is signed by
* a trusted key
*
* \li #DNS_R_VERIFYFAILURE any other case
*/
const char *
dns_zonetype_name(dns_zonetype_t type);
/*%<
* Return the name of the zone type 'type'.
*/
isc_mem_t *
dns_zone_getmem(dns_zone_t *zone);
/**<
* \brief Return memory context associated with the zone.
*
* \param zone valid dns_zone_t object.
*
* \return memory context associated with the zone
*/
unsigned int
dns_zone_gettid(dns_zone_t *zone);
/**<
* \brief Return thread-id associated with the zone.
*
* \param valid dns_zone_t object
*
* \return thread id associated with the zone
*/
isc_loop_t *
dns_zone_getloop(dns_zone_t *zone);
/**<
* \brief Return loop associated with the zone.
*
* \param valid dns_zone_t object
*
* \return loop associated with the zone
*/
bool
dns_zone_check_dnskey_nsec3(dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *ver, dns_diff_t *diff,
dst_key_t **keys, unsigned int numkeys);
/**<
* Return whether the zone would enter an inconsistent state where NSEC only
* DNSKEYs are present along NSEC3 chains.
*
* Requires:
* \li 'zone' to be a valid zone.
* \li 'db' is not NULL.
*
* Returns:
* \li 'true' if the check passes, that is the zone remains consistent,
* 'false' if the zone would have NSEC only DNSKEYs and an NSEC3 chain.
*/
isc_result_t
dns_zone_import_skr(dns_zone_t *zone, const char *file);
/**<
* Import a Signed Key Response (SKR) from file.
*
* Requires:
* \li 'zone' to be a valid zone.
* \li 'file' is not NULL.
*
* Returns:
* \li ISC_R_SUCCESS if there were no errors loading the SKR.
*/
void
dns_zone_setrad(dns_zone_t *zone, dns_name_t *name);
/**<
* \brief Set the per zone RAD
*
* Requires:
* \li 'zone' to be a valid zone.
* \li 'name' is NULL or a valid name.
*/
isc_result_t
dns_zone_getrad(dns_zone_t *zone, dns_name_t *name);
/**<
* \brief get the per zone RAD
*
* Requires:
* \li 'zone' to be a valid zone.
* \li 'name' is a valid name with a buffer.
*/
isc_result_t
dns_zone_getzoneversion(dns_zone_t *zone, isc_buffer_t *b);
/**<
* Return the EDNS ZONEVERSION for this zone.
*
* Note: For type SERIAL a buffer of at least 6 octets is required.
*
* Requires:
* \li 'zone' to be a valid zone.
* \li 'b' to be a valid buffer.
*
* Returns
* \li ISC_R_SUCCESS if the zone is loaded and supports ZONEVERSION.
* \li ISC_R_NOSPACE if the buffer is too small.
* \li DNS_R_NOTLOADED if the database is not loaded.
* \li ISC_R_FAILURE other failure.
*/
#if DNS_ZONE_TRACE
#define dns_zone_ref(ptr) dns_zone__ref(ptr, __func__, __FILE__, __LINE__)
#define dns_zone_unref(ptr) dns_zone__unref(ptr, __func__, __FILE__, __LINE__)
#define dns_zone_attach(ptr, ptrp) \
dns_zone__attach(ptr, ptrp, __func__, __FILE__, __LINE__)
#define dns_zone_detach(ptrp) \
dns_zone__detach(ptrp, __func__, __FILE__, __LINE__)
ISC_REFCOUNT_TRACE_DECL(dns_zone);
#else
ISC_REFCOUNT_DECL(dns_zone);
#endif