xref: /minix3/external/bsd/bind/dist/contrib/sdb/pgsql/zonetodb.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: zonetodb.c,v 1.4 2014/12/10 04:37:57 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007-2009, 2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 2000-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: zonetodb.c,v 1.23 2009/09/02 23:48:01 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <stdlib.h>
23*00b67f09SDavid van Moolenbroek #include <string.h>
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
26*00b67f09SDavid van Moolenbroek #include <isc/entropy.h>
27*00b67f09SDavid van Moolenbroek #include <isc/hash.h>
28*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
29*00b67f09SDavid van Moolenbroek #include <isc/print.h>
30*00b67f09SDavid van Moolenbroek #include <isc/result.h>
31*00b67f09SDavid van Moolenbroek 
32*00b67f09SDavid van Moolenbroek #include <dns/db.h>
33*00b67f09SDavid van Moolenbroek #include <dns/dbiterator.h>
34*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
35*00b67f09SDavid van Moolenbroek #include <dns/name.h>
36*00b67f09SDavid van Moolenbroek #include <dns/rdata.h>
37*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
38*00b67f09SDavid van Moolenbroek #include <dns/rdatasetiter.h>
39*00b67f09SDavid van Moolenbroek #include <dns/rdatatype.h>
40*00b67f09SDavid van Moolenbroek #include <dns/result.h>
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek #include <pgsql/libpq-fe.h>
43*00b67f09SDavid van Moolenbroek 
44*00b67f09SDavid van Moolenbroek /*
45*00b67f09SDavid van Moolenbroek  * Generate a PostgreSQL table from a zone.
46*00b67f09SDavid van Moolenbroek  *
47*00b67f09SDavid van Moolenbroek  * This is compiled this with something like the following (assuming bind9 has
48*00b67f09SDavid van Moolenbroek  * been installed):
49*00b67f09SDavid van Moolenbroek  *
50*00b67f09SDavid van Moolenbroek  * gcc -g `isc-config.sh --cflags isc dns` -c zonetodb.c
51*00b67f09SDavid van Moolenbroek  * gcc -g -o zonetodb zonetodb.o `isc-config.sh --libs isc dns` -lpq
52*00b67f09SDavid van Moolenbroek  */
53*00b67f09SDavid van Moolenbroek 
54*00b67f09SDavid van Moolenbroek PGconn *conn = NULL;
55*00b67f09SDavid van Moolenbroek char *dbname, *dbtable;
56*00b67f09SDavid van Moolenbroek char str[10240];
57*00b67f09SDavid van Moolenbroek 
58*00b67f09SDavid van Moolenbroek void
closeandexit(int status)59*00b67f09SDavid van Moolenbroek closeandexit(int status) {
60*00b67f09SDavid van Moolenbroek 	if (conn != NULL)
61*00b67f09SDavid van Moolenbroek 		PQfinish(conn);
62*00b67f09SDavid van Moolenbroek 	exit(status);
63*00b67f09SDavid van Moolenbroek }
64*00b67f09SDavid van Moolenbroek 
65*00b67f09SDavid van Moolenbroek void
check_result(isc_result_t result,const char * message)66*00b67f09SDavid van Moolenbroek check_result(isc_result_t result, const char *message) {
67*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS) {
68*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "%s: %s\n", message,
69*00b67f09SDavid van Moolenbroek 			isc_result_totext(result));
70*00b67f09SDavid van Moolenbroek 		closeandexit(1);
71*00b67f09SDavid van Moolenbroek 	}
72*00b67f09SDavid van Moolenbroek }
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek /*
75*00b67f09SDavid van Moolenbroek  * Canonicalize a string before writing it to the database.
76*00b67f09SDavid van Moolenbroek  * "dest" must be an array of at least size 2*strlen(source) + 1.
77*00b67f09SDavid van Moolenbroek  */
78*00b67f09SDavid van Moolenbroek static void
quotestring(const unsigned char * source,unsigned char * dest)79*00b67f09SDavid van Moolenbroek quotestring(const unsigned char *source, unsigned char *dest) {
80*00b67f09SDavid van Moolenbroek 	while (*source != 0) {
81*00b67f09SDavid van Moolenbroek 		if (*source == '\'')
82*00b67f09SDavid van Moolenbroek 			*dest++ = '\'';
83*00b67f09SDavid van Moolenbroek 		else if (*source == '\\')
84*00b67f09SDavid van Moolenbroek 			*dest++ = '\\';
85*00b67f09SDavid van Moolenbroek 		*dest++ = *source++;
86*00b67f09SDavid van Moolenbroek 	}
87*00b67f09SDavid van Moolenbroek 	*dest++ = 0;
88*00b67f09SDavid van Moolenbroek }
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek void
addrdata(dns_name_t * name,dns_ttl_t ttl,dns_rdata_t * rdata)91*00b67f09SDavid van Moolenbroek addrdata(dns_name_t *name, dns_ttl_t ttl, dns_rdata_t *rdata) {
92*00b67f09SDavid van Moolenbroek 	unsigned char namearray[DNS_NAME_MAXTEXT + 1];
93*00b67f09SDavid van Moolenbroek 	unsigned char canonnamearray[2 * DNS_NAME_MAXTEXT + 1];
94*00b67f09SDavid van Moolenbroek 	unsigned char typearray[20];
95*00b67f09SDavid van Moolenbroek 	unsigned char canontypearray[40];
96*00b67f09SDavid van Moolenbroek 	unsigned char dataarray[2048];
97*00b67f09SDavid van Moolenbroek 	unsigned char canondataarray[4096];
98*00b67f09SDavid van Moolenbroek 	isc_buffer_t b;
99*00b67f09SDavid van Moolenbroek 	isc_result_t result;
100*00b67f09SDavid van Moolenbroek 	PGresult *res;
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&b, namearray, sizeof(namearray) - 1);
103*00b67f09SDavid van Moolenbroek 	result = dns_name_totext(name, ISC_TRUE, &b);
104*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_name_totext");
105*00b67f09SDavid van Moolenbroek 	namearray[isc_buffer_usedlength(&b)] = 0;
106*00b67f09SDavid van Moolenbroek 	quotestring((const unsigned char *)namearray, canonnamearray);
107*00b67f09SDavid van Moolenbroek 
108*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&b, typearray, sizeof(typearray) - 1);
109*00b67f09SDavid van Moolenbroek 	result = dns_rdatatype_totext(rdata->type, &b);
110*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_rdatatype_totext");
111*00b67f09SDavid van Moolenbroek 	typearray[isc_buffer_usedlength(&b)] = 0;
112*00b67f09SDavid van Moolenbroek 	quotestring((const unsigned char *)typearray, canontypearray);
113*00b67f09SDavid van Moolenbroek 
114*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&b, dataarray, sizeof(dataarray) - 1);
115*00b67f09SDavid van Moolenbroek 	result = dns_rdata_totext(rdata, NULL, &b);
116*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_rdata_totext");
117*00b67f09SDavid van Moolenbroek 	dataarray[isc_buffer_usedlength(&b)] = 0;
118*00b67f09SDavid van Moolenbroek 	quotestring((const unsigned char *)dataarray, canondataarray);
119*00b67f09SDavid van Moolenbroek 
120*00b67f09SDavid van Moolenbroek 	snprintf(str, sizeof(str),
121*00b67f09SDavid van Moolenbroek 		 "INSERT INTO %s (NAME, TTL, RDTYPE, RDATA)"
122*00b67f09SDavid van Moolenbroek 		 " VALUES ('%s', %d, '%s', '%s')",
123*00b67f09SDavid van Moolenbroek 		 dbtable, canonnamearray, ttl, canontypearray, canondataarray);
124*00b67f09SDavid van Moolenbroek 	printf("%s\n", str);
125*00b67f09SDavid van Moolenbroek 	res = PQexec(conn, str);
126*00b67f09SDavid van Moolenbroek 	if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
127*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "INSERT INTO command failed: %s\n",
128*00b67f09SDavid van Moolenbroek 			PQresultErrorMessage(res));
129*00b67f09SDavid van Moolenbroek 		PQclear(res);
130*00b67f09SDavid van Moolenbroek 		closeandexit(1);
131*00b67f09SDavid van Moolenbroek 	}
132*00b67f09SDavid van Moolenbroek 	PQclear(res);
133*00b67f09SDavid van Moolenbroek }
134*00b67f09SDavid van Moolenbroek 
135*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)136*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
137*00b67f09SDavid van Moolenbroek 	char *porigin, *zonefile;
138*00b67f09SDavid van Moolenbroek 	dns_fixedname_t forigin, fname;
139*00b67f09SDavid van Moolenbroek 	dns_name_t *origin, *name;
140*00b67f09SDavid van Moolenbroek 	dns_db_t *db = NULL;
141*00b67f09SDavid van Moolenbroek 	dns_dbiterator_t *dbiter;
142*00b67f09SDavid van Moolenbroek 	dns_dbnode_t *node;
143*00b67f09SDavid van Moolenbroek 	dns_rdatasetiter_t *rdsiter;
144*00b67f09SDavid van Moolenbroek 	dns_rdataset_t rdataset;
145*00b67f09SDavid van Moolenbroek 	dns_rdata_t rdata = DNS_RDATA_INIT;
146*00b67f09SDavid van Moolenbroek 	isc_mem_t *mctx = NULL;
147*00b67f09SDavid van Moolenbroek 	isc_entropy_t *ectx = NULL;
148*00b67f09SDavid van Moolenbroek 	isc_buffer_t b;
149*00b67f09SDavid van Moolenbroek 	isc_result_t result;
150*00b67f09SDavid van Moolenbroek 	PGresult *res;
151*00b67f09SDavid van Moolenbroek 
152*00b67f09SDavid van Moolenbroek 	if (argc != 5) {
153*00b67f09SDavid van Moolenbroek 		printf("usage: %s origin file dbname dbtable\n", argv[0]);
154*00b67f09SDavid van Moolenbroek 		printf("Note that dbname must be an existing database.\n");
155*00b67f09SDavid van Moolenbroek 		exit(1);
156*00b67f09SDavid van Moolenbroek 	}
157*00b67f09SDavid van Moolenbroek 
158*00b67f09SDavid van Moolenbroek 	porigin = argv[1];
159*00b67f09SDavid van Moolenbroek 	zonefile = argv[2];
160*00b67f09SDavid van Moolenbroek 	dbname = argv[3];
161*00b67f09SDavid van Moolenbroek 	dbtable = argv[4];
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek 	dns_result_register();
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek 	mctx = NULL;
166*00b67f09SDavid van Moolenbroek 	result = isc_mem_create(0, 0, &mctx);
167*00b67f09SDavid van Moolenbroek 	check_result(result, "isc_mem_create");
168*00b67f09SDavid van Moolenbroek 
169*00b67f09SDavid van Moolenbroek 	result = isc_entropy_create(mctx, &ectx);
170*00b67f09SDavid van Moolenbroek 	check_result(result, "isc_entropy_create");
171*00b67f09SDavid van Moolenbroek 
172*00b67f09SDavid van Moolenbroek 	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
173*00b67f09SDavid van Moolenbroek 	check_result(result, "isc_hash_create");
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&b, porigin, strlen(porigin));
176*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&b, strlen(porigin));
177*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&forigin);
178*00b67f09SDavid van Moolenbroek 	origin = dns_fixedname_name(&forigin);
179*00b67f09SDavid van Moolenbroek 	result = dns_name_fromtext(origin, &b, dns_rootname, 0, NULL);
180*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_name_fromtext");
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek 	db = NULL;
183*00b67f09SDavid van Moolenbroek 	result = dns_db_create(mctx, "rbt", origin, dns_dbtype_zone,
184*00b67f09SDavid van Moolenbroek 			       dns_rdataclass_in, 0, NULL, &db);
185*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_db_create");
186*00b67f09SDavid van Moolenbroek 
187*00b67f09SDavid van Moolenbroek 	result = dns_db_load(db, zonefile);
188*00b67f09SDavid van Moolenbroek 	if (result == DNS_R_SEENINCLUDE)
189*00b67f09SDavid van Moolenbroek 		result = ISC_R_SUCCESS;
190*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_db_load");
191*00b67f09SDavid van Moolenbroek 
192*00b67f09SDavid van Moolenbroek 	printf("Connecting to '%s'\n", dbname);
193*00b67f09SDavid van Moolenbroek 	conn = PQsetdb(NULL, NULL, NULL, NULL, dbname);
194*00b67f09SDavid van Moolenbroek 	if (PQstatus(conn) == CONNECTION_BAD) {
195*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "Connection to database '%s' failed: %s\n",
196*00b67f09SDavid van Moolenbroek 			dbname, PQerrorMessage(conn));
197*00b67f09SDavid van Moolenbroek 		closeandexit(1);
198*00b67f09SDavid van Moolenbroek 	}
199*00b67f09SDavid van Moolenbroek 
200*00b67f09SDavid van Moolenbroek 	snprintf(str, sizeof(str),
201*00b67f09SDavid van Moolenbroek 		 "DROP TABLE %s", dbtable);
202*00b67f09SDavid van Moolenbroek 	printf("%s\n", str);
203*00b67f09SDavid van Moolenbroek 	res = PQexec(conn, str);
204*00b67f09SDavid van Moolenbroek 	if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
205*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "DROP TABLE command failed: %s\n",
206*00b67f09SDavid van Moolenbroek 			PQresultErrorMessage(res));
207*00b67f09SDavid van Moolenbroek 	PQclear(res);
208*00b67f09SDavid van Moolenbroek 
209*00b67f09SDavid van Moolenbroek 	snprintf(str, sizeof(str), "BEGIN");
210*00b67f09SDavid van Moolenbroek 	printf("%s\n", str);
211*00b67f09SDavid van Moolenbroek 	res = PQexec(conn, str);
212*00b67f09SDavid van Moolenbroek 	if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
213*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "BEGIN command failed: %s\n",
214*00b67f09SDavid van Moolenbroek 			PQresultErrorMessage(res));
215*00b67f09SDavid van Moolenbroek 		PQclear(res);
216*00b67f09SDavid van Moolenbroek 		closeandexit(1);
217*00b67f09SDavid van Moolenbroek 	}
218*00b67f09SDavid van Moolenbroek 	PQclear(res);
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek 	snprintf(str, sizeof(str),
221*00b67f09SDavid van Moolenbroek 		 "CREATE TABLE %s "
222*00b67f09SDavid van Moolenbroek 		 "(NAME TEXT, TTL INTEGER, RDTYPE TEXT, RDATA TEXT)",
223*00b67f09SDavid van Moolenbroek 		 dbtable);
224*00b67f09SDavid van Moolenbroek 	printf("%s\n", str);
225*00b67f09SDavid van Moolenbroek 	res = PQexec(conn, str);
226*00b67f09SDavid van Moolenbroek 	if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
227*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "CREATE TABLE command failed: %s\n",
228*00b67f09SDavid van Moolenbroek 			PQresultErrorMessage(res));
229*00b67f09SDavid van Moolenbroek 		PQclear(res);
230*00b67f09SDavid van Moolenbroek 		closeandexit(1);
231*00b67f09SDavid van Moolenbroek 	}
232*00b67f09SDavid van Moolenbroek 	PQclear(res);
233*00b67f09SDavid van Moolenbroek 
234*00b67f09SDavid van Moolenbroek 	dbiter = NULL;
235*00b67f09SDavid van Moolenbroek 	result = dns_db_createiterator(db, 0, &dbiter);
236*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_db_createiterator()");
237*00b67f09SDavid van Moolenbroek 
238*00b67f09SDavid van Moolenbroek 	result = dns_dbiterator_first(dbiter);
239*00b67f09SDavid van Moolenbroek 	check_result(result, "dns_dbiterator_first");
240*00b67f09SDavid van Moolenbroek 
241*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fname);
242*00b67f09SDavid van Moolenbroek 	name = dns_fixedname_name(&fname);
243*00b67f09SDavid van Moolenbroek 	dns_rdataset_init(&rdataset);
244*00b67f09SDavid van Moolenbroek 	dns_rdata_init(&rdata);
245*00b67f09SDavid van Moolenbroek 
246*00b67f09SDavid van Moolenbroek 	while (result == ISC_R_SUCCESS) {
247*00b67f09SDavid van Moolenbroek 		node = NULL;
248*00b67f09SDavid van Moolenbroek 		result = dns_dbiterator_current(dbiter, &node, name);
249*00b67f09SDavid van Moolenbroek 		if (result == ISC_R_NOMORE)
250*00b67f09SDavid van Moolenbroek 			break;
251*00b67f09SDavid van Moolenbroek 		check_result(result, "dns_dbiterator_current");
252*00b67f09SDavid van Moolenbroek 
253*00b67f09SDavid van Moolenbroek 		rdsiter = NULL;
254*00b67f09SDavid van Moolenbroek 		result = dns_db_allrdatasets(db, node, NULL, 0, &rdsiter);
255*00b67f09SDavid van Moolenbroek 		check_result(result, "dns_db_allrdatasets");
256*00b67f09SDavid van Moolenbroek 
257*00b67f09SDavid van Moolenbroek 		result = dns_rdatasetiter_first(rdsiter);
258*00b67f09SDavid van Moolenbroek 
259*00b67f09SDavid van Moolenbroek 		while (result == ISC_R_SUCCESS) {
260*00b67f09SDavid van Moolenbroek 			dns_rdatasetiter_current(rdsiter, &rdataset);
261*00b67f09SDavid van Moolenbroek 			result = dns_rdataset_first(&rdataset);
262*00b67f09SDavid van Moolenbroek 			check_result(result, "dns_rdataset_first");
263*00b67f09SDavid van Moolenbroek 			while (result == ISC_R_SUCCESS) {
264*00b67f09SDavid van Moolenbroek 				dns_rdataset_current(&rdataset, &rdata);
265*00b67f09SDavid van Moolenbroek 				addrdata(name, rdataset.ttl, &rdata);
266*00b67f09SDavid van Moolenbroek 				dns_rdata_reset(&rdata);
267*00b67f09SDavid van Moolenbroek 				result = dns_rdataset_next(&rdataset);
268*00b67f09SDavid van Moolenbroek 			}
269*00b67f09SDavid van Moolenbroek 			dns_rdataset_disassociate(&rdataset);
270*00b67f09SDavid van Moolenbroek 			result = dns_rdatasetiter_next(rdsiter);
271*00b67f09SDavid van Moolenbroek 		}
272*00b67f09SDavid van Moolenbroek 		dns_rdatasetiter_destroy(&rdsiter);
273*00b67f09SDavid van Moolenbroek 		dns_db_detachnode(db, &node);
274*00b67f09SDavid van Moolenbroek 		result = dns_dbiterator_next(dbiter);
275*00b67f09SDavid van Moolenbroek 	}
276*00b67f09SDavid van Moolenbroek 
277*00b67f09SDavid van Moolenbroek 	snprintf(str, sizeof(str), "COMMIT TRANSACTION");
278*00b67f09SDavid van Moolenbroek 	printf("%s\n", str);
279*00b67f09SDavid van Moolenbroek 	res = PQexec(conn, str);
280*00b67f09SDavid van Moolenbroek 	if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) {
281*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "COMMIT command failed: %s\n",
282*00b67f09SDavid van Moolenbroek 			PQresultErrorMessage(res));
283*00b67f09SDavid van Moolenbroek 		PQclear(res);
284*00b67f09SDavid van Moolenbroek 		closeandexit(1);
285*00b67f09SDavid van Moolenbroek 	}
286*00b67f09SDavid van Moolenbroek 	PQclear(res);
287*00b67f09SDavid van Moolenbroek 	dns_dbiterator_destroy(&dbiter);
288*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
289*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
290*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
291*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
292*00b67f09SDavid van Moolenbroek 	closeandexit(0);
293*00b67f09SDavid van Moolenbroek 	exit(0);
294*00b67f09SDavid van Moolenbroek }
295