1135446Strhodes/*
2254402Serwin * Copyright (C) 2004, 2005, 2007-2013  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1998-2003  Internet Software Consortium.
4135446Strhodes *
5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18234010Sdougb/* $Id$ */
19135446Strhodes
20170222Sdougb/*! \file */
21170222Sdougb
22135446Strhodes#include <config.h>
23135446Strhodes
24135446Strhodes#include <isc/once.h>
25135446Strhodes#include <isc/util.h>
26135446Strhodes
27135446Strhodes#include <dns/result.h>
28135446Strhodes#include <dns/lib.h>
29135446Strhodes
30135446Strhodesstatic const char *text[DNS_R_NRESULTS] = {
31170222Sdougb	"label too long",		       /*%< 0 DNS_R_LABELTOOLONG */
32170222Sdougb	"bad escape",			       /*%< 1 DNS_R_BADESCAPE */
33170222Sdougb	/*!
34135446Strhodes	 * Note that DNS_R_BADBITSTRING and DNS_R_BITSTRINGTOOLONG are
35135446Strhodes	 * deprecated.
36135446Strhodes	 */
37170222Sdougb	"bad bitstring",		       /*%< 2 DNS_R_BADBITSTRING */
38170222Sdougb	"bitstring too long",		       /*%< 3 DNS_R_BITSTRINGTOOLONG */
39170222Sdougb	"empty label",			       /*%< 4 DNS_R_EMPTYLABEL */
40135446Strhodes
41170222Sdougb	"bad dotted quad",		       /*%< 5 DNS_R_BADDOTTEDQUAD */
42170222Sdougb	"invalid NS owner name (wildcard)",    /*%< 6 DNS_R_INVALIDNS */
43170222Sdougb	"unknown class/type",		       /*%< 7 DNS_R_UNKNOWN */
44170222Sdougb	"bad label type",		       /*%< 8 DNS_R_BADLABELTYPE */
45170222Sdougb	"bad compression pointer",	       /*%< 9 DNS_R_BADPOINTER */
46135446Strhodes
47170222Sdougb	"too many hops",		       /*%< 10 DNS_R_TOOMANYHOPS */
48170222Sdougb	"disallowed (by application policy)",  /*%< 11 DNS_R_DISALLOWED */
49170222Sdougb	"extra input text",		       /*%< 12 DNS_R_EXTRATOKEN */
50170222Sdougb	"extra input data",		       /*%< 13 DNS_R_EXTRADATA */
51170222Sdougb	"text too long",		       /*%< 14 DNS_R_TEXTTOOLONG */
52135446Strhodes
53170222Sdougb	"not at top of zone",		       /*%< 15 DNS_R_NOTZONETOP */
54170222Sdougb	"syntax error",			       /*%< 16 DNS_R_SYNTAX */
55170222Sdougb	"bad checksum",			       /*%< 17 DNS_R_BADCKSUM */
56170222Sdougb	"bad IPv6 address",		       /*%< 18 DNS_R_BADAAAA */
57170222Sdougb	"no owner",			       /*%< 19 DNS_R_NOOWNER */
58135446Strhodes
59170222Sdougb	"no ttl",			       /*%< 20 DNS_R_NOTTL */
60170222Sdougb	"bad class",			       /*%< 21 DNS_R_BADCLASS */
61170222Sdougb	"name too long",		       /*%< 22 DNS_R_NAMETOOLONG */
62170222Sdougb	"partial match",		       /*%< 23 DNS_R_PARTIALMATCH */
63170222Sdougb	"new origin",			       /*%< 24 DNS_R_NEWORIGIN */
64135446Strhodes
65170222Sdougb	"unchanged",			       /*%< 25 DNS_R_UNCHANGED */
66170222Sdougb	"bad ttl",			       /*%< 26 DNS_R_BADTTL */
67170222Sdougb	"more data needed/to be rendered",     /*%< 27 DNS_R_NOREDATA */
68170222Sdougb	"continue",			       /*%< 28 DNS_R_CONTINUE */
69170222Sdougb	"delegation",			       /*%< 29 DNS_R_DELEGATION */
70135446Strhodes
71170222Sdougb	"glue",				       /*%< 30 DNS_R_GLUE */
72170222Sdougb	"dname",			       /*%< 31 DNS_R_DNAME */
73170222Sdougb	"cname",			       /*%< 32 DNS_R_CNAME */
74170222Sdougb	"bad database",			       /*%< 33 DNS_R_BADDB */
75170222Sdougb	"zonecut",			       /*%< 34 DNS_R_ZONECUT */
76135446Strhodes
77170222Sdougb	"bad zone",			       /*%< 35 DNS_R_BADZONE */
78170222Sdougb	"more data",			       /*%< 36 DNS_R_MOREDATA */
79170222Sdougb	"up to date",			       /*%< 37 DNS_R_UPTODATE */
80170222Sdougb	"tsig verify failure",		       /*%< 38 DNS_R_TSIGVERIFYFAILURE */
81170222Sdougb	"tsig indicates error",		       /*%< 39 DNS_R_TSIGERRORSET */
82135446Strhodes
83170222Sdougb	"RRSIG failed to verify",	       /*%< 40 DNS_R_SIGINVALID */
84170222Sdougb	"RRSIG has expired",		       /*%< 41 DNS_R_SIGEXPIRED */
85170222Sdougb	"RRSIG validity period has not begun", /*%< 42 DNS_R_SIGFUTURE */
86170222Sdougb	"key is unauthorized to sign data",    /*%< 43 DNS_R_KEYUNAUTHORIZED */
87170222Sdougb	"invalid time",			       /*%< 44 DNS_R_INVALIDTIME */
88135446Strhodes
89170222Sdougb	"expected a TSIG or SIG(0)",	       /*%< 45 DNS_R_EXPECTEDTSIG */
90170222Sdougb	"did not expect a TSIG or SIG(0)",     /*%< 46 DNS_R_UNEXPECTEDTSIG */
91170222Sdougb	"TKEY is unacceptable",		       /*%< 47 DNS_R_INVALIDTKEY */
92170222Sdougb	"hint",				       /*%< 48 DNS_R_HINT */
93170222Sdougb	"drop",				       /*%< 49 DNS_R_DROP */
94135446Strhodes
95170222Sdougb	"zone not loaded",		       /*%< 50 DNS_R_NOTLOADED */
96170222Sdougb	"ncache nxdomain",		       /*%< 51 DNS_R_NCACHENXDOMAIN */
97170222Sdougb	"ncache nxrrset",		       /*%< 52 DNS_R_NCACHENXRRSET */
98170222Sdougb	"wait",				       /*%< 53 DNS_R_WAIT */
99170222Sdougb	"not verified yet",		       /*%< 54 DNS_R_NOTVERIFIEDYET */
100135446Strhodes
101170222Sdougb	"no identity",			       /*%< 55 DNS_R_NOIDENTITY */
102170222Sdougb	"no journal",			       /*%< 56 DNS_R_NOJOURNAL */
103170222Sdougb	"alias",			       /*%< 57 DNS_R_ALIAS */
104170222Sdougb	"use TCP",			       /*%< 58 DNS_R_USETCP */
105170222Sdougb	"no valid RRSIG",		       /*%< 59 DNS_R_NOVALIDSIG */
106135446Strhodes
107170222Sdougb	"no valid NSEC",		       /*%< 60 DNS_R_NOVALIDNSEC */
108224092Sdougb	"insecurity proof failed",	       /*%< 61 DNS_R_NOTINSECURE */
109170222Sdougb	"unknown service",		       /*%< 62 DNS_R_UNKNOWNSERVICE */
110170222Sdougb	"recoverable error occurred",	       /*%< 63 DNS_R_RECOVERABLE */
111170222Sdougb	"unknown opt attribute record",	       /*%< 64 DNS_R_UNKNOWNOPT */
112135446Strhodes
113170222Sdougb	"unexpected message id",	       /*%< 65 DNS_R_UNEXPECTEDID */
114170222Sdougb	"seen include file",		       /*%< 66 DNS_R_SEENINCLUDE */
115170222Sdougb	"not exact",		       	       /*%< 67 DNS_R_NOTEXACT */
116170222Sdougb	"address blackholed",	       	       /*%< 68 DNS_R_BLACKHOLED */
117170222Sdougb	"bad algorithm",		       /*%< 69 DNS_R_BADALG */
118135446Strhodes
119170222Sdougb	"invalid use of a meta type",	       /*%< 70 DNS_R_METATYPE */
120170222Sdougb	"CNAME and other data",		       /*%< 71 DNS_R_CNAMEANDOTHER */
121170222Sdougb	"multiple RRs of singleton type",      /*%< 72 DNS_R_SINGLETON */
122170222Sdougb	"hint nxrrset",			       /*%< 73 DNS_R_HINTNXRRSET */
123170222Sdougb	"no master file configured",	       /*%< 74 DNS_R_NOMASTERFILE */
124135446Strhodes
125170222Sdougb	"unknown protocol",		       /*%< 75 DNS_R_UNKNOWNPROTO */
126170222Sdougb	"clocks are unsynchronized",	       /*%< 76 DNS_R_CLOCKSKEW */
127170222Sdougb	"IXFR failed",			       /*%< 77 DNS_R_BADIXFR */
128170222Sdougb	"not authoritative",		       /*%< 78 DNS_R_NOTAUTHORITATIVE */
129170222Sdougb	"no valid KEY",		       	       /*%< 79 DNS_R_NOVALIDKEY */
130135446Strhodes
131170222Sdougb	"obsolete",			       /*%< 80 DNS_R_OBSOLETE */
132170222Sdougb	"already frozen",		       /*%< 81 DNS_R_FROZEN */
133170222Sdougb	"unknown flag",			       /*%< 82 DNS_R_UNKNOWNFLAG */
134170222Sdougb	"expected a response",		       /*%< 83 DNS_R_EXPECTEDRESPONSE */
135170222Sdougb	"no valid DS",			       /*%< 84 DNS_R_NOVALIDDS */
136135446Strhodes
137170222Sdougb	"NS is an address",		       /*%< 85 DNS_R_NSISADDRESS */
138170222Sdougb	"received FORMERR",		       /*%< 86 DNS_R_REMOTEFORMERR */
139170222Sdougb	"truncated TCP response",	       /*%< 87 DNS_R_TRUNCATEDTCP */
140170222Sdougb	"lame server detected",		       /*%< 88 DNS_R_LAME */
141170222Sdougb	"unexpected RCODE",		       /*%< 89 DNS_R_UNEXPECTEDRCODE */
142135446Strhodes
143170222Sdougb	"unexpected OPCODE",		       /*%< 90 DNS_R_UNEXPECTEDOPCODE */
144170222Sdougb	"chase DS servers",		       /*%< 91 DNS_R_CHASEDSSERVERS */
145170222Sdougb	"empty name",			       /*%< 92 DNS_R_EMPTYNAME */
146170222Sdougb	"empty wild",			       /*%< 93 DNS_R_EMPTYWILD */
147170222Sdougb	"bad bitmap",			       /*%< 94 DNS_R_BADBITMAP */
148135446Strhodes
149170222Sdougb	"from wildcard",		       /*%< 95 DNS_R_FROMWILDCARD */
150170222Sdougb	"bad owner name (check-names)",	       /*%< 96 DNS_R_BADOWNERNAME */
151170222Sdougb	"bad name (check-names)",	       /*%< 97 DNS_R_BADNAME */
152170222Sdougb	"dynamic zone",			       /*%< 98 DNS_R_DYNAMIC */
153170222Sdougb	"unknown command",		       /*%< 99 DNS_R_UNKNOWNCOMMAND */
154135446Strhodes
155170222Sdougb	"must-be-secure",		       /*%< 100 DNS_R_MUSTBESECURE */
156170222Sdougb	"covering NSEC record returned",       /*%< 101 DNS_R_COVERINGNSEC */
157170222Sdougb	"MX is an address",		       /*%< 102 DNS_R_MXISADDRESS */
158193149Sdougb	"duplicate query",		       /*%< 103 DNS_R_DUPLICATE */
159193149Sdougb	"invalid NSEC3 owner name (wildcard)", /*%< 104 DNS_R_INVALIDNSEC3 */
160205292Sdougb
161205292Sdougb	"not master",			       /*%< 105 DNS_R_NOTMASTER */
162205292Sdougb	"broken trust chain",		       /*%< 106 DNS_R_BROKENCHAIN */
163254402Serwin	"expired",			       /*%< 107 DNS_R_EXPIRED */
164254402Serwin	"not dynamic",			       /*%< 108 DNS_R_NOTDYNAMIC */
165254402Serwin	"bad EUI"			       /*%< 109 DNS_R_BADEUI */
166135446Strhodes};
167135446Strhodes
168135446Strhodesstatic const char *rcode_text[DNS_R_NRCODERESULTS] = {
169170222Sdougb	"NOERROR",				/*%< 0 DNS_R_NOEROR */
170170222Sdougb	"FORMERR",				/*%< 1 DNS_R_FORMERR */
171170222Sdougb	"SERVFAIL",				/*%< 2 DNS_R_SERVFAIL */
172170222Sdougb	"NXDOMAIN",				/*%< 3 DNS_R_NXDOMAIN */
173170222Sdougb	"NOTIMP",				/*%< 4 DNS_R_NOTIMP */
174135446Strhodes
175170222Sdougb	"REFUSED",				/*%< 5 DNS_R_REFUSED */
176170222Sdougb	"YXDOMAIN",				/*%< 6 DNS_R_YXDOMAIN */
177170222Sdougb	"YXRRSET",				/*%< 7 DNS_R_YXRRSET */
178170222Sdougb	"NXRRSET",				/*%< 8 DNS_R_NXRRSET */
179170222Sdougb	"NOTAUTH",				/*%< 9 DNS_R_NOTAUTH */
180135446Strhodes
181170222Sdougb	"NOTZONE",				/*%< 10 DNS_R_NOTZONE */
182170222Sdougb	"<rcode 11>",				/*%< 11 has no macro */
183170222Sdougb	"<rcode 12>",				/*%< 12 has no macro */
184170222Sdougb	"<rcode 13>",				/*%< 13 has no macro */
185170222Sdougb	"<rcode 14>",				/*%< 14 has no macro */
186135446Strhodes
187170222Sdougb	"<rcode 15>",				/*%< 15 has no macro */
188170222Sdougb	"BADVERS",				/*%< 16 DNS_R_BADVERS */
189135446Strhodes};
190135446Strhodes
191135446Strhodes#define DNS_RESULT_RESULTSET			2
192135446Strhodes#define DNS_RESULT_RCODERESULTSET		3
193135446Strhodes
194135446Strhodesstatic isc_once_t		once = ISC_ONCE_INIT;
195135446Strhodes
196135446Strhodesstatic void
197135446Strhodesinitialize_action(void) {
198135446Strhodes	isc_result_t result;
199135446Strhodes
200135446Strhodes	result = isc_result_register(ISC_RESULTCLASS_DNS, DNS_R_NRESULTS,
201135446Strhodes				     text, dns_msgcat, DNS_RESULT_RESULTSET);
202135446Strhodes	if (result == ISC_R_SUCCESS)
203135446Strhodes		result = isc_result_register(ISC_RESULTCLASS_DNSRCODE,
204135446Strhodes					     DNS_R_NRCODERESULTS,
205135446Strhodes					     rcode_text, dns_msgcat,
206135446Strhodes					     DNS_RESULT_RCODERESULTSET);
207135446Strhodes	if (result != ISC_R_SUCCESS)
208135446Strhodes		UNEXPECTED_ERROR(__FILE__, __LINE__,
209135446Strhodes				 "isc_result_register() failed: %u", result);
210135446Strhodes}
211135446Strhodes
212135446Strhodesstatic void
213135446Strhodesinitialize(void) {
214135446Strhodes	dns_lib_initmsgcat();
215135446Strhodes	RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
216135446Strhodes}
217135446Strhodes
218135446Strhodesconst char *
219135446Strhodesdns_result_totext(isc_result_t result) {
220135446Strhodes	initialize();
221135446Strhodes
222135446Strhodes	return (isc_result_totext(result));
223135446Strhodes}
224135446Strhodes
225135446Strhodesvoid
226135446Strhodesdns_result_register(void) {
227135446Strhodes	initialize();
228135446Strhodes}
229135446Strhodes
230135446Strhodesdns_rcode_t
231135446Strhodesdns_result_torcode(isc_result_t result) {
232135446Strhodes	dns_rcode_t rcode = dns_rcode_servfail;
233135446Strhodes
234135446Strhodes	if (DNS_RESULT_ISRCODE(result)) {
235135446Strhodes		/*
236135446Strhodes		 * Rcodes can't be bigger than 12 bits, which is why we
237135446Strhodes		 * AND with 0xFFF instead of 0xFFFF.
238135446Strhodes		 */
239135446Strhodes		return ((dns_rcode_t)((result) & 0xFFF));
240135446Strhodes	}
241135446Strhodes	/*
242135446Strhodes	 * Try to supply an appropriate rcode.
243135446Strhodes	 */
244135446Strhodes	switch (result) {
245135446Strhodes	case ISC_R_SUCCESS:
246135446Strhodes		rcode = dns_rcode_noerror;
247135446Strhodes		break;
248135446Strhodes	case ISC_R_BADBASE64:
249135446Strhodes	case ISC_R_NOSPACE:
250135446Strhodes	case ISC_R_RANGE:
251135446Strhodes	case ISC_R_UNEXPECTEDEND:
252135446Strhodes	case DNS_R_BADAAAA:
253135446Strhodes	/* case DNS_R_BADBITSTRING: deprecated */
254135446Strhodes	case DNS_R_BADCKSUM:
255135446Strhodes	case DNS_R_BADCLASS:
256135446Strhodes	case DNS_R_BADLABELTYPE:
257135446Strhodes	case DNS_R_BADPOINTER:
258135446Strhodes	case DNS_R_BADTTL:
259135446Strhodes	case DNS_R_BADZONE:
260135446Strhodes	/* case DNS_R_BITSTRINGTOOLONG: deprecated */
261135446Strhodes	case DNS_R_EXTRADATA:
262135446Strhodes	case DNS_R_LABELTOOLONG:
263135446Strhodes	case DNS_R_NOREDATA:
264135446Strhodes	case DNS_R_SYNTAX:
265135446Strhodes	case DNS_R_TEXTTOOLONG:
266135446Strhodes	case DNS_R_TOOMANYHOPS:
267135446Strhodes	case DNS_R_TSIGERRORSET:
268135446Strhodes	case DNS_R_UNKNOWN:
269254402Serwin	case DNS_R_NAMETOOLONG:
270135446Strhodes		rcode = dns_rcode_formerr;
271135446Strhodes		break;
272135446Strhodes	case DNS_R_DISALLOWED:
273135446Strhodes		rcode = dns_rcode_refused;
274135446Strhodes		break;
275135446Strhodes	case DNS_R_TSIGVERIFYFAILURE:
276135446Strhodes	case DNS_R_CLOCKSKEW:
277135446Strhodes		rcode = dns_rcode_notauth;
278135446Strhodes		break;
279135446Strhodes	default:
280135446Strhodes		rcode = dns_rcode_servfail;
281135446Strhodes	}
282135446Strhodes
283135446Strhodes	return (rcode);
284135446Strhodes}
285