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