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