1*00b67f09SDavid van Moolenbroek /*	$NetBSD: named-rrchecker.c,v 1.1.1.3 2014/12/10 03:34:31 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2013  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek #include <config.h>
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek #include <stdlib.h>
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
24*00b67f09SDavid van Moolenbroek #include <isc/commandline.h>
25*00b67f09SDavid van Moolenbroek #include <isc/lex.h>
26*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
27*00b67f09SDavid van Moolenbroek #include <isc/string.h>
28*00b67f09SDavid van Moolenbroek #include <isc/util.h>
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
31*00b67f09SDavid van Moolenbroek #include <dns/name.h>
32*00b67f09SDavid van Moolenbroek #include <dns/rdata.h>
33*00b67f09SDavid van Moolenbroek #include <dns/rdataclass.h>
34*00b67f09SDavid van Moolenbroek #include <dns/rdatatype.h>
35*00b67f09SDavid van Moolenbroek #include <dns/result.h>
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek static isc_mem_t *mctx;
38*00b67f09SDavid van Moolenbroek static isc_lex_t *lex;
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek static isc_lexspecials_t specials;
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek static void
usage(void)43*00b67f09SDavid van Moolenbroek usage(void) {
44*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "usage: named-rrchecker [-o origin] [-hpCPT]\n");
45*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "\t-h: print this help message\n");
46*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "\t-o origin: set origin to be used when interpeting the record\n");
47*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "\t-p: print the record in cannonical format\n");
48*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "\t-C: list the supported class names\n");
49*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "\t-T: list the supported standard type names\n");
50*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "\t-P: list the supported private type names\n");
51*00b67f09SDavid van Moolenbroek }
52*00b67f09SDavid van Moolenbroek 
53*00b67f09SDavid van Moolenbroek int
main(int argc,char * argv[])54*00b67f09SDavid van Moolenbroek main(int argc, char *argv[]) {
55*00b67f09SDavid van Moolenbroek 	isc_token_t token;
56*00b67f09SDavid van Moolenbroek 	isc_result_t result;
57*00b67f09SDavid van Moolenbroek 	int c;
58*00b67f09SDavid van Moolenbroek 	unsigned int options = 0;
59*00b67f09SDavid van Moolenbroek 	dns_rdatatype_t rdtype;
60*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t rdclass;
61*00b67f09SDavid van Moolenbroek 	char text[256*1024];
62*00b67f09SDavid van Moolenbroek 	char data[64*1024];
63*00b67f09SDavid van Moolenbroek 	isc_buffer_t tbuf;
64*00b67f09SDavid van Moolenbroek 	isc_buffer_t dbuf;
65*00b67f09SDavid van Moolenbroek 	dns_rdata_t rdata = DNS_RDATA_INIT;
66*00b67f09SDavid van Moolenbroek 	isc_boolean_t doexit = ISC_FALSE;
67*00b67f09SDavid van Moolenbroek 	isc_boolean_t once = ISC_FALSE;
68*00b67f09SDavid van Moolenbroek 	isc_boolean_t print = ISC_FALSE;
69*00b67f09SDavid van Moolenbroek 	isc_boolean_t unknown = ISC_FALSE;
70*00b67f09SDavid van Moolenbroek 	unsigned int t;
71*00b67f09SDavid van Moolenbroek 	char *origin = NULL;
72*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed;
73*00b67f09SDavid van Moolenbroek 	dns_name_t *name = NULL;
74*00b67f09SDavid van Moolenbroek 
75*00b67f09SDavid van Moolenbroek 	while ((c = isc_commandline_parse(argc, argv, "ho:puCPT")) != -1) {
76*00b67f09SDavid van Moolenbroek 		switch (c) {
77*00b67f09SDavid van Moolenbroek 		case '?':
78*00b67f09SDavid van Moolenbroek 		case 'h':
79*00b67f09SDavid van Moolenbroek 			if (isc_commandline_option != '?' &&
80*00b67f09SDavid van Moolenbroek 			    isc_commandline_option != 'h')
81*00b67f09SDavid van Moolenbroek 				fprintf(stderr, "%s: invalid argument -%c\n",
82*00b67f09SDavid van Moolenbroek 					argv[0], isc_commandline_option);
83*00b67f09SDavid van Moolenbroek 			usage();
84*00b67f09SDavid van Moolenbroek 			exit(1);
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek 		case 'o':
87*00b67f09SDavid van Moolenbroek 			origin = isc_commandline_argument;
88*00b67f09SDavid van Moolenbroek 			break;
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek 		case 'p':
91*00b67f09SDavid van Moolenbroek 			print = ISC_TRUE;
92*00b67f09SDavid van Moolenbroek 			break;
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek 		case 'u':
95*00b67f09SDavid van Moolenbroek 			unknown = ISC_TRUE;
96*00b67f09SDavid van Moolenbroek 			break;
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek 		case 'C':
99*00b67f09SDavid van Moolenbroek 			for (t = 1; t <= 0xfeffu; t++) {
100*00b67f09SDavid van Moolenbroek 				if (dns_rdataclass_ismeta(t))
101*00b67f09SDavid van Moolenbroek 					continue;
102*00b67f09SDavid van Moolenbroek 				dns_rdataclass_format(t, text, sizeof(text));
103*00b67f09SDavid van Moolenbroek 				if (strncmp(text, "CLASS", 4) != 0)
104*00b67f09SDavid van Moolenbroek 					fprintf(stdout, "%s\n", text);
105*00b67f09SDavid van Moolenbroek 			}
106*00b67f09SDavid van Moolenbroek 			exit(0);
107*00b67f09SDavid van Moolenbroek 
108*00b67f09SDavid van Moolenbroek 		case 'P':
109*00b67f09SDavid van Moolenbroek 			for (t = 0xff00; t <= 0xfffeu; t++) {
110*00b67f09SDavid van Moolenbroek 				if (dns_rdatatype_ismeta(t))
111*00b67f09SDavid van Moolenbroek 					continue;
112*00b67f09SDavid van Moolenbroek 				dns_rdatatype_format(t, text, sizeof(text));
113*00b67f09SDavid van Moolenbroek 				if (strncmp(text, "TYPE", 4) != 0)
114*00b67f09SDavid van Moolenbroek 					fprintf(stdout, "%s\n", text);
115*00b67f09SDavid van Moolenbroek 			}
116*00b67f09SDavid van Moolenbroek 			doexit = ISC_TRUE;
117*00b67f09SDavid van Moolenbroek 			break;
118*00b67f09SDavid van Moolenbroek 
119*00b67f09SDavid van Moolenbroek 		case 'T':
120*00b67f09SDavid van Moolenbroek 			for (t = 1; t <= 0xfeffu; t++) {
121*00b67f09SDavid van Moolenbroek 				if (dns_rdatatype_ismeta(t))
122*00b67f09SDavid van Moolenbroek 					continue;
123*00b67f09SDavid van Moolenbroek 				dns_rdatatype_format(t, text, sizeof(text));
124*00b67f09SDavid van Moolenbroek 				if (strncmp(text, "TYPE", 4) != 0)
125*00b67f09SDavid van Moolenbroek 					fprintf(stdout, "%s\n", text);
126*00b67f09SDavid van Moolenbroek 			}
127*00b67f09SDavid van Moolenbroek 			doexit = ISC_TRUE;
128*00b67f09SDavid van Moolenbroek 			break;
129*00b67f09SDavid van Moolenbroek 		}
130*00b67f09SDavid van Moolenbroek 	}
131*00b67f09SDavid van Moolenbroek 	if (doexit)
132*00b67f09SDavid van Moolenbroek 		exit(0);
133*00b67f09SDavid van Moolenbroek 
134*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
135*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_lex_create(mctx, 256, &lex) == ISC_R_SUCCESS);
136*00b67f09SDavid van Moolenbroek 
137*00b67f09SDavid van Moolenbroek 	/*
138*00b67f09SDavid van Moolenbroek 	 * Set up to lex DNS master file.
139*00b67f09SDavid van Moolenbroek 	 */
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek 	specials['('] = 1;
142*00b67f09SDavid van Moolenbroek 	specials[')'] = 1;
143*00b67f09SDavid van Moolenbroek 	specials['"'] = 1;
144*00b67f09SDavid van Moolenbroek 	isc_lex_setspecials(lex, specials);
145*00b67f09SDavid van Moolenbroek 	options = ISC_LEXOPT_EOL;
146*00b67f09SDavid van Moolenbroek 	isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE);
147*00b67f09SDavid van Moolenbroek 
148*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_lex_openstream(lex, stdin) == ISC_R_SUCCESS);
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek 	if (origin != NULL) {
151*00b67f09SDavid van Moolenbroek 		dns_fixedname_init(&fixed);
152*00b67f09SDavid van Moolenbroek 		name = dns_fixedname_name(&fixed);
153*00b67f09SDavid van Moolenbroek 		result = dns_name_fromstring(name, origin, 0, NULL);
154*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) {
155*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "dns_name_fromstring: %s\n",
156*00b67f09SDavid van Moolenbroek 				dns_result_totext(result));
157*00b67f09SDavid van Moolenbroek 			fflush(stderr);
158*00b67f09SDavid van Moolenbroek 			exit(1);
159*00b67f09SDavid van Moolenbroek 		}
160*00b67f09SDavid van Moolenbroek 	}
161*00b67f09SDavid van Moolenbroek 
162*00b67f09SDavid van Moolenbroek 	while ((result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER,
163*00b67f09SDavid van Moolenbroek 					  &token)) == ISC_R_SUCCESS) {
164*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_eof)
165*00b67f09SDavid van Moolenbroek 			break;
166*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_eol)
167*00b67f09SDavid van Moolenbroek 			continue;
168*00b67f09SDavid van Moolenbroek 		if (once) {
169*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "extra data\n");
170*00b67f09SDavid van Moolenbroek 			exit(1);
171*00b67f09SDavid van Moolenbroek 		}
172*00b67f09SDavid van Moolenbroek 		/*
173*00b67f09SDavid van Moolenbroek 		 * Get class.
174*00b67f09SDavid van Moolenbroek 		 */
175*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_number) {
176*00b67f09SDavid van Moolenbroek 			rdclass = (dns_rdataclass_t) token.value.as_ulong;
177*00b67f09SDavid van Moolenbroek 			if (token.value.as_ulong > 0xffffu) {
178*00b67f09SDavid van Moolenbroek 				fprintf(stderr, "class value too big %lu\n",
179*00b67f09SDavid van Moolenbroek 					token.value.as_ulong);
180*00b67f09SDavid van Moolenbroek 				fflush(stderr);
181*00b67f09SDavid van Moolenbroek 				exit(1);
182*00b67f09SDavid van Moolenbroek 			}
183*00b67f09SDavid van Moolenbroek 			if (dns_rdataclass_ismeta(rdclass)) {
184*00b67f09SDavid van Moolenbroek 				fprintf(stderr, "class %lu is a meta value\n",
185*00b67f09SDavid van Moolenbroek 					token.value.as_ulong);
186*00b67f09SDavid van Moolenbroek 				fflush(stderr);
187*00b67f09SDavid van Moolenbroek 				exit(1);
188*00b67f09SDavid van Moolenbroek 			}
189*00b67f09SDavid van Moolenbroek 		} else if (token.type == isc_tokentype_string) {
190*00b67f09SDavid van Moolenbroek 			result = dns_rdataclass_fromtext(&rdclass,
191*00b67f09SDavid van Moolenbroek 					&token.value.as_textregion);
192*00b67f09SDavid van Moolenbroek 			if (result != ISC_R_SUCCESS) {
193*00b67f09SDavid van Moolenbroek 				fprintf(stderr, "dns_rdataclass_fromtext: %s\n",
194*00b67f09SDavid van Moolenbroek 					dns_result_totext(result));
195*00b67f09SDavid van Moolenbroek 				fflush(stderr);
196*00b67f09SDavid van Moolenbroek 				exit(1);
197*00b67f09SDavid van Moolenbroek 			}
198*00b67f09SDavid van Moolenbroek 			if (dns_rdataclass_ismeta(rdclass)) {
199*00b67f09SDavid van Moolenbroek 				fprintf(stderr,
200*00b67f09SDavid van Moolenbroek 					"class %.*s(%d) is a meta value\n",
201*00b67f09SDavid van Moolenbroek 					(int)token.value.as_textregion.length,
202*00b67f09SDavid van Moolenbroek 					token.value.as_textregion.base, rdclass);
203*00b67f09SDavid van Moolenbroek 				fflush(stderr);
204*00b67f09SDavid van Moolenbroek 				exit(1);
205*00b67f09SDavid van Moolenbroek 			}
206*00b67f09SDavid van Moolenbroek 		} else {
207*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "unexpected token %u\n", token.type);
208*00b67f09SDavid van Moolenbroek 			exit(1);
209*00b67f09SDavid van Moolenbroek 		}
210*00b67f09SDavid van Moolenbroek 
211*00b67f09SDavid van Moolenbroek 		result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER,
212*00b67f09SDavid van Moolenbroek 					  &token);
213*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
214*00b67f09SDavid van Moolenbroek 			break;
215*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_eol)
216*00b67f09SDavid van Moolenbroek 			continue;
217*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_eof)
218*00b67f09SDavid van Moolenbroek 			break;
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek 		/*
221*00b67f09SDavid van Moolenbroek 		 * Get type.
222*00b67f09SDavid van Moolenbroek 		 */
223*00b67f09SDavid van Moolenbroek 		if (token.type == isc_tokentype_number) {
224*00b67f09SDavid van Moolenbroek 			rdtype = (dns_rdatatype_t) token.value.as_ulong;
225*00b67f09SDavid van Moolenbroek 			if (token.value.as_ulong > 0xffffu) {
226*00b67f09SDavid van Moolenbroek 				fprintf(stderr, "type value too big %lu\n",
227*00b67f09SDavid van Moolenbroek 					token.value.as_ulong);
228*00b67f09SDavid van Moolenbroek 				exit(1);
229*00b67f09SDavid van Moolenbroek 			}
230*00b67f09SDavid van Moolenbroek 			if (dns_rdatatype_ismeta(rdtype)) {
231*00b67f09SDavid van Moolenbroek 				fprintf(stderr, "type %lu is a meta value\n",
232*00b67f09SDavid van Moolenbroek 					token.value.as_ulong);
233*00b67f09SDavid van Moolenbroek 				fflush(stderr);
234*00b67f09SDavid van Moolenbroek 				exit(1);
235*00b67f09SDavid van Moolenbroek 			}
236*00b67f09SDavid van Moolenbroek 		} else if (token.type == isc_tokentype_string) {
237*00b67f09SDavid van Moolenbroek 			result = dns_rdatatype_fromtext(&rdtype,
238*00b67f09SDavid van Moolenbroek 					&token.value.as_textregion);
239*00b67f09SDavid van Moolenbroek 			if (result != ISC_R_SUCCESS) {
240*00b67f09SDavid van Moolenbroek 				fprintf(stdout, "dns_rdatatype_fromtext: %s\n",
241*00b67f09SDavid van Moolenbroek 					dns_result_totext(result));
242*00b67f09SDavid van Moolenbroek 				fflush(stdout);
243*00b67f09SDavid van Moolenbroek 				exit(1);
244*00b67f09SDavid van Moolenbroek 			}
245*00b67f09SDavid van Moolenbroek 			if (dns_rdatatype_ismeta(rdtype)) {
246*00b67f09SDavid van Moolenbroek 				fprintf(stderr,
247*00b67f09SDavid van Moolenbroek 					"type %.*s(%d) is a meta value\n",
248*00b67f09SDavid van Moolenbroek 					(int)token.value.as_textregion.length,
249*00b67f09SDavid van Moolenbroek 					token.value.as_textregion.base, rdtype);
250*00b67f09SDavid van Moolenbroek 				fflush(stderr);
251*00b67f09SDavid van Moolenbroek 				exit(1);
252*00b67f09SDavid van Moolenbroek 			}
253*00b67f09SDavid van Moolenbroek 		} else {
254*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "unexpected token %u\n", token.type);
255*00b67f09SDavid van Moolenbroek 			exit(1);
256*00b67f09SDavid van Moolenbroek 		}
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek 		isc_buffer_init(&dbuf, data, sizeof(data));
259*00b67f09SDavid van Moolenbroek 		result = dns_rdata_fromtext(&rdata, rdclass, rdtype, lex,
260*00b67f09SDavid van Moolenbroek 					    name, 0, mctx, &dbuf, NULL);
261*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) {
262*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "dns_rdata_fromtext:  %s\n",
263*00b67f09SDavid van Moolenbroek 				dns_result_totext(result));
264*00b67f09SDavid van Moolenbroek 			fflush(stderr);
265*00b67f09SDavid van Moolenbroek 			exit(1);
266*00b67f09SDavid van Moolenbroek 		}
267*00b67f09SDavid van Moolenbroek 		once = ISC_TRUE;
268*00b67f09SDavid van Moolenbroek 	}
269*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_EOF) {
270*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "eof not found\n");
271*00b67f09SDavid van Moolenbroek 		exit(1);
272*00b67f09SDavid van Moolenbroek 	}
273*00b67f09SDavid van Moolenbroek 	if (!once) {
274*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "no records found\n");
275*00b67f09SDavid van Moolenbroek 		exit(1);
276*00b67f09SDavid van Moolenbroek 	}
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek 	if (print) {
279*00b67f09SDavid van Moolenbroek 		isc_buffer_init(&tbuf, text, sizeof(text));
280*00b67f09SDavid van Moolenbroek 		result = dns_rdataclass_totext(rdclass, &tbuf);
281*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) {
282*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "dns_rdataclass_totext: %s\n",
283*00b67f09SDavid van Moolenbroek 				dns_result_totext(result));
284*00b67f09SDavid van Moolenbroek 			fflush(stderr);
285*00b67f09SDavid van Moolenbroek 			exit(1);
286*00b67f09SDavid van Moolenbroek 		}
287*00b67f09SDavid van Moolenbroek 		isc_buffer_putstr(&tbuf, "\t");
288*00b67f09SDavid van Moolenbroek 		result = dns_rdatatype_totext(rdtype, &tbuf);
289*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) {
290*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "dns_rdatatype_totext: %s\n",
291*00b67f09SDavid van Moolenbroek 				dns_result_totext(result));
292*00b67f09SDavid van Moolenbroek 			fflush(stderr);
293*00b67f09SDavid van Moolenbroek 			exit(1);
294*00b67f09SDavid van Moolenbroek 		}
295*00b67f09SDavid van Moolenbroek 		isc_buffer_putstr(&tbuf, "\t");
296*00b67f09SDavid van Moolenbroek 		result = dns_rdata_totext(&rdata, NULL, &tbuf);
297*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
298*00b67f09SDavid van Moolenbroek 			fprintf(stderr, "dns_rdata_totext: %s\n",
299*00b67f09SDavid van Moolenbroek 				dns_result_totext(result));
300*00b67f09SDavid van Moolenbroek 		else
301*00b67f09SDavid van Moolenbroek 			fprintf(stdout, "%.*s\n", (int)tbuf.used,
302*00b67f09SDavid van Moolenbroek 				(char*)tbuf.base);
303*00b67f09SDavid van Moolenbroek 		fflush(stdout);
304*00b67f09SDavid van Moolenbroek 	}
305*00b67f09SDavid van Moolenbroek 
306*00b67f09SDavid van Moolenbroek 	if (unknown) {
307*00b67f09SDavid van Moolenbroek 		fprintf(stdout, "CLASS%u\tTYPE%u\t\\# %u", rdclass, rdtype,
308*00b67f09SDavid van Moolenbroek 			rdata.length);
309*00b67f09SDavid van Moolenbroek 		if (rdata.length != 0) {
310*00b67f09SDavid van Moolenbroek 			unsigned int i;
311*00b67f09SDavid van Moolenbroek 			fprintf(stdout, " ");
312*00b67f09SDavid van Moolenbroek 			for (i = 0; i < rdata.length; i++)
313*00b67f09SDavid van Moolenbroek 				fprintf(stdout, "%02x", rdata.data[i]);
314*00b67f09SDavid van Moolenbroek 		}
315*00b67f09SDavid van Moolenbroek 		fprintf(stdout, "\n");
316*00b67f09SDavid van Moolenbroek 	}
317*00b67f09SDavid van Moolenbroek 
318*00b67f09SDavid van Moolenbroek 	isc_lex_close(lex);
319*00b67f09SDavid van Moolenbroek 	isc_lex_destroy(&lex);
320*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
321*00b67f09SDavid van Moolenbroek 	return (0);
322*00b67f09SDavid van Moolenbroek }
323