result.c revision 218384
1193326Sed/*
2193326Sed * Copyright (C) 2004, 2005, 2007, 2008, 2010  Internet Systems Consortium, Inc. ("ISC")
3193326Sed * Copyright (C) 1998-2003  Internet Software Consortium.
4193326Sed *
5193326Sed * Permission to use, copy, modify, and/or distribute this software for any
6193326Sed * purpose with or without fee is hereby granted, provided that the above
7193326Sed * copyright notice and this permission notice appear in all copies.
8193326Sed *
9193326Sed * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10193326Sed * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11193326Sed * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12193326Sed * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13193326Sed * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14193326Sed * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15201361Srdivacky * PERFORMANCE OF THIS SOFTWARE.
16193326Sed */
17193326Sed
18193326Sed/* $Id: result.c,v 1.125.48.2 2010-02-25 10:56:41 tbox Exp $ */
19198092Srdivacky
20193326Sed/*! \file */
21193326Sed
22193326Sed#include <config.h>
23194179Sed
24193326Sed#include <isc/once.h>
25193326Sed#include <isc/util.h>
26198893Srdivacky
27193326Sed#include <dns/result.h>
28193326Sed#include <dns/lib.h>
29198893Srdivacky
30198092Srdivackystatic const char *text[DNS_R_NRESULTS] = {
31198092Srdivacky	"label too long",		       /*%< 0 DNS_R_LABELTOOLONG */
32193326Sed	"bad escape",			       /*%< 1 DNS_R_BADESCAPE */
33193326Sed	/*!
34193326Sed	 * Note that DNS_R_BADBITSTRING and DNS_R_BITSTRINGTOOLONG are
35193326Sed	 * deprecated.
36193326Sed	 */
37193326Sed	"bad bitstring",		       /*%< 2 DNS_R_BADBITSTRING */
38193326Sed	"bitstring too long",		       /*%< 3 DNS_R_BITSTRINGTOOLONG */
39199482Srdivacky	"empty label",			       /*%< 4 DNS_R_EMPTYLABEL */
40193326Sed
41194179Sed	"bad dotted quad",		       /*%< 5 DNS_R_BADDOTTEDQUAD */
42198092Srdivacky	"invalid NS owner name (wildcard)",    /*%< 6 DNS_R_INVALIDNS */
43198092Srdivacky	"unknown class/type",		       /*%< 7 DNS_R_UNKNOWN */
44198092Srdivacky	"bad label type",		       /*%< 8 DNS_R_BADLABELTYPE */
45198398Srdivacky	"bad compression pointer",	       /*%< 9 DNS_R_BADPOINTER */
46198398Srdivacky
47198092Srdivacky	"too many hops",		       /*%< 10 DNS_R_TOOMANYHOPS */
48195341Sed	"disallowed (by application policy)",  /*%< 11 DNS_R_DISALLOWED */
49198092Srdivacky	"extra input text",		       /*%< 12 DNS_R_EXTRATOKEN */
50198092Srdivacky	"extra input data",		       /*%< 13 DNS_R_EXTRADATA */
51198092Srdivacky	"text too long",		       /*%< 14 DNS_R_TEXTTOOLONG */
52199990Srdivacky
53198092Srdivacky	"not at top of zone",		       /*%< 15 DNS_R_NOTZONETOP */
54198092Srdivacky	"syntax error",			       /*%< 16 DNS_R_SYNTAX */
55193326Sed	"bad checksum",			       /*%< 17 DNS_R_BADCKSUM */
56193326Sed	"bad IPv6 address",		       /*%< 18 DNS_R_BADAAAA */
57193326Sed	"no owner",			       /*%< 19 DNS_R_NOOWNER */
58193326Sed
59201361Srdivacky	"no ttl",			       /*%< 20 DNS_R_NOTTL */
60201361Srdivacky	"bad class",			       /*%< 21 DNS_R_BADCLASS */
61201361Srdivacky	"name too long",		       /*%< 22 DNS_R_NAMETOOLONG */
62201361Srdivacky	"partial match",		       /*%< 23 DNS_R_PARTIALMATCH */
63201361Srdivacky	"new origin",			       /*%< 24 DNS_R_NEWORIGIN */
64201361Srdivacky
65193326Sed	"unchanged",			       /*%< 25 DNS_R_UNCHANGED */
66201361Srdivacky	"bad ttl",			       /*%< 26 DNS_R_BADTTL */
67201361Srdivacky	"more data needed/to be rendered",     /*%< 27 DNS_R_NOREDATA */
68201361Srdivacky	"continue",			       /*%< 28 DNS_R_CONTINUE */
69198092Srdivacky	"delegation",			       /*%< 29 DNS_R_DELEGATION */
70201361Srdivacky
71198092Srdivacky	"glue",				       /*%< 30 DNS_R_GLUE */
72198092Srdivacky	"dname",			       /*%< 31 DNS_R_DNAME */
73201361Srdivacky	"cname",			       /*%< 32 DNS_R_CNAME */
74201361Srdivacky	"bad database",			       /*%< 33 DNS_R_BADDB */
75201361Srdivacky	"zonecut",			       /*%< 34 DNS_R_ZONECUT */
76201361Srdivacky
77201361Srdivacky	"bad zone",			       /*%< 35 DNS_R_BADZONE */
78193326Sed	"more data",			       /*%< 36 DNS_R_MOREDATA */
79193326Sed	"up to date",			       /*%< 37 DNS_R_UPTODATE */
80201361Srdivacky	"tsig verify failure",		       /*%< 38 DNS_R_TSIGVERIFYFAILURE */
81201361Srdivacky	"tsig indicates error",		       /*%< 39 DNS_R_TSIGERRORSET */
82201361Srdivacky
83201361Srdivacky	"RRSIG failed to verify",	       /*%< 40 DNS_R_SIGINVALID */
84201361Srdivacky	"RRSIG has expired",		       /*%< 41 DNS_R_SIGEXPIRED */
85201361Srdivacky	"RRSIG validity period has not begun", /*%< 42 DNS_R_SIGFUTURE */
86193326Sed	"key is unauthorized to sign data",    /*%< 43 DNS_R_KEYUNAUTHORIZED */
87193326Sed	"invalid time",			       /*%< 44 DNS_R_INVALIDTIME */
88193326Sed
89193326Sed	"expected a TSIG or SIG(0)",	       /*%< 45 DNS_R_EXPECTEDTSIG */
90193326Sed	"did not expect a TSIG or SIG(0)",     /*%< 46 DNS_R_UNEXPECTEDTSIG */
91198092Srdivacky	"TKEY is unacceptable",		       /*%< 47 DNS_R_INVALIDTKEY */
92201361Srdivacky	"hint",				       /*%< 48 DNS_R_HINT */
93201361Srdivacky	"drop",				       /*%< 49 DNS_R_DROP */
94193326Sed
95201361Srdivacky	"zone not loaded",		       /*%< 50 DNS_R_NOTLOADED */
96193326Sed	"ncache nxdomain",		       /*%< 51 DNS_R_NCACHENXDOMAIN */
97193326Sed	"ncache nxrrset",		       /*%< 52 DNS_R_NCACHENXRRSET */
98193326Sed	"wait",				       /*%< 53 DNS_R_WAIT */
99193326Sed	"not verified yet",		       /*%< 54 DNS_R_NOTVERIFIEDYET */
100193326Sed
101193326Sed	"no identity",			       /*%< 55 DNS_R_NOIDENTITY */
102193326Sed	"no journal",			       /*%< 56 DNS_R_NOJOURNAL */
103198092Srdivacky	"alias",			       /*%< 57 DNS_R_ALIAS */
104193326Sed	"use TCP",			       /*%< 58 DNS_R_USETCP */
105193326Sed	"no valid RRSIG",		       /*%< 59 DNS_R_NOVALIDSIG */
106193326Sed
107193326Sed	"no valid NSEC",		       /*%< 60 DNS_R_NOVALIDNSEC */
108193326Sed	"not insecure",			       /*%< 61 DNS_R_NOTINSECURE */
109193326Sed	"unknown service",		       /*%< 62 DNS_R_UNKNOWNSERVICE */
110193326Sed	"recoverable error occurred",	       /*%< 63 DNS_R_RECOVERABLE */
111193326Sed	"unknown opt attribute record",	       /*%< 64 DNS_R_UNKNOWNOPT */
112193326Sed
113198092Srdivacky	"unexpected message id",	       /*%< 65 DNS_R_UNEXPECTEDID */
114193326Sed	"seen include file",		       /*%< 66 DNS_R_SEENINCLUDE */
115193326Sed	"not exact",		       	       /*%< 67 DNS_R_NOTEXACT */
116193326Sed	"address blackholed",	       	       /*%< 68 DNS_R_BLACKHOLED */
117193326Sed	"bad algorithm",		       /*%< 69 DNS_R_BADALG */
118193326Sed
119193326Sed	"invalid use of a meta type",	       /*%< 70 DNS_R_METATYPE */
120193326Sed	"CNAME and other data",		       /*%< 71 DNS_R_CNAMEANDOTHER */
121193326Sed	"multiple RRs of singleton type",      /*%< 72 DNS_R_SINGLETON */
122193326Sed	"hint nxrrset",			       /*%< 73 DNS_R_HINTNXRRSET */
123193326Sed	"no master file configured",	       /*%< 74 DNS_R_NOMASTERFILE */
124193326Sed
125193326Sed	"unknown protocol",		       /*%< 75 DNS_R_UNKNOWNPROTO */
126193326Sed	"clocks are unsynchronized",	       /*%< 76 DNS_R_CLOCKSKEW */
127193326Sed	"IXFR failed",			       /*%< 77 DNS_R_BADIXFR */
128193326Sed	"not authoritative",		       /*%< 78 DNS_R_NOTAUTHORITATIVE */
129193326Sed	"no valid KEY",		       	       /*%< 79 DNS_R_NOVALIDKEY */
130193326Sed
131193326Sed	"obsolete",			       /*%< 80 DNS_R_OBSOLETE */
132193326Sed	"already frozen",		       /*%< 81 DNS_R_FROZEN */
133198092Srdivacky	"unknown flag",			       /*%< 82 DNS_R_UNKNOWNFLAG */
134193326Sed	"expected a response",		       /*%< 83 DNS_R_EXPECTEDRESPONSE */
135193326Sed	"no valid DS",			       /*%< 84 DNS_R_NOVALIDDS */
136193326Sed
137193326Sed	"NS is an address",		       /*%< 85 DNS_R_NSISADDRESS */
138193326Sed	"received FORMERR",		       /*%< 86 DNS_R_REMOTEFORMERR */
139193326Sed	"truncated TCP response",	       /*%< 87 DNS_R_TRUNCATEDTCP */
140193326Sed	"lame server detected",		       /*%< 88 DNS_R_LAME */
141193326Sed	"unexpected RCODE",		       /*%< 89 DNS_R_UNEXPECTEDRCODE */
142193326Sed
143198893Srdivacky	"unexpected OPCODE",		       /*%< 90 DNS_R_UNEXPECTEDOPCODE */
144198092Srdivacky	"chase DS servers",		       /*%< 91 DNS_R_CHASEDSSERVERS */
145198893Srdivacky	"empty name",			       /*%< 92 DNS_R_EMPTYNAME */
146198092Srdivacky	"empty wild",			       /*%< 93 DNS_R_EMPTYWILD */
147193326Sed	"bad bitmap",			       /*%< 94 DNS_R_BADBITMAP */
148193326Sed
149193326Sed	"from wildcard",		       /*%< 95 DNS_R_FROMWILDCARD */
150193326Sed	"bad owner name (check-names)",	       /*%< 96 DNS_R_BADOWNERNAME */
151198092Srdivacky	"bad name (check-names)",	       /*%< 97 DNS_R_BADNAME */
152193326Sed	"dynamic zone",			       /*%< 98 DNS_R_DYNAMIC */
153193326Sed	"unknown command",		       /*%< 99 DNS_R_UNKNOWNCOMMAND */
154198092Srdivacky
155193326Sed	"must-be-secure",		       /*%< 100 DNS_R_MUSTBESECURE */
156193326Sed	"covering NSEC record returned",       /*%< 101 DNS_R_COVERINGNSEC */
157193326Sed	"MX is an address",		       /*%< 102 DNS_R_MXISADDRESS */
158193576Sed	"duplicate query",		       /*%< 103 DNS_R_DUPLICATE */
159193326Sed	"invalid NSEC3 owner name (wildcard)", /*%< 104 DNS_R_INVALIDNSEC3 */
160193326Sed
161193326Sed	"not master",			       /*%< 105 DNS_R_NOTMASTER */
162193326Sed	"broken trust chain",		       /*%< 106 DNS_R_BROKENCHAIN */
163193326Sed};
164193326Sed
165193326Sedstatic const char *rcode_text[DNS_R_NRCODERESULTS] = {
166193326Sed	"NOERROR",				/*%< 0 DNS_R_NOEROR */
167193326Sed	"FORMERR",				/*%< 1 DNS_R_FORMERR */
168198092Srdivacky	"SERVFAIL",				/*%< 2 DNS_R_SERVFAIL */
169193326Sed	"NXDOMAIN",				/*%< 3 DNS_R_NXDOMAIN */
170193326Sed	"NOTIMP",				/*%< 4 DNS_R_NOTIMP */
171193326Sed
172193326Sed	"REFUSED",				/*%< 5 DNS_R_REFUSED */
173193326Sed	"YXDOMAIN",				/*%< 6 DNS_R_YXDOMAIN */
174193326Sed	"YXRRSET",				/*%< 7 DNS_R_YXRRSET */
175198092Srdivacky	"NXRRSET",				/*%< 8 DNS_R_NXRRSET */
176193326Sed	"NOTAUTH",				/*%< 9 DNS_R_NOTAUTH */
177193326Sed
178193326Sed	"NOTZONE",				/*%< 10 DNS_R_NOTZONE */
179193326Sed	"<rcode 11>",				/*%< 11 has no macro */
180193326Sed	"<rcode 12>",				/*%< 12 has no macro */
181193326Sed	"<rcode 13>",				/*%< 13 has no macro */
182193326Sed	"<rcode 14>",				/*%< 14 has no macro */
183193326Sed
184193326Sed	"<rcode 15>",				/*%< 15 has no macro */
185193326Sed	"BADVERS",				/*%< 16 DNS_R_BADVERS */
186193326Sed};
187193326Sed
188193326Sed#define DNS_RESULT_RESULTSET			2
189193326Sed#define DNS_RESULT_RCODERESULTSET		3
190198092Srdivacky
191198092Srdivackystatic isc_once_t		once = ISC_ONCE_INIT;
192198092Srdivacky
193198092Srdivackystatic void
194198092Srdivackyinitialize_action(void) {
195198092Srdivacky	isc_result_t result;
196198092Srdivacky
197198092Srdivacky	result = isc_result_register(ISC_RESULTCLASS_DNS, DNS_R_NRESULTS,
198198092Srdivacky				     text, dns_msgcat, DNS_RESULT_RESULTSET);
199198092Srdivacky	if (result == ISC_R_SUCCESS)
200193326Sed		result = isc_result_register(ISC_RESULTCLASS_DNSRCODE,
201193326Sed					     DNS_R_NRCODERESULTS,
202193326Sed					     rcode_text, dns_msgcat,
203193326Sed					     DNS_RESULT_RCODERESULTSET);
204193326Sed	if (result != ISC_R_SUCCESS)
205193326Sed		UNEXPECTED_ERROR(__FILE__, __LINE__,
206193326Sed				 "isc_result_register() failed: %u", result);
207193326Sed}
208193326Sed
209193326Sedstatic void
210198092Srdivackyinitialize(void) {
211195099Sed	dns_lib_initmsgcat();
212195099Sed	RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
213198092Srdivacky}
214193326Sed
215193326Sedconst char *
216193326Seddns_result_totext(isc_result_t result) {
217193326Sed	initialize();
218193326Sed
219193326Sed	return (isc_result_totext(result));
220198092Srdivacky}
221198092Srdivacky
222198092Srdivackyvoid
223198092Srdivackydns_result_register(void) {
224199990Srdivacky	initialize();
225198092Srdivacky}
226199990Srdivacky
227198092Srdivackydns_rcode_t
228198092Srdivackydns_result_torcode(isc_result_t result) {
229199990Srdivacky	dns_rcode_t rcode = dns_rcode_servfail;
230198092Srdivacky
231193326Sed	if (DNS_RESULT_ISRCODE(result)) {
232198092Srdivacky		/*
233193326Sed		 * Rcodes can't be bigger than 12 bits, which is why we
234193326Sed		 * AND with 0xFFF instead of 0xFFFF.
235193326Sed		 */
236193326Sed		return ((dns_rcode_t)((result) & 0xFFF));
237193326Sed	}
238193326Sed	/*
239193326Sed	 * Try to supply an appropriate rcode.
240198092Srdivacky	 */
241198112Srdivacky	switch (result) {
242198092Srdivacky	case ISC_R_SUCCESS:
243198112Srdivacky		rcode = dns_rcode_noerror;
244198092Srdivacky		break;
245198092Srdivacky	case ISC_R_BADBASE64:
246198092Srdivacky	case ISC_R_NOSPACE:
247198092Srdivacky	case ISC_R_RANGE:
248198092Srdivacky	case ISC_R_UNEXPECTEDEND:
249198092Srdivacky	case DNS_R_BADAAAA:
250198092Srdivacky	/* case DNS_R_BADBITSTRING: deprecated */
251198092Srdivacky	case DNS_R_BADCKSUM:
252198092Srdivacky	case DNS_R_BADCLASS:
253198092Srdivacky	case DNS_R_BADLABELTYPE:
254198092Srdivacky	case DNS_R_BADPOINTER:
255198092Srdivacky	case DNS_R_BADTTL:
256198092Srdivacky	case DNS_R_BADZONE:
257198092Srdivacky	/* case DNS_R_BITSTRINGTOOLONG: deprecated */
258198092Srdivacky	case DNS_R_EXTRADATA:
259198092Srdivacky	case DNS_R_LABELTOOLONG:
260198092Srdivacky	case DNS_R_NOREDATA:
261198092Srdivacky	case DNS_R_SYNTAX:
262199482Srdivacky	case DNS_R_TEXTTOOLONG:
263200583Srdivacky	case DNS_R_TOOMANYHOPS:
264199482Srdivacky	case DNS_R_TSIGERRORSET:
265200583Srdivacky	case DNS_R_UNKNOWN:
266200583Srdivacky		rcode = dns_rcode_formerr;
267198092Srdivacky		break;
268198092Srdivacky	case DNS_R_DISALLOWED:
269198092Srdivacky		rcode = dns_rcode_refused;
270198092Srdivacky		break;
271198092Srdivacky	case DNS_R_TSIGVERIFYFAILURE:
272198092Srdivacky	case DNS_R_CLOCKSKEW:
273200583Srdivacky		rcode = dns_rcode_notauth;
274200583Srdivacky		break;
275200583Srdivacky	default:
276200583Srdivacky		rcode = dns_rcode_servfail;
277200583Srdivacky	}
278200583Srdivacky
279200583Srdivacky	return (rcode);
280198092Srdivacky}
281198092Srdivacky