Commit b4d8192d authored by Evan Hunt's avatar Evan Hunt
Browse files

3241. [func] Extended the header of raw-format master files to

			include the serial number of the zone from which
			they were generated, if different (as in the case
			of inline-signing zones).  This is to be used in
			inline-signing zones, to track changes between the
			unsigned and signed versions of the zone, which may
			have different serial numbers.

			(Note: raw zonefiles generated by this version of
			BIND are no longer compatble with prior versions.
			To generate a backward-compatible raw zonefile
			using dnssec-signzone or named-compilezone, specify
			output format "raw=0" instead of simply "raw".)
			[RT #26587]
parent 00a4d6a5
3241. [func] Extended the header of raw-format master files to
include the serial number of the zone from which
they were generated, if different (as in the case
of inline-signing zones). This is to be used in
inline-signing zones, to track changes between the
unsigned and signed versions of the zone, which may
have different serial numbers.
(Note: raw zonefiles generated by this version of
BIND are no longer compatble with prior versions.
To generate a backward-compatible raw zonefile
using dnssec-signzone or named-compilezone, specify
output format "raw=0" instead of simply "raw".)
[RT #26587]
3241. [bug] Address race conditions in the resolver code.
[RT #26889]
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: check-tool.c,v 1.41 2010/09/07 23:46:59 tbox Exp $ */
/* $Id: check-tool.c,v 1.42 2011/12/08 16:07:19 each Exp $ */
/*! \file */
......@@ -635,7 +635,8 @@ load_zone(isc_mem_t *mctx, const char *zonename, const char *filename,
/*% dump the zone */
isc_result_t
dump_zone(const char *zonename, dns_zone_t *zone, const char *filename,
dns_masterformat_t fileformat, const dns_master_style_t *style)
dns_masterformat_t fileformat, const dns_master_style_t *style,
const isc_uint32_t rawversion)
{
isc_result_t result;
FILE *output = stdout;
......@@ -658,7 +659,8 @@ dump_zone(const char *zonename, dns_zone_t *zone, const char *filename,
}
}
result = dns_zone_dumptostream2(zone, output, fileformat, style);
result = dns_zone_dumptostream3(zone, output, fileformat, style,
rawversion);
if (output != stdout)
(void)isc_stdio_close(output);
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: check-tool.h,v 1.16 2010/09/07 23:46:59 tbox Exp $ */
/* $Id: check-tool.h,v 1.17 2011/12/08 16:07:19 each Exp $ */
#ifndef CHECK_TOOL_H
#define CHECK_TOOL_H
......@@ -41,7 +41,8 @@ load_zone(isc_mem_t *mctx, const char *zonename, const char *filename,
isc_result_t
dump_zone(const char *zonename, dns_zone_t *zone, const char *filename,
dns_masterformat_t fileformat, const dns_master_style_t *style);
dns_masterformat_t fileformat, const dns_master_style_t *style,
const isc_uint32_t rawversion);
#ifdef _WIN32
void InitSockets(void);
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: named-checkzone.c,v 1.61 2010/09/07 23:46:59 tbox Exp $ */
/* $Id: named-checkzone.c,v 1.62 2011/12/08 16:07:19 each Exp $ */
/*! \file */
......@@ -112,6 +112,7 @@ main(int argc, char **argv) {
const char *outputformatstr = NULL;
dns_masterformat_t inputformat = dns_masterformat_text;
dns_masterformat_t outputformat = dns_masterformat_text;
isc_uint32_t rawversion = 1;
FILE *errout = stdout;
outputstyle = &dns_master_style_full;
......@@ -397,7 +398,11 @@ main(int argc, char **argv) {
inputformat = dns_masterformat_text;
else if (strcasecmp(inputformatstr, "raw") == 0)
inputformat = dns_masterformat_raw;
else {
else if (strncasecmp(inputformatstr, "raw=", 4) == 0) {
inputformat = dns_masterformat_raw;
fprintf(stderr,
"WARNING: input format raw, version ignored\n");
} else {
fprintf(stderr, "unknown file format: %s\n",
inputformatstr);
exit(1);
......@@ -405,11 +410,22 @@ main(int argc, char **argv) {
}
if (outputformatstr != NULL) {
if (strcasecmp(outputformatstr, "text") == 0)
if (strcasecmp(outputformatstr, "text") == 0) {
outputformat = dns_masterformat_text;
else if (strcasecmp(outputformatstr, "raw") == 0)
} else if (strcasecmp(outputformatstr, "raw") == 0) {
outputformat = dns_masterformat_raw;
} else if (strncasecmp(outputformatstr, "raw=", 4) == 0) {
char *end;
outputformat = dns_masterformat_raw;
else {
rawversion = strtol(outputformatstr + 4, &end, 10);
if (end == outputformatstr + 4 || *end != '\0' ||
rawversion > 1U) {
fprintf(stderr,
"unknown raw format version\n");
exit(1);
}
} else {
fprintf(stderr, "unknown file format: %s\n",
outputformatstr);
exit(1);
......@@ -467,7 +483,7 @@ main(int argc, char **argv) {
fflush(errout);
}
result = dump_zone(origin, zone, output_filename,
outputformat, outputstyle);
outputformat, outputstyle, rawversion);
if (!quiet && progmode == progmode_compile)
fprintf(errout, "done\n");
}
......
......@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
<!-- $Id: named-checkzone.docbook,v 1.40 2010/01/16 23:48:15 tbox Exp $ -->
<!-- $Id: named-checkzone.docbook,v 1.41 2011/12/08 16:07:20 each Exp $ -->
<refentry id="man.named-checkzone">
<refentryinfo>
<date>June 13, 2000</date>
......@@ -247,12 +247,20 @@
<listitem>
<para>
Specify the format of the output file specified.
Possible formats are <command>"text"</command> (default)
and <command>"raw"</command>.
For <command>named-checkzone</command>,
this does not cause any effects unless it dumps the zone
contents.
</para>
<para>
Possible formats are <command>"text"</command> (default)
and <command>"raw"</command> or <command>"raw=N"</comand>,
which store the zone in a binary format for rapid loading
by <command>named</command>. <command>"raw=N"</command>
specifies the format version of the raw zone file: if N
is 0, the raw file can be read by any version of
<command>named</command>; if N is 1, the file can be read
by release 9.9.0 or higher. The default is 1.
</para>
</listitem>
</varlistentry>
......
......@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: dnssec-signzone.c,v 1.282 2011/11/07 23:46:50 tbox Exp $ */
/* $Id: dnssec-signzone.c,v 1.283 2011/12/08 16:07:20 each Exp $ */
/*! \file */
......@@ -139,6 +139,7 @@ static char *tempfile = NULL;
static const dns_master_style_t *masterstyle;
static dns_masterformat_t inputformat = dns_masterformat_text;
static dns_masterformat_t outputformat = dns_masterformat_text;
static unsigned int rawversion = 1;
static unsigned int nsigned = 0, nretained = 0, ndropped = 0;
static unsigned int nverified = 0, nverifyfailed = 0;
static const char *directory = NULL, *dsdir = NULL;
......@@ -3808,18 +3809,35 @@ main(int argc, char *argv[]) {
inputformat = dns_masterformat_text;
else if (strcasecmp(inputformatstr, "raw") == 0)
inputformat = dns_masterformat_raw;
else
fatal("unknown file format: %s\n", inputformatstr);
else if (strncasecmp(inputformatstr, "raw=", 4) == 0) {
inputformat = dns_masterformat_raw;
fprintf(stderr,
"WARNING: input format version ignored\n");
} else
fatal("unknown file format: %s", inputformatstr);
}
if (outputformatstr != NULL) {
if (strcasecmp(outputformatstr, "text") == 0)
if (strcasecmp(outputformatstr, "text") == 0) {
outputformat = dns_masterformat_text;
else if (strcasecmp(outputformatstr, "raw") == 0)
outputformat = dns_masterformat_raw;
else if (strcasecmp(outputformatstr, "full") == 0) {
} else if (strcasecmp(outputformatstr, "full") == 0) {
outputformat = dns_masterformat_text;
masterstyle = &dns_master_style_full;
} else if (strcasecmp(outputformatstr, "raw") == 0) {
outputformat = dns_masterformat_raw;
} else if (strncasecmp(outputformatstr, "raw=", 4) == 0) {
outputformat = dns_masterformat_raw;
char *end;
outputformat = dns_masterformat_raw;
rawversion = strtol(outputformatstr + 4, &end, 10);
if (end == outputformatstr + 4 || *end != '\0' ||
rawversion > 1U) {
fprintf(stderr,
"unknown raw format version\n");
exit(1);
}
} else
fatal("unknown file format: %s\n", outputformatstr);
}
......@@ -4054,11 +4072,15 @@ main(int argc, char *argv[]) {
TIME_NOW(&sign_finish);
verifyzone();
if (outputformat != dns_masterformat_text) {
result = dns_master_dumptostream2(mctx, gdb, gversion,
if (outputformat == dns_masterformat_raw) {
dns_masterrawheader_t header;
dns_master_initrawheader(&header);
if (rawversion == 0U)
header.flags = DNS_MASTERRAW_COMPAT;
result = dns_master_dumptostream3(mctx, gdb, gversion,
masterstyle, outputformat,
fp);
check_result(result, "dns_master_dumptostream2");
&header, fp);
check_result(result, "dns_master_dumptostream3");
}
DESTROYLOCK(&namelock);
......
......@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
<!-- $Id: dnssec-signzone.docbook,v 1.50 2011/11/07 23:16:31 each Exp $ -->
<!-- $Id: dnssec-signzone.docbook,v 1.51 2011/12/08 16:07:20 each Exp $ -->
<refentry id="man.dnssec-signzone">
<refentryinfo>
<date>June 05, 2009</date>
......@@ -435,9 +435,15 @@
<para>
The format of the output file containing the signed zone.
Possible formats are <command>"text"</command> (default)
<command>"raw"</command>, and <command>"full"</command>,
which is text output in a format suitable for processing
by external scripts.
<command>"full"</command>, which is text output in a
format suitable for processing by external scripts,
and <command>"raw"</command> or <command>"raw=N"</command>,
which store the zone in a binary format for rapid loading
by <command>named</command>. <command>"raw=N"</command>
specifies the format version of the raw zone file: if N
is 0, the raw file can be read by any version of
<command>named</command>; if N is 1, the file can be
read by release 9.9.0 or higher. The default is 1.
</para>
</listitem>
</varlistentry>
......
......@@ -15,7 +15,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# $Id: clean.sh,v 1.45 2011/10/30 23:11:24 each Exp $
# $Id: clean.sh,v 1.46 2011/12/08 16:07:20 each Exp $
rm -f */K* */keyset-* */dsset-* */dlvset-* */signedkey-* */*.signed
rm -f */trusted.conf */managed.conf */tmp* */*.jnl */*.bk
......@@ -47,7 +47,7 @@ rm -f ns3/secure.optout.example.db
rm -f */named.secroots
rm -f ns1/managed.key.id
rm -f signer/example.db
rm -f signer/signer.out.1 signer/signer.out.2
rm -f signer/signer.out.*
rm -f ns2/algroll.db
rm -f ns3/kskonly.example.db
rm -f ns4/named.conf
......
......@@ -15,7 +15,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# $Id: tests.sh,v 1.105 2011/11/29 00:49:26 marka Exp $
# $Id: tests.sh,v 1.106 2011/12/08 16:07:20 each Exp $
SYSTEMTESTTOP=..
. $SYSTEMTESTTOP/conf.sh
......@@ -57,6 +57,22 @@ checkprivate () {
return $ret
}
# check that a zone file is raw format, version 0
israw0 () {
cat $1 | perl -e '$input = <STDIN>;
($style, $version) = unpack("NN", $input);
exit 1 if ($style != 2 || $version != 0);'
return $?
}
# check that a zone file is raw format, version 1
israw1 () {
cat $1 | perl -e '$input = <STDIN>;
($style, $version) = unpack("NN", $input);
exit 1 if ($style != 2 || $version != 1);'
return $?
}
# Check the example. domain
echo "I:checking that zone transfer worked ($n)"
......@@ -1109,11 +1125,17 @@ echo "I:checking dnssec-signzone output format ($n)"
ret=0
(
cd signer
$SIGNER -O full -f - -Sxt -o example example.db > signer.out.3 2>&1
$SIGNER -O text -f - -Sxt -o example example.db > signer.out.4 2>&1
$SIGNER -O full -f - -Sxt -o example example.db > signer.out.3 2> /dev/null
$SIGNER -O text -f - -Sxt -o example example.db > signer.out.4 2> /dev/null
$SIGNER -O raw -f signer.out.5 -Sxt -o example example.db > /dev/null 2>&1
$SIGNER -O raw=0 -f signer.out.6 -Sxt -o example example.db > /dev/null 2>&1
$SIGNER -O raw -f - -Sxt -o example example.db > signer.out.7 2> /dev/null
) || ret=1
awk '/IN *SOA/ {if (NF != 11) exit(1)}' signer/signer.out.3 || ret=1
awk '/IN *SOA/ {if (NF != 7) exit(1)}' signer/signer.out.4 || ret=1
israw1 signer/signer.out.5 || ret=1
israw0 signer/signer.out.6 || ret=1
israw1 signer/signer.out.7 || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
......
......@@ -14,10 +14,11 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# $Id: clean.sh,v 1.8 2011/10/30 22:55:12 each Exp $
# $Id: clean.sh,v 1.9 2011/12/08 16:07:20 each Exp $
rm -f named-compilezone
rm -f ns1/example.db.raw
rm -f ns1/example.db.raw*
rm -f ns1/example.db.compat
rm -f ns2/example.db
rm -f dig.out.*
rm -f */named.memstats
......
......@@ -12,6 +12,11 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# $Id: compile.sh,v 1.6 2007/06/19 23:47:04 tbox Exp $
# $Id: compile.sh,v 1.7 2011/12/08 16:07:20 each Exp $
../named-compilezone -D -F raw -o example.db.raw example example.db
../named-compilezone -D -F raw -o example.db.raw example \
example.db > /dev/null 2>&1
../named-compilezone -D -F raw=1 -o example.db.raw1 example-explicit \
example.db > /dev/null 2>&1
../named-compilezone -D -F raw=0 -o example.db.compat example-compat \
example.db > /dev/null 2>&1
......@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: named.conf,v 1.6 2011/10/26 23:46:15 tbox Exp $ */
/* $Id: named.conf,v 1.7 2011/12/08 16:07:20 each Exp $ */
// NS1
......@@ -36,6 +36,12 @@ zone "example" {
file "example.db.raw";
};
zone "compat-example" {
type master;
masterfile-format raw;
file "example.db.compat";
};
zone "transfer1" {
type master;
file "example.db";
......
......@@ -12,8 +12,9 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# $Id: setup.sh,v 1.8 2011/10/26 23:46:14 tbox Exp $
# $Id: setup.sh,v 1.9 2011/12/08 16:07:20 each Exp $
rm -f named-compilezone
ln -s $CHECKZONE named-compilezone
rm -f ns1/example.db.raw
cp ns1/example.db ns2/
......
......@@ -14,33 +14,51 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# $Id: tests.sh,v 1.7 2011/12/02 04:14:33 marka Exp $
# $Id: tests.sh,v 1.8 2011/12/08 16:07:20 each Exp $
SYSTEMTESTTOP=..
. $SYSTEMTESTTOP/conf.sh
israw () {
cat $1 | perl -e '$input = <STDIN>;
($style, $version) = unpack("NN", $input);
exit 1 if ($style != 2 || $version != 0);'
perl -e '$input = <STDIN>;
($style, $version) = unpack("NN", $input);
exit 1 if ($style != 2 || $version > 1);' < $1
return $?
}
rawversion () {
perl -e '$input = <STDIN>;
if (length($input) < 2) { print "not raw\n"; exit 0; };
($style, $version) = unpack("NN", $input);
print ($style == 2 ? "$version\n" : "not raw\n");' < $1
}
DIGOPTS="+tcp +noauth +noadd +nosea +nostat +noquest +nocomm +nocmd"
status=0
echo "I:checking that master file in the raw format worked"
echo "I:checking that master files in raw format loaded"
ret=0
for server in 1 2
do
for name in ns mx a aaaa cname dname txt rrsig nsec dnskey ds
do
$DIG $DIGOPTS $name.example. $name @10.53.0.$server -p 5300
for zone in example example-explicit example-compat; do
for server in 1 2; do
for name in ns mx a aaaa cname dname txt rrsig nsec dnskey ds; do
$DIG $DIGOPTS $name.$zone. $name @10.53.0.$server -p 5300
echo
done > dig.out.$server
done > dig.out.$zone.$server
done
$PERL ../digcomp.pl dig.out.$zone.1 dig.out.$zone.2 || ret=1
done
$PERL ../digcomp.pl dig.out.1 dig.out.2 || ret=1
[ $ret -eq 0 ] || echo "I:failed"
status=`expr $status + $ret`
echo "I:checking raw format versions"
ret=0
israw ns1/example.db.raw || ret=1
israw ns1/example.db.raw1 || ret=1
israw ns1/example.db.compat || ret=1
[ "`rawversion ns1/example.db.raw`" = 1 ] || ret=1
[ "`rawversion ns1/example.db.raw1`" = 1 ] || ret=1
[ "`rawversion ns1/example.db.compat`" = 0 ] || ret=1
[ $ret -eq 0 ] || echo "I:failed"
status=`expr $status + $ret`
......@@ -64,6 +82,7 @@ for i in 0 1 2 3 4 5 6 7 8 9
do
ret=0
israw ns2/formerly-text.db > /dev/null 2>&1 || ret=1
[ "`rawversion ns2/formerly-text.db`" = 1 ] || ret=1
[ $ret -eq 0 ] && break
sleep 1
done
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: callbacks.c,v 1.17 2007/06/19 23:47:16 tbox Exp $ */
/* $Id: callbacks.c,v 1.18 2011/12/08 16:07:20 each Exp $ */
/*! \file */
......@@ -88,6 +88,8 @@ dns_rdatacallbacks_initcommon(dns_rdatacallbacks_t *callbacks) {
REQUIRE(callbacks != NULL);
callbacks->add = NULL;
callbacks->rawdata = NULL;
callbacks->zone = NULL;
callbacks->add_private = NULL;
callbacks->error_private = NULL;
callbacks->warn_private = NULL;
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: callbacks.h,v 1.24 2007/06/19 23:47:16 tbox Exp $ */
/* $Id: callbacks.h,v 1.25 2011/12/08 16:07:21 each Exp $ */
#ifndef DNS_CALLBACKS_H
#define DNS_CALLBACKS_H 1
......@@ -41,6 +41,14 @@ struct dns_rdatacallbacks {
* dns_load_master calls this when it has rdatasets to commit.
*/
dns_addrdatasetfunc_t add;
/*%
* dns_master_load*() call this when loading a raw zonefile,
* to pass back information obtained from the file header
*/
dns_rawdatafunc_t rawdata;
dns_zone_t *zone;
/*%
* dns_load_master / dns_rdata_fromtext call this to issue a error.
*/
......
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: master.h,v 1.53 2009/07/01 23:47:36 tbox Exp $ */
/* $Id: master.h,v 1.54 2011/12/08 16:07:21 each Exp $ */
#ifndef DNS_MASTER_H
#define DNS_MASTER_H 1
......@@ -66,18 +66,29 @@ ISC_LANG_BEGINDECLS
* encoding, we directly read/write each field so that the encoded data
* is always "packed", regardless of the hardware architecture.
*/
#define DNS_RAWFORMAT_VERSION 0
#define DNS_RAWFORMAT_VERSION 1
/*
* Flags to indicate the status of the data in the raw file header
*/
#define DNS_MASTERRAW_COMPAT 0x01
#define DNS_MASTERRAW_SOURCESERIALSET 0x02
#define DNS_MASTERRAW_LASTXFRINSET 0x04
/* Common header */
typedef struct {
struct dns_masterrawheader {
isc_uint32_t format; /* must be
* dns_masterformat_raw */
isc_uint32_t version; /* compatibility for future
* extensions */
isc_uint32_t dumptime; /* timestamp on creation
* (currently unused)
*/
} dns_masterrawheader_t;
* (currently unused) */
isc_uint32_t flags; /* Flags */
isc_uint32_t sourceserial; /* Source serial number (used
* by inline-signing zones) */
isc_uint32_t lastxfrin; /* timestamp of last transfer
* (used by slave zones) */
};
/* The structure for each RRset */
typedef struct {
......@@ -302,6 +313,12 @@ dns_loadctx_cancel(dns_loadctx_t *ctx);
*\li 'ctx' to be valid
*/
void
dns_master_initrawheader(dns_masterrawheader_t *header);
/*%<
* Initializes the header for a raw master file, setting all
* values to zero.
*/
ISC_LANG_ENDDECLS
#endif /* DNS_MASTER_H */
......@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: masterdump.h,v 1.45 2011/05/26 07:56:39 marka Exp $ */
/* $Id: masterdump.h,v 1.46 2011/12/08 16:07:21 each Exp $ */
#ifndef DNS_MASTERDUMP_H
#define DNS_MASTERDUMP_H 1
......@@ -220,13 +220,25 @@ dns_master_dumptostream2(isc_mem_t *mctx, dns_db_t *db,
dns_dbversion_t *version,
const dns_master_style_t *style,
dns_masterformat_t format, FILE *f);
isc_result_t
dns_master_dumptostream3(isc_mem_t *mctx, dns_db_t *db,
dns_dbversion_t *version,
const dns_master_style_t *style,
dns_masterformat_t format,
dns_masterrawheader_t *header, FILE *f);
/*%<
* Dump the database 'db' to the steam 'f' in the specified format by
* 'format'. If the format is dns_masterformat_text (the RFC1035 format),
* 'style' specifies the file style (e.g., &dns_master_style_default).
*
* dns_master_dumptostream() is an old form of dns_master_dumptostream2(),
* which always specifies the dns_masterformat_text format.
* dns_master_dumptostream() is an old form of dns_master_dumptostream3(),
* which always specifies the dns_masterformat_text format.
* dns_master_dumptostream2() is an old form which always specifies
* a NULL header.
*
* If 'format' is dns_masterformat_raw, then 'header' can contain
* information to be written to the file header.
*
* Temporary dynamic memory may be allocated from 'mctx'.
*
......@@ -256,6 +268,13 @@ dns_master_dumpinc2(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *version,
const dns_master_style_t *style, const char *filename,
isc_task_t *task, dns_dumpdonefunc_t done, void *done_arg, dns_dumpctx_t **dctxp, dns_masterformat_t format);
isc_result_t
dns_master_dumpinc3(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *version,
const dns_master_style_t *style, const char *filename