xref: /minix3/external/bsd/bind/dist/bin/tests/printmsg.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: printmsg.c,v 1.4 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2007, 2011  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1998-2001  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: printmsg.c,v 1.31 2011/08/25 23:46:42 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
25*00b67f09SDavid van Moolenbroek #include <isc/util.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <dns/name.h>
28*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #include "printmsg.h"
31*00b67f09SDavid van Moolenbroek 
32*00b67f09SDavid van Moolenbroek static const char *opcodetext[] = {
33*00b67f09SDavid van Moolenbroek 	"QUERY",
34*00b67f09SDavid van Moolenbroek 	"IQUERY",
35*00b67f09SDavid van Moolenbroek 	"STATUS",
36*00b67f09SDavid van Moolenbroek 	"RESERVED3",
37*00b67f09SDavid van Moolenbroek 	"NOTIFY",
38*00b67f09SDavid van Moolenbroek 	"UPDATE",
39*00b67f09SDavid van Moolenbroek 	"RESERVED6",
40*00b67f09SDavid van Moolenbroek 	"RESERVED7",
41*00b67f09SDavid van Moolenbroek 	"RESERVED8",
42*00b67f09SDavid van Moolenbroek 	"RESERVED9",
43*00b67f09SDavid van Moolenbroek 	"RESERVED10",
44*00b67f09SDavid van Moolenbroek 	"RESERVED11",
45*00b67f09SDavid van Moolenbroek 	"RESERVED12",
46*00b67f09SDavid van Moolenbroek 	"RESERVED13",
47*00b67f09SDavid van Moolenbroek 	"RESERVED14",
48*00b67f09SDavid van Moolenbroek 	"RESERVED15"
49*00b67f09SDavid van Moolenbroek };
50*00b67f09SDavid van Moolenbroek 
51*00b67f09SDavid van Moolenbroek static const char *rcodetext[] = {
52*00b67f09SDavid van Moolenbroek 	"NOERROR",
53*00b67f09SDavid van Moolenbroek 	"FORMERR",
54*00b67f09SDavid van Moolenbroek 	"SERVFAIL",
55*00b67f09SDavid van Moolenbroek 	"NXDOMAIN",
56*00b67f09SDavid van Moolenbroek 	"NOTIMP",
57*00b67f09SDavid van Moolenbroek 	"REFUSED",
58*00b67f09SDavid van Moolenbroek 	"YXDOMAIN",
59*00b67f09SDavid van Moolenbroek 	"YXRRSET",
60*00b67f09SDavid van Moolenbroek 	"NXRRSET",
61*00b67f09SDavid van Moolenbroek 	"NOTAUTH",
62*00b67f09SDavid van Moolenbroek 	"NOTZONE",
63*00b67f09SDavid van Moolenbroek 	"RESERVED11",
64*00b67f09SDavid van Moolenbroek 	"RESERVED12",
65*00b67f09SDavid van Moolenbroek 	"RESERVED13",
66*00b67f09SDavid van Moolenbroek 	"RESERVED14",
67*00b67f09SDavid van Moolenbroek 	"RESERVED15",
68*00b67f09SDavid van Moolenbroek 	"BADVERS"
69*00b67f09SDavid van Moolenbroek };
70*00b67f09SDavid van Moolenbroek 
71*00b67f09SDavid van Moolenbroek static isc_result_t
printsection(dns_message_t * msg,dns_section_t sectionid,const char * section_name)72*00b67f09SDavid van Moolenbroek printsection(dns_message_t *msg, dns_section_t sectionid,
73*00b67f09SDavid van Moolenbroek 	     const char *section_name)
74*00b67f09SDavid van Moolenbroek {
75*00b67f09SDavid van Moolenbroek 	dns_name_t *name, *print_name;
76*00b67f09SDavid van Moolenbroek 	dns_rdataset_t *rdataset;
77*00b67f09SDavid van Moolenbroek 	isc_buffer_t target;
78*00b67f09SDavid van Moolenbroek 	isc_result_t result;
79*00b67f09SDavid van Moolenbroek 	isc_region_t r;
80*00b67f09SDavid van Moolenbroek 	dns_name_t empty_name;
81*00b67f09SDavid van Moolenbroek 	char t[65536];
82*00b67f09SDavid van Moolenbroek #ifdef USEINITALWS
83*00b67f09SDavid van Moolenbroek 	isc_boolean_t first;
84*00b67f09SDavid van Moolenbroek #endif
85*00b67f09SDavid van Moolenbroek 	isc_boolean_t no_rdata;
86*00b67f09SDavid van Moolenbroek 
87*00b67f09SDavid van Moolenbroek 	if (sectionid == DNS_SECTION_QUESTION)
88*00b67f09SDavid van Moolenbroek 		no_rdata = ISC_TRUE;
89*00b67f09SDavid van Moolenbroek 	else
90*00b67f09SDavid van Moolenbroek 		no_rdata = ISC_FALSE;
91*00b67f09SDavid van Moolenbroek 
92*00b67f09SDavid van Moolenbroek 	printf(";; %s SECTION:\n", section_name);
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek 	dns_name_init(&empty_name, NULL);
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek 	result = dns_message_firstname(msg, sectionid);
97*00b67f09SDavid van Moolenbroek 	if (result == ISC_R_NOMORE)
98*00b67f09SDavid van Moolenbroek 		return (ISC_R_SUCCESS);
99*00b67f09SDavid van Moolenbroek 	else if (result != ISC_R_SUCCESS)
100*00b67f09SDavid van Moolenbroek 		return (result);
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek 	for (;;) {
103*00b67f09SDavid van Moolenbroek 		name = NULL;
104*00b67f09SDavid van Moolenbroek 		dns_message_currentname(msg, sectionid, &name);
105*00b67f09SDavid van Moolenbroek 
106*00b67f09SDavid van Moolenbroek 		isc_buffer_init(&target, t, sizeof(t));
107*00b67f09SDavid van Moolenbroek #ifdef USEINITALWS
108*00b67f09SDavid van Moolenbroek 		first = ISC_TRUE;
109*00b67f09SDavid van Moolenbroek #endif
110*00b67f09SDavid van Moolenbroek 		print_name = name;
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek 		for (rdataset = ISC_LIST_HEAD(name->list);
113*00b67f09SDavid van Moolenbroek 		     rdataset != NULL;
114*00b67f09SDavid van Moolenbroek 		     rdataset = ISC_LIST_NEXT(rdataset, link)) {
115*00b67f09SDavid van Moolenbroek 			result = dns_rdataset_totext(rdataset,
116*00b67f09SDavid van Moolenbroek 						     print_name,
117*00b67f09SDavid van Moolenbroek 						     ISC_FALSE,
118*00b67f09SDavid van Moolenbroek 						     no_rdata,
119*00b67f09SDavid van Moolenbroek 						     &target);
120*00b67f09SDavid van Moolenbroek 			if (result != ISC_R_SUCCESS)
121*00b67f09SDavid van Moolenbroek 				return (result);
122*00b67f09SDavid van Moolenbroek #ifdef USEINITALWS
123*00b67f09SDavid van Moolenbroek 			if (first) {
124*00b67f09SDavid van Moolenbroek 				print_name = &empty_name;
125*00b67f09SDavid van Moolenbroek 				first = ISC_FALSE;
126*00b67f09SDavid van Moolenbroek 			}
127*00b67f09SDavid van Moolenbroek #endif
128*00b67f09SDavid van Moolenbroek 		}
129*00b67f09SDavid van Moolenbroek 		isc_buffer_usedregion(&target, &r);
130*00b67f09SDavid van Moolenbroek 		printf("%.*s", (int)r.length, (char *)r.base);
131*00b67f09SDavid van Moolenbroek 
132*00b67f09SDavid van Moolenbroek 		result = dns_message_nextname(msg, sectionid);
133*00b67f09SDavid van Moolenbroek 		if (result == ISC_R_NOMORE)
134*00b67f09SDavid van Moolenbroek 			break;
135*00b67f09SDavid van Moolenbroek 		else if (result != ISC_R_SUCCESS)
136*00b67f09SDavid van Moolenbroek 			return (result);
137*00b67f09SDavid van Moolenbroek 	}
138*00b67f09SDavid van Moolenbroek 
139*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
140*00b67f09SDavid van Moolenbroek }
141*00b67f09SDavid van Moolenbroek 
142*00b67f09SDavid van Moolenbroek static isc_result_t
printrdata(dns_message_t * msg,dns_rdataset_t * rdataset,dns_name_t * owner,const char * set_name)143*00b67f09SDavid van Moolenbroek printrdata(dns_message_t *msg, dns_rdataset_t *rdataset, dns_name_t *owner,
144*00b67f09SDavid van Moolenbroek 	   const char *set_name)
145*00b67f09SDavid van Moolenbroek {
146*00b67f09SDavid van Moolenbroek 	isc_buffer_t target;
147*00b67f09SDavid van Moolenbroek 	isc_result_t result;
148*00b67f09SDavid van Moolenbroek 	isc_region_t r;
149*00b67f09SDavid van Moolenbroek 	char t[65536];
150*00b67f09SDavid van Moolenbroek 
151*00b67f09SDavid van Moolenbroek 	UNUSED(msg);
152*00b67f09SDavid van Moolenbroek 	printf(";; %s SECTION:\n", set_name);
153*00b67f09SDavid van Moolenbroek 
154*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&target, t, sizeof(t));
155*00b67f09SDavid van Moolenbroek 
156*00b67f09SDavid van Moolenbroek 	result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
157*00b67f09SDavid van Moolenbroek 				     &target);
158*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
159*00b67f09SDavid van Moolenbroek 		return (result);
160*00b67f09SDavid van Moolenbroek 	isc_buffer_usedregion(&target, &r);
161*00b67f09SDavid van Moolenbroek 	printf("%.*s", (int)r.length, (char *)r.base);
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
164*00b67f09SDavid van Moolenbroek }
165*00b67f09SDavid van Moolenbroek 
166*00b67f09SDavid van Moolenbroek isc_result_t
printmessage(dns_message_t * msg)167*00b67f09SDavid van Moolenbroek printmessage(dns_message_t *msg) {
168*00b67f09SDavid van Moolenbroek 	isc_result_t result;
169*00b67f09SDavid van Moolenbroek 	dns_rdataset_t *opt, *tsig;
170*00b67f09SDavid van Moolenbroek 	dns_name_t *tsigname;
171*00b67f09SDavid van Moolenbroek 
172*00b67f09SDavid van Moolenbroek 	result = ISC_R_SUCCESS;
173*00b67f09SDavid van Moolenbroek 
174*00b67f09SDavid van Moolenbroek 	printf(";; ->>HEADER<<- opcode: %s, status: %s, id: %u\n",
175*00b67f09SDavid van Moolenbroek 	       opcodetext[msg->opcode], rcodetext[msg->rcode], msg->id);
176*00b67f09SDavid van Moolenbroek 
177*00b67f09SDavid van Moolenbroek 	printf(";; flags:");
178*00b67f09SDavid van Moolenbroek 	if ((msg->flags & DNS_MESSAGEFLAG_QR) != 0)
179*00b67f09SDavid van Moolenbroek 		printf(" qr");
180*00b67f09SDavid van Moolenbroek 	if ((msg->flags & DNS_MESSAGEFLAG_AA) != 0)
181*00b67f09SDavid van Moolenbroek 		printf(" aa");
182*00b67f09SDavid van Moolenbroek 	if ((msg->flags & DNS_MESSAGEFLAG_TC) != 0)
183*00b67f09SDavid van Moolenbroek 		printf(" tc");
184*00b67f09SDavid van Moolenbroek 	if ((msg->flags & DNS_MESSAGEFLAG_RD) != 0)
185*00b67f09SDavid van Moolenbroek 		printf(" rd");
186*00b67f09SDavid van Moolenbroek 	if ((msg->flags & DNS_MESSAGEFLAG_RA) != 0)
187*00b67f09SDavid van Moolenbroek 		printf(" ra");
188*00b67f09SDavid van Moolenbroek 	if ((msg->flags & DNS_MESSAGEFLAG_AD) != 0)
189*00b67f09SDavid van Moolenbroek 		printf(" ad");
190*00b67f09SDavid van Moolenbroek 	if ((msg->flags & DNS_MESSAGEFLAG_CD) != 0)
191*00b67f09SDavid van Moolenbroek 		printf(" cd");
192*00b67f09SDavid van Moolenbroek 	printf("; QUERY: %u, ANSWER: %u, AUTHORITY: %u, ADDITIONAL: %u\n",
193*00b67f09SDavid van Moolenbroek 	       msg->counts[DNS_SECTION_QUESTION],
194*00b67f09SDavid van Moolenbroek 	       msg->counts[DNS_SECTION_ANSWER],
195*00b67f09SDavid van Moolenbroek 	       msg->counts[DNS_SECTION_AUTHORITY],
196*00b67f09SDavid van Moolenbroek 	       msg->counts[DNS_SECTION_ADDITIONAL]);
197*00b67f09SDavid van Moolenbroek 	opt = dns_message_getopt(msg);
198*00b67f09SDavid van Moolenbroek 	if (opt != NULL)
199*00b67f09SDavid van Moolenbroek 		printf(";; EDNS: version: %u, udp=%u\n",
200*00b67f09SDavid van Moolenbroek 		       (unsigned int)((opt->ttl & 0x00ff0000) >> 16),
201*00b67f09SDavid van Moolenbroek 		       (unsigned int)opt->rdclass);
202*00b67f09SDavid van Moolenbroek 
203*00b67f09SDavid van Moolenbroek 	tsigname = NULL;
204*00b67f09SDavid van Moolenbroek 	tsig = dns_message_gettsig(msg, &tsigname);
205*00b67f09SDavid van Moolenbroek 	if (tsig != NULL)
206*00b67f09SDavid van Moolenbroek 		printf(";; PSEUDOSECTIONS: TSIG\n");
207*00b67f09SDavid van Moolenbroek 	if (! ISC_LIST_EMPTY(msg->sections[DNS_SECTION_QUESTION])) {
208*00b67f09SDavid van Moolenbroek 		printf("\n");
209*00b67f09SDavid van Moolenbroek 		result = printsection(msg, DNS_SECTION_QUESTION, "QUESTION");
210*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
211*00b67f09SDavid van Moolenbroek 			return (result);
212*00b67f09SDavid van Moolenbroek 	}
213*00b67f09SDavid van Moolenbroek 	if (! ISC_LIST_EMPTY(msg->sections[DNS_SECTION_ANSWER])) {
214*00b67f09SDavid van Moolenbroek 		printf("\n");
215*00b67f09SDavid van Moolenbroek 		result = printsection(msg, DNS_SECTION_ANSWER, "ANSWER");
216*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
217*00b67f09SDavid van Moolenbroek 			return (result);
218*00b67f09SDavid van Moolenbroek 	}
219*00b67f09SDavid van Moolenbroek 	if (! ISC_LIST_EMPTY(msg->sections[DNS_SECTION_AUTHORITY])) {
220*00b67f09SDavid van Moolenbroek 		printf("\n");
221*00b67f09SDavid van Moolenbroek 		result = printsection(msg, DNS_SECTION_AUTHORITY, "AUTHORITY");
222*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
223*00b67f09SDavid van Moolenbroek 			return (result);
224*00b67f09SDavid van Moolenbroek 	}
225*00b67f09SDavid van Moolenbroek 	if (! ISC_LIST_EMPTY(msg->sections[DNS_SECTION_ADDITIONAL])) {
226*00b67f09SDavid van Moolenbroek 		printf("\n");
227*00b67f09SDavid van Moolenbroek 		result = printsection(msg, DNS_SECTION_ADDITIONAL,
228*00b67f09SDavid van Moolenbroek 				      "ADDITIONAL");
229*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
230*00b67f09SDavid van Moolenbroek 			return (result);
231*00b67f09SDavid van Moolenbroek 	}
232*00b67f09SDavid van Moolenbroek 	if (tsig != NULL) {
233*00b67f09SDavid van Moolenbroek 		printf("\n");
234*00b67f09SDavid van Moolenbroek 		result = printrdata(msg, tsig, tsigname,
235*00b67f09SDavid van Moolenbroek 				    "PSEUDOSECTION TSIG");
236*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
237*00b67f09SDavid van Moolenbroek 			return (result);
238*00b67f09SDavid van Moolenbroek 	}
239*00b67f09SDavid van Moolenbroek 	printf("\n");
240*00b67f09SDavid van Moolenbroek 
241*00b67f09SDavid van Moolenbroek 	return (result);
242*00b67f09SDavid van Moolenbroek }
243