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