xref: /minix3/external/bsd/bind/dist/bin/tests/zone_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: zone_test.c,v 1.8 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007, 2009, 2012, 2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1999-2002  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: zone_test.c,v 1.35 2009/09/02 23:48:01 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <sys/param.h>
25*00b67f09SDavid van Moolenbroek #include <sys/types.h>
26*00b67f09SDavid van Moolenbroek #include <sys/time.h>
27*00b67f09SDavid van Moolenbroek 
28*00b67f09SDavid van Moolenbroek #include <unistd.h>
29*00b67f09SDavid van Moolenbroek #include <stdlib.h>
30*00b67f09SDavid van Moolenbroek 
31*00b67f09SDavid van Moolenbroek #include <isc/app.h>
32*00b67f09SDavid van Moolenbroek #include <isc/commandline.h>
33*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
34*00b67f09SDavid van Moolenbroek #include <isc/socket.h>
35*00b67f09SDavid van Moolenbroek #include <isc/string.h>
36*00b67f09SDavid van Moolenbroek #include <isc/task.h>
37*00b67f09SDavid van Moolenbroek #include <isc/timer.h>
38*00b67f09SDavid van Moolenbroek #include <isc/util.h>
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek #include <dns/db.h>
41*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
42*00b67f09SDavid van Moolenbroek #include <dns/rdataclass.h>
43*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
44*00b67f09SDavid van Moolenbroek #include <dns/result.h>
45*00b67f09SDavid van Moolenbroek #include <dns/zone.h>
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_NEEDSYSSELECTH
48*00b67f09SDavid van Moolenbroek #include <sys/select.h>
49*00b67f09SDavid van Moolenbroek #endif
50*00b67f09SDavid van Moolenbroek 
51*00b67f09SDavid van Moolenbroek static int debug = 0;
52*00b67f09SDavid van Moolenbroek static int quiet = 0;
53*00b67f09SDavid van Moolenbroek static int stats = 0;
54*00b67f09SDavid van Moolenbroek static isc_mem_t *mctx = NULL;
55*00b67f09SDavid van Moolenbroek dns_zone_t *zone = NULL;
56*00b67f09SDavid van Moolenbroek isc_taskmgr_t *taskmgr = NULL;
57*00b67f09SDavid van Moolenbroek isc_timermgr_t *timermgr = NULL;
58*00b67f09SDavid van Moolenbroek isc_socketmgr_t *socketmgr = NULL;
59*00b67f09SDavid van Moolenbroek dns_zonemgr_t *zonemgr = NULL;
60*00b67f09SDavid van Moolenbroek dns_zonetype_t zonetype = dns_zone_master;
61*00b67f09SDavid van Moolenbroek isc_sockaddr_t addr;
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek #define ERRRET(result, function) \
64*00b67f09SDavid van Moolenbroek 	do { \
65*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) { \
66*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "%s() returned %s\n", \
67*00b67f09SDavid van Moolenbroek 				function, dns_result_totext(result)); \
68*00b67f09SDavid van Moolenbroek 			return; \
69*00b67f09SDavid van Moolenbroek 		} \
70*00b67f09SDavid van Moolenbroek 	} while (/*CONSTCOND*/0)
71*00b67f09SDavid van Moolenbroek 
72*00b67f09SDavid van Moolenbroek #define ERRCONT(result, function) \
73*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) { \
74*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "%s() returned %s\n", \
75*00b67f09SDavid van Moolenbroek 				function, dns_result_totext(result)); \
76*00b67f09SDavid van Moolenbroek 			continue; \
77*00b67f09SDavid van Moolenbroek 		} else \
78*00b67f09SDavid van Moolenbroek 			(void)NULL
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek static void
usage(void)81*00b67f09SDavid van Moolenbroek usage(void) {
82*00b67f09SDavid van Moolenbroek 	fprintf(stderr,
83*00b67f09SDavid van Moolenbroek 		"usage: zone_test [-dqsSM] [-c class] [-f file] zone\n");
84*00b67f09SDavid van Moolenbroek 	exit(1);
85*00b67f09SDavid van Moolenbroek }
86*00b67f09SDavid van Moolenbroek 
87*00b67f09SDavid van Moolenbroek static void
setup(const char * zonename,const char * filename,const char * classname)88*00b67f09SDavid van Moolenbroek setup(const char *zonename, const char *filename, const char *classname) {
89*00b67f09SDavid van Moolenbroek 	isc_result_t result;
90*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t rdclass;
91*00b67f09SDavid van Moolenbroek 	isc_consttextregion_t region;
92*00b67f09SDavid van Moolenbroek 	isc_buffer_t buffer;
93*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixorigin;
94*00b67f09SDavid van Moolenbroek 	dns_name_t *origin;
95*00b67f09SDavid van Moolenbroek 	const char *rbt = "rbt";
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek 	if (debug)
98*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "loading \"%s\" from \"%s\" class \"%s\"\n",
99*00b67f09SDavid van Moolenbroek 			zonename, filename, classname);
100*00b67f09SDavid van Moolenbroek 	result = dns_zone_create(&zone, mctx);
101*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_zone_new");
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek 	dns_zone_settype(zone, zonetype);
104*00b67f09SDavid van Moolenbroek 
105*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&buffer, zonename, strlen(zonename));
106*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&buffer, strlen(zonename));
107*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixorigin);
108*00b67f09SDavid van Moolenbroek 	result = dns_name_fromtext(dns_fixedname_name(&fixorigin),
109*00b67f09SDavid van Moolenbroek 				   &buffer, dns_rootname, 0, NULL);
110*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_name_fromtext");
111*00b67f09SDavid van Moolenbroek 	origin = dns_fixedname_name(&fixorigin);
112*00b67f09SDavid van Moolenbroek 
113*00b67f09SDavid van Moolenbroek 	result = dns_zone_setorigin(zone, origin);
114*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_zone_setorigin");
115*00b67f09SDavid van Moolenbroek 
116*00b67f09SDavid van Moolenbroek 	result = dns_zone_setdbtype(zone, 1, &rbt);
117*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_zone_setdatabase");
118*00b67f09SDavid van Moolenbroek 
119*00b67f09SDavid van Moolenbroek 	result = dns_zone_setfile(zone, filename);
120*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_zone_setfile");
121*00b67f09SDavid van Moolenbroek 
122*00b67f09SDavid van Moolenbroek 	region.base = classname;
123*00b67f09SDavid van Moolenbroek 	region.length = strlen(classname);
124*00b67f09SDavid van Moolenbroek 	result = dns_rdataclass_fromtext(&rdclass,
125*00b67f09SDavid van Moolenbroek 					 (isc_textregion_t *)(void*)&region);
126*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_rdataclass_fromtext");
127*00b67f09SDavid van Moolenbroek 
128*00b67f09SDavid van Moolenbroek 	dns_zone_setclass(zone, rdclass);
129*00b67f09SDavid van Moolenbroek 
130*00b67f09SDavid van Moolenbroek 	if (zonetype == dns_zone_slave)
131*00b67f09SDavid van Moolenbroek 		dns_zone_setmasters(zone, &addr, 1);
132*00b67f09SDavid van Moolenbroek 
133*00b67f09SDavid van Moolenbroek 	result = dns_zone_load(zone);
134*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_zone_load");
135*00b67f09SDavid van Moolenbroek 
136*00b67f09SDavid van Moolenbroek 	result = dns_zonemgr_managezone(zonemgr, zone);
137*00b67f09SDavid van Moolenbroek 	ERRRET(result, "dns_zonemgr_managezone");
138*00b67f09SDavid van Moolenbroek }
139*00b67f09SDavid van Moolenbroek 
140*00b67f09SDavid van Moolenbroek static void
print_rdataset(dns_name_t * name,dns_rdataset_t * rdataset)141*00b67f09SDavid van Moolenbroek print_rdataset(dns_name_t *name, dns_rdataset_t *rdataset) {
142*00b67f09SDavid van Moolenbroek 	isc_buffer_t text;
143*00b67f09SDavid van Moolenbroek 	char t[1000];
144*00b67f09SDavid van Moolenbroek 	isc_result_t result;
145*00b67f09SDavid van Moolenbroek 	isc_region_t r;
146*00b67f09SDavid van Moolenbroek 
147*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&text, t, sizeof(t));
148*00b67f09SDavid van Moolenbroek 	result = dns_rdataset_totext(rdataset, name, ISC_FALSE, ISC_FALSE,
149*00b67f09SDavid van Moolenbroek 				     &text);
150*00b67f09SDavid van Moolenbroek 	isc_buffer_usedregion(&text, &r);
151*00b67f09SDavid van Moolenbroek 	if (result == ISC_R_SUCCESS)
152*00b67f09SDavid van Moolenbroek 		printf("%.*s", (int)r.length, (char *)r.base);
153*00b67f09SDavid van Moolenbroek 	else
154*00b67f09SDavid van Moolenbroek 		printf("%s\n", dns_result_totext(result));
155*00b67f09SDavid van Moolenbroek }
156*00b67f09SDavid van Moolenbroek 
157*00b67f09SDavid van Moolenbroek static void
query(void)158*00b67f09SDavid van Moolenbroek query(void) {
159*00b67f09SDavid van Moolenbroek 	char buf[1024];
160*00b67f09SDavid van Moolenbroek 	dns_fixedname_t name;
161*00b67f09SDavid van Moolenbroek 	dns_fixedname_t found;
162*00b67f09SDavid van Moolenbroek 	dns_db_t *db;
163*00b67f09SDavid van Moolenbroek 	char *s;
164*00b67f09SDavid van Moolenbroek 	isc_buffer_t buffer;
165*00b67f09SDavid van Moolenbroek 	isc_result_t result;
166*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
167*00b67f09SDavid van Moolenbroek 	dns_rdataset_t sigset;
168*00b67f09SDavid van Moolenbroek 	fd_set rfdset;
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek 	db = NULL;
171*00b67f09SDavid van Moolenbroek 	result = dns_zone_getdb(zone, &db);
172*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS) {
173*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "%s() returned %s\n", "dns_zone_getdb",
174*00b67f09SDavid van Moolenbroek 			dns_result_totext(result));
175*00b67f09SDavid van Moolenbroek 		return;
176*00b67f09SDavid van Moolenbroek 	}
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&found);
179*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
180*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&sigset);
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 	do {
183*00b67f09SDavid van Moolenbroek 
184*00b67f09SDavid van Moolenbroek 		fprintf(stdout, "zone_test ");
185*00b67f09SDavid van Moolenbroek 		fflush(stdout);
186*00b67f09SDavid van Moolenbroek 		FD_ZERO(&rfdset);
187*00b67f09SDavid van Moolenbroek 		FD_SET(0, &rfdset);
188*00b67f09SDavid van Moolenbroek 		select(1, &rfdset, NULL, NULL, NULL);
189*00b67f09SDavid van Moolenbroek 		if (fgets(buf, sizeof(buf), stdin) == NULL) {
190*00b67f09SDavid van Moolenbroek 			fprintf(stdout, "\n");
191*00b67f09SDavid van Moolenbroek 			break;
192*00b67f09SDavid van Moolenbroek 		}
193*00b67f09SDavid van Moolenbroek 		buf[sizeof(buf) - 1] = '\0';
194*00b67f09SDavid van Moolenbroek 
195*00b67f09SDavid van Moolenbroek 		s = strchr(buf, '\n');
196*00b67f09SDavid van Moolenbroek 		if (s != NULL)
197*00b67f09SDavid van Moolenbroek 			*s = '\0';
198*00b67f09SDavid van Moolenbroek 		s = strchr(buf, '\r');
199*00b67f09SDavid van Moolenbroek 		if (s != NULL)
200*00b67f09SDavid van Moolenbroek 			*s = '\0';
201*00b67f09SDavid van Moolenbroek 		if (strcmp(buf, "dump") == 0) {
202*00b67f09SDavid van Moolenbroek 			dns_zone_dumptostream(zone, stdout);
203*00b67f09SDavid van Moolenbroek 			continue;
204*00b67f09SDavid van Moolenbroek 		}
205*00b67f09SDavid van Moolenbroek 		if (strlen(buf) == 0U)
206*00b67f09SDavid van Moolenbroek 			continue;
207*00b67f09SDavid van Moolenbroek 		dns_fixedname_init(&name);
208*00b67f09SDavid van Moolenbroek 		isc_buffer_init(&buffer, buf, strlen(buf));
209*00b67f09SDavid van Moolenbroek 		isc_buffer_add(&buffer, strlen(buf));
210*00b67f09SDavid van Moolenbroek 		result = dns_name_fromtext(dns_fixedname_name(&name),
211*00b67f09SDavid van Moolenbroek 				  &buffer, dns_rootname, 0, NULL);
212*00b67f09SDavid van Moolenbroek 		ERRCONT(result, "dns_name_fromtext");
213*00b67f09SDavid van Moolenbroek 
214*00b67f09SDavid van Moolenbroek 		result = dns_db_find(db, dns_fixedname_name(&name),
215*00b67f09SDavid van Moolenbroek 				     NULL /*vesion*/,
216*00b67f09SDavid van Moolenbroek 				     dns_rdatatype_a,
217*00b67f09SDavid van Moolenbroek 				     0 /*options*/,
218*00b67f09SDavid van Moolenbroek 				     0 /*time*/,
219*00b67f09SDavid van Moolenbroek 				     NULL /*nodep*/,
220*00b67f09SDavid van Moolenbroek 				     dns_fixedname_name(&found),
221*00b67f09SDavid van Moolenbroek 				     &rdataset, &sigset);
222*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "%s() returned %s\n", "dns_db_find",
223*00b67f09SDavid van Moolenbroek 			dns_result_totext(result));
224*00b67f09SDavid van Moolenbroek 		switch (result) {
225*00b67f09SDavid van Moolenbroek 		case DNS_R_DELEGATION:
226*00b67f09SDavid van Moolenbroek 			print_rdataset(dns_fixedname_name(&found), &rdataset);
227*00b67f09SDavid van Moolenbroek 			break;
228*00b67f09SDavid van Moolenbroek 		case ISC_R_SUCCESS:
229*00b67f09SDavid van Moolenbroek 			print_rdataset(dns_fixedname_name(&name), &rdataset);
230*00b67f09SDavid van Moolenbroek 			break;
231*00b67f09SDavid van Moolenbroek 		default:
232*00b67f09SDavid van Moolenbroek 			break;
233*00b67f09SDavid van Moolenbroek 		}
234*00b67f09SDavid van Moolenbroek 
235*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&rdataset))
236*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&rdataset);
237*00b67f09SDavid van Moolenbroek 		if (dns_rdataset_isassociated(&sigset))
238*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&sigset);
239*00b67f09SDavid van Moolenbroek 	} while (1);
240*00b67f09SDavid van Moolenbroek 	dns_rdataset_invalidate(&rdataset);
241*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
242*00b67f09SDavid van Moolenbroek }
243*00b67f09SDavid van Moolenbroek 
244*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)245*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
246*00b67f09SDavid van Moolenbroek 	int c;
247*00b67f09SDavid van Moolenbroek 	char *filename = NULL;
248*00b67f09SDavid van Moolenbroek 	const char *classname = "IN";
249*00b67f09SDavid van Moolenbroek 
250*00b67f09SDavid van Moolenbroek 	while ((c = isc_commandline_parse(argc, argv, "cdf:m:qsMS")) != EOF) {
251*00b67f09SDavid van Moolenbroek 		switch (c) {
252*00b67f09SDavid van Moolenbroek 		case 'c':
253*00b67f09SDavid van Moolenbroek 			classname = isc_commandline_argument;
254*00b67f09SDavid van Moolenbroek 			break;
255*00b67f09SDavid van Moolenbroek 		case 'd':
256*00b67f09SDavid van Moolenbroek 			debug++;
257*00b67f09SDavid van Moolenbroek 			break;
258*00b67f09SDavid van Moolenbroek 		case 'f':
259*00b67f09SDavid van Moolenbroek 			if (filename != NULL)
260*00b67f09SDavid van Moolenbroek 				usage();
261*00b67f09SDavid van Moolenbroek 			filename = isc_commandline_argument;
262*00b67f09SDavid van Moolenbroek 			break;
263*00b67f09SDavid van Moolenbroek 		case 'm':
264*00b67f09SDavid van Moolenbroek 			memset(&addr, 0, sizeof(addr));
265*00b67f09SDavid van Moolenbroek 			addr.type.sin.sin_family = AF_INET;
266*00b67f09SDavid van Moolenbroek 			if (inet_pton(AF_INET, isc_commandline_argument,
267*00b67f09SDavid van Moolenbroek 				      &addr.type.sin.sin_addr) != 1) {
268*00b67f09SDavid van Moolenbroek 				fprintf(stderr, "bad master address '%s'\n",
269*00b67f09SDavid van Moolenbroek 					isc_commandline_argument);
270*00b67f09SDavid van Moolenbroek 				exit(1);
271*00b67f09SDavid van Moolenbroek 			}
272*00b67f09SDavid van Moolenbroek 			addr.type.sin.sin_port = htons(53);
273*00b67f09SDavid van Moolenbroek 			break;
274*00b67f09SDavid van Moolenbroek 		case 'q':
275*00b67f09SDavid van Moolenbroek 			quiet++;
276*00b67f09SDavid van Moolenbroek 			break;
277*00b67f09SDavid van Moolenbroek 		case 's':
278*00b67f09SDavid van Moolenbroek 			stats++;
279*00b67f09SDavid van Moolenbroek 			break;
280*00b67f09SDavid van Moolenbroek 		case 'S':
281*00b67f09SDavid van Moolenbroek 			zonetype = dns_zone_slave;
282*00b67f09SDavid van Moolenbroek 			break;
283*00b67f09SDavid van Moolenbroek 		case 'M':
284*00b67f09SDavid van Moolenbroek 			zonetype = dns_zone_master;
285*00b67f09SDavid van Moolenbroek 			break;
286*00b67f09SDavid van Moolenbroek 		default:
287*00b67f09SDavid van Moolenbroek 			usage();
288*00b67f09SDavid van Moolenbroek 		}
289*00b67f09SDavid van Moolenbroek 	}
290*00b67f09SDavid van Moolenbroek 
291*00b67f09SDavid van Moolenbroek 	if (argv[isc_commandline_index] == NULL)
292*00b67f09SDavid van Moolenbroek 		usage();
293*00b67f09SDavid van Moolenbroek 
294*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_app_start() == ISC_R_SUCCESS);
295*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
296*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_taskmgr_create(mctx, 2, 0, &taskmgr) ==
297*00b67f09SDavid van Moolenbroek 		      ISC_R_SUCCESS);
298*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_timermgr_create(mctx, &timermgr) == ISC_R_SUCCESS);
299*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_socketmgr_create(mctx, &socketmgr) == ISC_R_SUCCESS);
300*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(dns_zonemgr_create(mctx, taskmgr, timermgr, socketmgr,
301*00b67f09SDavid van Moolenbroek 					 &zonemgr) == ISC_R_SUCCESS);
302*00b67f09SDavid van Moolenbroek 	if (filename == NULL)
303*00b67f09SDavid van Moolenbroek 		filename = argv[isc_commandline_index];
304*00b67f09SDavid van Moolenbroek 	setup(argv[isc_commandline_index], filename, classname);
305*00b67f09SDavid van Moolenbroek 	query();
306*00b67f09SDavid van Moolenbroek 	if (zone != NULL)
307*00b67f09SDavid van Moolenbroek 		dns_zone_detach(&zone);
308*00b67f09SDavid van Moolenbroek 	dns_zonemgr_shutdown(zonemgr);
309*00b67f09SDavid van Moolenbroek 	dns_zonemgr_detach(&zonemgr);
310*00b67f09SDavid van Moolenbroek 	isc_socketmgr_destroy(&socketmgr);
311*00b67f09SDavid van Moolenbroek 	isc_taskmgr_destroy(&taskmgr);
312*00b67f09SDavid van Moolenbroek 	isc_timermgr_destroy(&timermgr);
313*00b67f09SDavid van Moolenbroek 	if (!quiet && stats)
314*00b67f09SDavid van Moolenbroek 		isc_mem_stats(mctx, stdout);
315*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
316*00b67f09SDavid van Moolenbroek 
317*00b67f09SDavid van Moolenbroek 	return (0);
318*00b67f09SDavid van Moolenbroek }
319