xref: /minix/external/bsd/bind/dist/lib/dns/result.c (revision 00b67f09)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: result.c,v 1.6 2014/12/10 04:37:58 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007-2013  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1998-2003  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 */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek /*! \file */
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <config.h>
25*00b67f09SDavid van Moolenbroek 
26*00b67f09SDavid van Moolenbroek #include <isc/once.h>
27*00b67f09SDavid van Moolenbroek #include <isc/util.h>
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #include <dns/result.h>
30*00b67f09SDavid van Moolenbroek #include <dns/lib.h>
31*00b67f09SDavid van Moolenbroek 
32*00b67f09SDavid van Moolenbroek static const char *text[DNS_R_NRESULTS] = {
33*00b67f09SDavid van Moolenbroek 	"label too long",		       /*%< 0 DNS_R_LABELTOOLONG */
34*00b67f09SDavid van Moolenbroek 	"bad escape",			       /*%< 1 DNS_R_BADESCAPE */
35*00b67f09SDavid van Moolenbroek 	/*!
36*00b67f09SDavid van Moolenbroek 	 * Note that DNS_R_BADBITSTRING and DNS_R_BITSTRINGTOOLONG are
37*00b67f09SDavid van Moolenbroek 	 * deprecated.
38*00b67f09SDavid van Moolenbroek 	 */
39*00b67f09SDavid van Moolenbroek 	"bad bitstring",		       /*%< 2 DNS_R_BADBITSTRING */
40*00b67f09SDavid van Moolenbroek 	"bitstring too long",		       /*%< 3 DNS_R_BITSTRINGTOOLONG */
41*00b67f09SDavid van Moolenbroek 	"empty label",			       /*%< 4 DNS_R_EMPTYLABEL */
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek 	"bad dotted quad",		       /*%< 5 DNS_R_BADDOTTEDQUAD */
44*00b67f09SDavid van Moolenbroek 	"invalid NS owner name (wildcard)",    /*%< 6 DNS_R_INVALIDNS */
45*00b67f09SDavid van Moolenbroek 	"unknown class/type",		       /*%< 7 DNS_R_UNKNOWN */
46*00b67f09SDavid van Moolenbroek 	"bad label type",		       /*%< 8 DNS_R_BADLABELTYPE */
47*00b67f09SDavid van Moolenbroek 	"bad compression pointer",	       /*%< 9 DNS_R_BADPOINTER */
48*00b67f09SDavid van Moolenbroek 
49*00b67f09SDavid van Moolenbroek 	"too many hops",		       /*%< 10 DNS_R_TOOMANYHOPS */
50*00b67f09SDavid van Moolenbroek 	"disallowed (by application policy)",  /*%< 11 DNS_R_DISALLOWED */
51*00b67f09SDavid van Moolenbroek 	"extra input text",		       /*%< 12 DNS_R_EXTRATOKEN */
52*00b67f09SDavid van Moolenbroek 	"extra input data",		       /*%< 13 DNS_R_EXTRADATA */
53*00b67f09SDavid van Moolenbroek 	"text too long",		       /*%< 14 DNS_R_TEXTTOOLONG */
54*00b67f09SDavid van Moolenbroek 
55*00b67f09SDavid van Moolenbroek 	"not at top of zone",		       /*%< 15 DNS_R_NOTZONETOP */
56*00b67f09SDavid van Moolenbroek 	"syntax error",			       /*%< 16 DNS_R_SYNTAX */
57*00b67f09SDavid van Moolenbroek 	"bad checksum",			       /*%< 17 DNS_R_BADCKSUM */
58*00b67f09SDavid van Moolenbroek 	"bad IPv6 address",		       /*%< 18 DNS_R_BADAAAA */
59*00b67f09SDavid van Moolenbroek 	"no owner",			       /*%< 19 DNS_R_NOOWNER */
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek 	"no ttl",			       /*%< 20 DNS_R_NOTTL */
62*00b67f09SDavid van Moolenbroek 	"bad class",			       /*%< 21 DNS_R_BADCLASS */
63*00b67f09SDavid van Moolenbroek 	"name too long",		       /*%< 22 DNS_R_NAMETOOLONG */
64*00b67f09SDavid van Moolenbroek 	"partial match",		       /*%< 23 DNS_R_PARTIALMATCH */
65*00b67f09SDavid van Moolenbroek 	"new origin",			       /*%< 24 DNS_R_NEWORIGIN */
66*00b67f09SDavid van Moolenbroek 
67*00b67f09SDavid van Moolenbroek 	"unchanged",			       /*%< 25 DNS_R_UNCHANGED */
68*00b67f09SDavid van Moolenbroek 	"bad ttl",			       /*%< 26 DNS_R_BADTTL */
69*00b67f09SDavid van Moolenbroek 	"more data needed/to be rendered",     /*%< 27 DNS_R_NOREDATA */
70*00b67f09SDavid van Moolenbroek 	"continue",			       /*%< 28 DNS_R_CONTINUE */
71*00b67f09SDavid van Moolenbroek 	"delegation",			       /*%< 29 DNS_R_DELEGATION */
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek 	"glue",				       /*%< 30 DNS_R_GLUE */
74*00b67f09SDavid van Moolenbroek 	"dname",			       /*%< 31 DNS_R_DNAME */
75*00b67f09SDavid van Moolenbroek 	"cname",			       /*%< 32 DNS_R_CNAME */
76*00b67f09SDavid van Moolenbroek 	"bad database",			       /*%< 33 DNS_R_BADDB */
77*00b67f09SDavid van Moolenbroek 	"zonecut",			       /*%< 34 DNS_R_ZONECUT */
78*00b67f09SDavid van Moolenbroek 
79*00b67f09SDavid van Moolenbroek 	"bad zone",			       /*%< 35 DNS_R_BADZONE */
80*00b67f09SDavid van Moolenbroek 	"more data",			       /*%< 36 DNS_R_MOREDATA */
81*00b67f09SDavid van Moolenbroek 	"up to date",			       /*%< 37 DNS_R_UPTODATE */
82*00b67f09SDavid van Moolenbroek 	"tsig verify failure",		       /*%< 38 DNS_R_TSIGVERIFYFAILURE */
83*00b67f09SDavid van Moolenbroek 	"tsig indicates error",		       /*%< 39 DNS_R_TSIGERRORSET */
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek 	"RRSIG failed to verify",	       /*%< 40 DNS_R_SIGINVALID */
86*00b67f09SDavid van Moolenbroek 	"RRSIG has expired",		       /*%< 41 DNS_R_SIGEXPIRED */
87*00b67f09SDavid van Moolenbroek 	"RRSIG validity period has not begun", /*%< 42 DNS_R_SIGFUTURE */
88*00b67f09SDavid van Moolenbroek 	"key is unauthorized to sign data",    /*%< 43 DNS_R_KEYUNAUTHORIZED */
89*00b67f09SDavid van Moolenbroek 	"invalid time",			       /*%< 44 DNS_R_INVALIDTIME */
90*00b67f09SDavid van Moolenbroek 
91*00b67f09SDavid van Moolenbroek 	"expected a TSIG or SIG(0)",	       /*%< 45 DNS_R_EXPECTEDTSIG */
92*00b67f09SDavid van Moolenbroek 	"did not expect a TSIG or SIG(0)",     /*%< 46 DNS_R_UNEXPECTEDTSIG */
93*00b67f09SDavid van Moolenbroek 	"TKEY is unacceptable",		       /*%< 47 DNS_R_INVALIDTKEY */
94*00b67f09SDavid van Moolenbroek 	"hint",				       /*%< 48 DNS_R_HINT */
95*00b67f09SDavid van Moolenbroek 	"drop",				       /*%< 49 DNS_R_DROP */
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek 	"zone not loaded",		       /*%< 50 DNS_R_NOTLOADED */
98*00b67f09SDavid van Moolenbroek 	"ncache nxdomain",		       /*%< 51 DNS_R_NCACHENXDOMAIN */
99*00b67f09SDavid van Moolenbroek 	"ncache nxrrset",		       /*%< 52 DNS_R_NCACHENXRRSET */
100*00b67f09SDavid van Moolenbroek 	"wait",				       /*%< 53 DNS_R_WAIT */
101*00b67f09SDavid van Moolenbroek 	"not verified yet",		       /*%< 54 DNS_R_NOTVERIFIEDYET */
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek 	"no identity",			       /*%< 55 DNS_R_NOIDENTITY */
104*00b67f09SDavid van Moolenbroek 	"no journal",			       /*%< 56 DNS_R_NOJOURNAL */
105*00b67f09SDavid van Moolenbroek 	"alias",			       /*%< 57 DNS_R_ALIAS */
106*00b67f09SDavid van Moolenbroek 	"use TCP",			       /*%< 58 DNS_R_USETCP */
107*00b67f09SDavid van Moolenbroek 	"no valid RRSIG",		       /*%< 59 DNS_R_NOVALIDSIG */
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek 	"no valid NSEC",		       /*%< 60 DNS_R_NOVALIDNSEC */
110*00b67f09SDavid van Moolenbroek 	"insecurity proof failed",	       /*%< 61 DNS_R_NOTINSECURE */
111*00b67f09SDavid van Moolenbroek 	"unknown service",		       /*%< 62 DNS_R_UNKNOWNSERVICE */
112*00b67f09SDavid van Moolenbroek 	"recoverable error occurred",	       /*%< 63 DNS_R_RECOVERABLE */
113*00b67f09SDavid van Moolenbroek 	"unknown opt attribute record",	       /*%< 64 DNS_R_UNKNOWNOPT */
114*00b67f09SDavid van Moolenbroek 
115*00b67f09SDavid van Moolenbroek 	"unexpected message id",	       /*%< 65 DNS_R_UNEXPECTEDID */
116*00b67f09SDavid van Moolenbroek 	"seen include file",		       /*%< 66 DNS_R_SEENINCLUDE */
117*00b67f09SDavid van Moolenbroek 	"not exact",		       	       /*%< 67 DNS_R_NOTEXACT */
118*00b67f09SDavid van Moolenbroek 	"address blackholed",	       	       /*%< 68 DNS_R_BLACKHOLED */
119*00b67f09SDavid van Moolenbroek 	"bad algorithm",		       /*%< 69 DNS_R_BADALG */
120*00b67f09SDavid van Moolenbroek 
121*00b67f09SDavid van Moolenbroek 	"invalid use of a meta type",	       /*%< 70 DNS_R_METATYPE */
122*00b67f09SDavid van Moolenbroek 	"CNAME and other data",		       /*%< 71 DNS_R_CNAMEANDOTHER */
123*00b67f09SDavid van Moolenbroek 	"multiple RRs of singleton type",      /*%< 72 DNS_R_SINGLETON */
124*00b67f09SDavid van Moolenbroek 	"hint nxrrset",			       /*%< 73 DNS_R_HINTNXRRSET */
125*00b67f09SDavid van Moolenbroek 	"no master file configured",	       /*%< 74 DNS_R_NOMASTERFILE */
126*00b67f09SDavid van Moolenbroek 
127*00b67f09SDavid van Moolenbroek 	"unknown protocol",		       /*%< 75 DNS_R_UNKNOWNPROTO */
128*00b67f09SDavid van Moolenbroek 	"clocks are unsynchronized",	       /*%< 76 DNS_R_CLOCKSKEW */
129*00b67f09SDavid van Moolenbroek 	"IXFR failed",			       /*%< 77 DNS_R_BADIXFR */
130*00b67f09SDavid van Moolenbroek 	"not authoritative",		       /*%< 78 DNS_R_NOTAUTHORITATIVE */
131*00b67f09SDavid van Moolenbroek 	"no valid KEY",		       	       /*%< 79 DNS_R_NOVALIDKEY */
132*00b67f09SDavid van Moolenbroek 
133*00b67f09SDavid van Moolenbroek 	"obsolete",			       /*%< 80 DNS_R_OBSOLETE */
134*00b67f09SDavid van Moolenbroek 	"already frozen",		       /*%< 81 DNS_R_FROZEN */
135*00b67f09SDavid van Moolenbroek 	"unknown flag",			       /*%< 82 DNS_R_UNKNOWNFLAG */
136*00b67f09SDavid van Moolenbroek 	"expected a response",		       /*%< 83 DNS_R_EXPECTEDRESPONSE */
137*00b67f09SDavid van Moolenbroek 	"no valid DS",			       /*%< 84 DNS_R_NOVALIDDS */
138*00b67f09SDavid van Moolenbroek 
139*00b67f09SDavid van Moolenbroek 	"NS is an address",		       /*%< 85 DNS_R_NSISADDRESS */
140*00b67f09SDavid van Moolenbroek 	"received FORMERR",		       /*%< 86 DNS_R_REMOTEFORMERR */
141*00b67f09SDavid van Moolenbroek 	"truncated TCP response",	       /*%< 87 DNS_R_TRUNCATEDTCP */
142*00b67f09SDavid van Moolenbroek 	"lame server detected",		       /*%< 88 DNS_R_LAME */
143*00b67f09SDavid van Moolenbroek 	"unexpected RCODE",		       /*%< 89 DNS_R_UNEXPECTEDRCODE */
144*00b67f09SDavid van Moolenbroek 
145*00b67f09SDavid van Moolenbroek 	"unexpected OPCODE",		       /*%< 90 DNS_R_UNEXPECTEDOPCODE */
146*00b67f09SDavid van Moolenbroek 	"chase DS servers",		       /*%< 91 DNS_R_CHASEDSSERVERS */
147*00b67f09SDavid van Moolenbroek 	"empty name",			       /*%< 92 DNS_R_EMPTYNAME */
148*00b67f09SDavid van Moolenbroek 	"empty wild",			       /*%< 93 DNS_R_EMPTYWILD */
149*00b67f09SDavid van Moolenbroek 	"bad bitmap",			       /*%< 94 DNS_R_BADBITMAP */
150*00b67f09SDavid van Moolenbroek 
151*00b67f09SDavid van Moolenbroek 	"from wildcard",		       /*%< 95 DNS_R_FROMWILDCARD */
152*00b67f09SDavid van Moolenbroek 	"bad owner name (check-names)",	       /*%< 96 DNS_R_BADOWNERNAME */
153*00b67f09SDavid van Moolenbroek 	"bad name (check-names)",	       /*%< 97 DNS_R_BADNAME */
154*00b67f09SDavid van Moolenbroek 	"dynamic zone",			       /*%< 98 DNS_R_DYNAMIC */
155*00b67f09SDavid van Moolenbroek 	"unknown command",		       /*%< 99 DNS_R_UNKNOWNCOMMAND */
156*00b67f09SDavid van Moolenbroek 
157*00b67f09SDavid van Moolenbroek 	"must-be-secure",		       /*%< 100 DNS_R_MUSTBESECURE */
158*00b67f09SDavid van Moolenbroek 	"covering NSEC record returned",       /*%< 101 DNS_R_COVERINGNSEC */
159*00b67f09SDavid van Moolenbroek 	"MX is an address",		       /*%< 102 DNS_R_MXISADDRESS */
160*00b67f09SDavid van Moolenbroek 	"duplicate query",		       /*%< 103 DNS_R_DUPLICATE */
161*00b67f09SDavid van Moolenbroek 	"invalid NSEC3 owner name (wildcard)", /*%< 104 DNS_R_INVALIDNSEC3 */
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek 	"not master",			       /*%< 105 DNS_R_NOTMASTER */
164*00b67f09SDavid van Moolenbroek 	"broken trust chain",		       /*%< 106 DNS_R_BROKENCHAIN */
165*00b67f09SDavid van Moolenbroek 	"expired",			       /*%< 107 DNS_R_EXPIRED */
166*00b67f09SDavid van Moolenbroek 	"not dynamic",			       /*%< 108 DNS_R_NOTDYNAMIC */
167*00b67f09SDavid van Moolenbroek 	"bad EUI"			       /*%< 109 DNS_R_BADEUI */
168*00b67f09SDavid van Moolenbroek };
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek static const char *rcode_text[DNS_R_NRCODERESULTS] = {
171*00b67f09SDavid van Moolenbroek 	"NOERROR",				/*%< 0 DNS_R_NOEROR */
172*00b67f09SDavid van Moolenbroek 	"FORMERR",				/*%< 1 DNS_R_FORMERR */
173*00b67f09SDavid van Moolenbroek 	"SERVFAIL",				/*%< 2 DNS_R_SERVFAIL */
174*00b67f09SDavid van Moolenbroek 	"NXDOMAIN",				/*%< 3 DNS_R_NXDOMAIN */
175*00b67f09SDavid van Moolenbroek 	"NOTIMP",				/*%< 4 DNS_R_NOTIMP */
176*00b67f09SDavid van Moolenbroek 
177*00b67f09SDavid van Moolenbroek 	"REFUSED",				/*%< 5 DNS_R_REFUSED */
178*00b67f09SDavid van Moolenbroek 	"YXDOMAIN",				/*%< 6 DNS_R_YXDOMAIN */
179*00b67f09SDavid van Moolenbroek 	"YXRRSET",				/*%< 7 DNS_R_YXRRSET */
180*00b67f09SDavid van Moolenbroek 	"NXRRSET",				/*%< 8 DNS_R_NXRRSET */
181*00b67f09SDavid van Moolenbroek 	"NOTAUTH",				/*%< 9 DNS_R_NOTAUTH */
182*00b67f09SDavid van Moolenbroek 
183*00b67f09SDavid van Moolenbroek 	"NOTZONE",				/*%< 10 DNS_R_NOTZONE */
184*00b67f09SDavid van Moolenbroek 	"<rcode 11>",				/*%< 11 has no macro */
185*00b67f09SDavid van Moolenbroek 	"<rcode 12>",				/*%< 12 has no macro */
186*00b67f09SDavid van Moolenbroek 	"<rcode 13>",				/*%< 13 has no macro */
187*00b67f09SDavid van Moolenbroek 	"<rcode 14>",				/*%< 14 has no macro */
188*00b67f09SDavid van Moolenbroek 
189*00b67f09SDavid van Moolenbroek 	"<rcode 15>",				/*%< 15 has no macro */
190*00b67f09SDavid van Moolenbroek 	"BADVERS",				/*%< 16 DNS_R_BADVERS */
191*00b67f09SDavid van Moolenbroek };
192*00b67f09SDavid van Moolenbroek 
193*00b67f09SDavid van Moolenbroek #define DNS_RESULT_RESULTSET			2
194*00b67f09SDavid van Moolenbroek #define DNS_RESULT_RCODERESULTSET		3
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek static isc_once_t		once = ISC_ONCE_INIT;
197*00b67f09SDavid van Moolenbroek 
198*00b67f09SDavid van Moolenbroek static void
initialize_action(void)199*00b67f09SDavid van Moolenbroek initialize_action(void) {
200*00b67f09SDavid van Moolenbroek 	isc_result_t result;
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	result = isc_result_register(ISC_RESULTCLASS_DNS, DNS_R_NRESULTS,
203*00b67f09SDavid van Moolenbroek 				     text, dns_msgcat, DNS_RESULT_RESULTSET);
204*00b67f09SDavid van Moolenbroek 	if (result == ISC_R_SUCCESS)
205*00b67f09SDavid van Moolenbroek 		result = isc_result_register(ISC_RESULTCLASS_DNSRCODE,
206*00b67f09SDavid van Moolenbroek 					     DNS_R_NRCODERESULTS,
207*00b67f09SDavid van Moolenbroek 					     rcode_text, dns_msgcat,
208*00b67f09SDavid van Moolenbroek 					     DNS_RESULT_RCODERESULTSET);
209*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
210*00b67f09SDavid van Moolenbroek 		UNEXPECTED_ERROR(__FILE__, __LINE__,
211*00b67f09SDavid van Moolenbroek 				 "isc_result_register() failed: %u", result);
212*00b67f09SDavid van Moolenbroek }
213*00b67f09SDavid van Moolenbroek 
214*00b67f09SDavid van Moolenbroek static void
initialize(void)215*00b67f09SDavid van Moolenbroek initialize(void) {
216*00b67f09SDavid van Moolenbroek 	dns_lib_initmsgcat();
217*00b67f09SDavid van Moolenbroek 	RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
218*00b67f09SDavid van Moolenbroek }
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek const char *
dns_result_totext(isc_result_t result)221*00b67f09SDavid van Moolenbroek dns_result_totext(isc_result_t result) {
222*00b67f09SDavid van Moolenbroek 	initialize();
223*00b67f09SDavid van Moolenbroek 
224*00b67f09SDavid van Moolenbroek 	return (isc_result_totext(result));
225*00b67f09SDavid van Moolenbroek }
226*00b67f09SDavid van Moolenbroek 
227*00b67f09SDavid van Moolenbroek void
dns_result_register(void)228*00b67f09SDavid van Moolenbroek dns_result_register(void) {
229*00b67f09SDavid van Moolenbroek 	initialize();
230*00b67f09SDavid van Moolenbroek }
231*00b67f09SDavid van Moolenbroek 
232*00b67f09SDavid van Moolenbroek dns_rcode_t
dns_result_torcode(isc_result_t result)233*00b67f09SDavid van Moolenbroek dns_result_torcode(isc_result_t result) {
234*00b67f09SDavid van Moolenbroek 	dns_rcode_t rcode = dns_rcode_servfail;
235*00b67f09SDavid van Moolenbroek 
236*00b67f09SDavid van Moolenbroek 	if (DNS_RESULT_ISRCODE(result)) {
237*00b67f09SDavid van Moolenbroek 		/*
238*00b67f09SDavid van Moolenbroek 		 * Rcodes can't be bigger than 12 bits, which is why we
239*00b67f09SDavid van Moolenbroek 		 * AND with 0xFFF instead of 0xFFFF.
240*00b67f09SDavid van Moolenbroek 		 */
241*00b67f09SDavid van Moolenbroek 		return ((dns_rcode_t)((result) & 0xFFF));
242*00b67f09SDavid van Moolenbroek 	}
243*00b67f09SDavid van Moolenbroek 	/*
244*00b67f09SDavid van Moolenbroek 	 * Try to supply an appropriate rcode.
245*00b67f09SDavid van Moolenbroek 	 */
246*00b67f09SDavid van Moolenbroek 	switch (result) {
247*00b67f09SDavid van Moolenbroek 	case ISC_R_SUCCESS:
248*00b67f09SDavid van Moolenbroek 		rcode = dns_rcode_noerror;
249*00b67f09SDavid van Moolenbroek 		break;
250*00b67f09SDavid van Moolenbroek 	case ISC_R_BADBASE64:
251*00b67f09SDavid van Moolenbroek 	case ISC_R_NOSPACE:
252*00b67f09SDavid van Moolenbroek 	case ISC_R_RANGE:
253*00b67f09SDavid van Moolenbroek 	case ISC_R_UNEXPECTEDEND:
254*00b67f09SDavid van Moolenbroek 	case DNS_R_BADAAAA:
255*00b67f09SDavid van Moolenbroek 	/* case DNS_R_BADBITSTRING: deprecated */
256*00b67f09SDavid van Moolenbroek 	case DNS_R_BADCKSUM:
257*00b67f09SDavid van Moolenbroek 	case DNS_R_BADCLASS:
258*00b67f09SDavid van Moolenbroek 	case DNS_R_BADLABELTYPE:
259*00b67f09SDavid van Moolenbroek 	case DNS_R_BADPOINTER:
260*00b67f09SDavid van Moolenbroek 	case DNS_R_BADTTL:
261*00b67f09SDavid van Moolenbroek 	case DNS_R_BADZONE:
262*00b67f09SDavid van Moolenbroek 	/* case DNS_R_BITSTRINGTOOLONG: deprecated */
263*00b67f09SDavid van Moolenbroek 	case DNS_R_EXTRADATA:
264*00b67f09SDavid van Moolenbroek 	case DNS_R_LABELTOOLONG:
265*00b67f09SDavid van Moolenbroek 	case DNS_R_NOREDATA:
266*00b67f09SDavid van Moolenbroek 	case DNS_R_SYNTAX:
267*00b67f09SDavid van Moolenbroek 	case DNS_R_TEXTTOOLONG:
268*00b67f09SDavid van Moolenbroek 	case DNS_R_TOOMANYHOPS:
269*00b67f09SDavid van Moolenbroek 	case DNS_R_TSIGERRORSET:
270*00b67f09SDavid van Moolenbroek 	case DNS_R_UNKNOWN:
271*00b67f09SDavid van Moolenbroek 	case DNS_R_NAMETOOLONG:
272*00b67f09SDavid van Moolenbroek 		rcode = dns_rcode_formerr;
273*00b67f09SDavid van Moolenbroek 		break;
274*00b67f09SDavid van Moolenbroek 	case DNS_R_DISALLOWED:
275*00b67f09SDavid van Moolenbroek 		rcode = dns_rcode_refused;
276*00b67f09SDavid van Moolenbroek 		break;
277*00b67f09SDavid van Moolenbroek 	case DNS_R_TSIGVERIFYFAILURE:
278*00b67f09SDavid van Moolenbroek 	case DNS_R_CLOCKSKEW:
279*00b67f09SDavid van Moolenbroek 		rcode = dns_rcode_notauth;
280*00b67f09SDavid van Moolenbroek 		break;
281*00b67f09SDavid van Moolenbroek 	default:
282*00b67f09SDavid van Moolenbroek 		rcode = dns_rcode_servfail;
283*00b67f09SDavid van Moolenbroek 	}
284*00b67f09SDavid van Moolenbroek 
285*00b67f09SDavid van Moolenbroek 	return (rcode);
286*00b67f09SDavid van Moolenbroek }
287