%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/cares/src/lib/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/cares/src/lib/ares_dns_mapping.c |
/* MIT License * * Copyright (c) 2023 Brad House * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * SPDX-License-Identifier: MIT */ #include "ares_setup.h" #include "ares.h" #include "ares_private.h" ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode) { switch (opcode) { case ARES_OPCODE_QUERY: case ARES_OPCODE_IQUERY: case ARES_OPCODE_STATUS: case ARES_OPCODE_NOTIFY: case ARES_OPCODE_UPDATE: return ARES_TRUE; } return ARES_FALSE; } ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode) { switch (rcode) { case ARES_RCODE_NOERROR: case ARES_RCODE_FORMERR: case ARES_RCODE_SERVFAIL: case ARES_RCODE_NXDOMAIN: case ARES_RCODE_NOTIMP: case ARES_RCODE_REFUSED: case ARES_RCODE_YXDOMAIN: case ARES_RCODE_YXRRSET: case ARES_RCODE_NXRRSET: case ARES_RCODE_NOTAUTH: case ARES_RCODE_NOTZONE: case ARES_RCODE_DSOTYPEI: case ARES_RCODE_BADSIG: case ARES_RCODE_BADKEY: case ARES_RCODE_BADTIME: case ARES_RCODE_BADMODE: case ARES_RCODE_BADNAME: case ARES_RCODE_BADALG: case ARES_RCODE_BADTRUNC: case ARES_RCODE_BADCOOKIE: return ARES_TRUE; } return ARES_FALSE; } ares_bool_t ares_dns_flags_arevalid(unsigned short flags) { unsigned short allflags = ARES_FLAG_QR | ARES_FLAG_AA | ARES_FLAG_TC | ARES_FLAG_RD | ARES_FLAG_RA | ARES_FLAG_AD | ARES_FLAG_CD; if (flags & ~allflags) { return ARES_FALSE; } return ARES_TRUE; } ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type, ares_bool_t is_query) { switch (type) { case ARES_REC_TYPE_A: case ARES_REC_TYPE_NS: case ARES_REC_TYPE_CNAME: case ARES_REC_TYPE_SOA: case ARES_REC_TYPE_PTR: case ARES_REC_TYPE_HINFO: case ARES_REC_TYPE_MX: case ARES_REC_TYPE_TXT: case ARES_REC_TYPE_AAAA: case ARES_REC_TYPE_SRV: case ARES_REC_TYPE_NAPTR: case ARES_REC_TYPE_OPT: case ARES_REC_TYPE_TLSA: case ARES_REC_TYPE_SVCB: case ARES_REC_TYPE_HTTPS: case ARES_REC_TYPE_ANY: case ARES_REC_TYPE_URI: case ARES_REC_TYPE_CAA: return ARES_TRUE; case ARES_REC_TYPE_RAW_RR: return is_query ? ARES_FALSE : ARES_TRUE; default: break; } return is_query ? ARES_TRUE : ARES_FALSE; } ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type) { /* Only record types defined in RFC1035 allow name compression within the * RDATA. Otherwise nameservers that don't understand an RR may not be * able to pass along the RR in a proper manner */ switch (type) { case ARES_REC_TYPE_A: case ARES_REC_TYPE_NS: case ARES_REC_TYPE_CNAME: case ARES_REC_TYPE_SOA: case ARES_REC_TYPE_PTR: case ARES_REC_TYPE_HINFO: case ARES_REC_TYPE_MX: case ARES_REC_TYPE_TXT: return ARES_TRUE; default: break; } return ARES_FALSE; } ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, ares_bool_t is_query) { switch (qclass) { case ARES_CLASS_IN: case ARES_CLASS_CHAOS: case ARES_CLASS_HESOID: case ARES_CLASS_NONE: return ARES_TRUE; case ARES_CLASS_ANY: return is_query ? ARES_TRUE : ARES_FALSE; } return ARES_FALSE; } ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect) { switch (sect) { case ARES_SECTION_ANSWER: case ARES_SECTION_AUTHORITY: case ARES_SECTION_ADDITIONAL: return ARES_TRUE; } return ARES_FALSE; } ares_dns_rec_type_t ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key) { /* NOTE: due to the way we've numerated the keys, we can simply divide by * 100 to get the type rather than having to do a huge switch * statement. That said, we do then validate the type returned is * valid in case something completely bogus is passed in */ ares_dns_rec_type_t type = key / 100; if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) { return 0; } return type; } const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type) { switch (type) { case ARES_REC_TYPE_A: return "A"; case ARES_REC_TYPE_NS: return "NS"; case ARES_REC_TYPE_CNAME: return "CNAME"; case ARES_REC_TYPE_SOA: return "SOA"; case ARES_REC_TYPE_PTR: return "PTR"; case ARES_REC_TYPE_HINFO: return "HINFO"; case ARES_REC_TYPE_MX: return "MX"; case ARES_REC_TYPE_TXT: return "TXT"; case ARES_REC_TYPE_AAAA: return "AAAA"; case ARES_REC_TYPE_SRV: return "SRV"; case ARES_REC_TYPE_NAPTR: return "NAPTR"; case ARES_REC_TYPE_OPT: return "OPT"; case ARES_REC_TYPE_TLSA: return "TLSA"; case ARES_REC_TYPE_SVCB: return "SVCB"; case ARES_REC_TYPE_HTTPS: return "HTTPS"; case ARES_REC_TYPE_ANY: return "ANY"; case ARES_REC_TYPE_URI: return "URI"; case ARES_REC_TYPE_CAA: return "CAA"; case ARES_REC_TYPE_RAW_RR: return "RAWRR"; } return "UNKNOWN"; } const char *ares_dns_class_tostr(ares_dns_class_t qclass) { switch (qclass) { case ARES_CLASS_IN: return "IN"; case ARES_CLASS_CHAOS: return "CH"; case ARES_CLASS_HESOID: return "HS"; case ARES_CLASS_ANY: return "ANY"; case ARES_CLASS_NONE: return "NONE"; } return "UNKNOWN"; } const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode) { switch (opcode) { case ARES_OPCODE_QUERY: return "QUERY"; case ARES_OPCODE_IQUERY: return "IQUERY"; case ARES_OPCODE_STATUS: return "STATUS"; case ARES_OPCODE_NOTIFY: return "NOTIFY"; case ARES_OPCODE_UPDATE: return "UPDATE"; } return "UNKNOWN"; } const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key) { switch (key) { case ARES_RR_A_ADDR: return "ADDR"; case ARES_RR_NS_NSDNAME: return "NSDNAME"; case ARES_RR_CNAME_CNAME: return "CNAME"; case ARES_RR_SOA_MNAME: return "MNAME"; case ARES_RR_SOA_RNAME: return "RNAME"; case ARES_RR_SOA_SERIAL: return "SERIAL"; case ARES_RR_SOA_REFRESH: return "REFRESH"; case ARES_RR_SOA_RETRY: return "RETRY"; case ARES_RR_SOA_EXPIRE: return "EXPIRE"; case ARES_RR_SOA_MINIMUM: return "MINIMUM"; case ARES_RR_PTR_DNAME: return "DNAME"; case ARES_RR_AAAA_ADDR: return "ADDR"; case ARES_RR_HINFO_CPU: return "CPU"; case ARES_RR_HINFO_OS: return "OS"; case ARES_RR_MX_PREFERENCE: return "PREFERENCE"; case ARES_RR_MX_EXCHANGE: return "EXCHANGE"; case ARES_RR_TXT_DATA: return "DATA"; case ARES_RR_SRV_PRIORITY: return "PRIORITY"; case ARES_RR_SRV_WEIGHT: return "WEIGHT"; case ARES_RR_SRV_PORT: return "PORT"; case ARES_RR_SRV_TARGET: return "TARGET"; case ARES_RR_NAPTR_ORDER: return "ORDER"; case ARES_RR_NAPTR_PREFERENCE: return "PREFERENCE"; case ARES_RR_NAPTR_FLAGS: return "FLAGS"; case ARES_RR_NAPTR_SERVICES: return "SERVICES"; case ARES_RR_NAPTR_REGEXP: return "REGEXP"; case ARES_RR_NAPTR_REPLACEMENT: return "REPLACEMENT"; case ARES_RR_OPT_UDP_SIZE: return "UDP_SIZE"; case ARES_RR_OPT_VERSION: return "VERSION"; case ARES_RR_OPT_FLAGS: return "FLAGS"; case ARES_RR_OPT_OPTIONS: return "OPTIONS"; case ARES_RR_TLSA_CERT_USAGE: return "CERT_USAGE"; case ARES_RR_TLSA_SELECTOR: return "SELECTOR"; case ARES_RR_TLSA_MATCH: return "MATCH"; case ARES_RR_TLSA_DATA: return "DATA"; case ARES_RR_SVCB_PRIORITY: return "PRIORITY"; case ARES_RR_SVCB_TARGET: return "TARGET"; case ARES_RR_SVCB_PARAMS: return "PARAMS"; case ARES_RR_HTTPS_PRIORITY: return "PRIORITY"; case ARES_RR_HTTPS_TARGET: return "TARGET"; case ARES_RR_HTTPS_PARAMS: return "PARAMS"; case ARES_RR_URI_PRIORITY: return "PRIORITY"; case ARES_RR_URI_WEIGHT: return "WEIGHT"; case ARES_RR_URI_TARGET: return "TARGET"; case ARES_RR_CAA_CRITICAL: return "CRITICAL"; case ARES_RR_CAA_TAG: return "TAG"; case ARES_RR_CAA_VALUE: return "VALUE"; case ARES_RR_RAW_RR_TYPE: return "TYPE"; case ARES_RR_RAW_RR_DATA: return "DATA"; } return "UNKNOWN"; } ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key) { switch (key) { case ARES_RR_A_ADDR: return ARES_DATATYPE_INADDR; case ARES_RR_AAAA_ADDR: return ARES_DATATYPE_INADDR6; case ARES_RR_NS_NSDNAME: case ARES_RR_CNAME_CNAME: case ARES_RR_SOA_MNAME: case ARES_RR_SOA_RNAME: case ARES_RR_PTR_DNAME: case ARES_RR_MX_EXCHANGE: case ARES_RR_SRV_TARGET: case ARES_RR_SVCB_TARGET: case ARES_RR_HTTPS_TARGET: case ARES_RR_NAPTR_REPLACEMENT: case ARES_RR_URI_TARGET: return ARES_DATATYPE_NAME; case ARES_RR_HINFO_CPU: case ARES_RR_HINFO_OS: case ARES_RR_NAPTR_FLAGS: case ARES_RR_NAPTR_SERVICES: case ARES_RR_NAPTR_REGEXP: case ARES_RR_CAA_TAG: return ARES_DATATYPE_STR; case ARES_RR_SOA_SERIAL: case ARES_RR_SOA_REFRESH: case ARES_RR_SOA_RETRY: case ARES_RR_SOA_EXPIRE: case ARES_RR_SOA_MINIMUM: return ARES_DATATYPE_U32; case ARES_RR_MX_PREFERENCE: case ARES_RR_SRV_PRIORITY: case ARES_RR_SRV_WEIGHT: case ARES_RR_SRV_PORT: case ARES_RR_NAPTR_ORDER: case ARES_RR_NAPTR_PREFERENCE: case ARES_RR_OPT_UDP_SIZE: case ARES_RR_OPT_FLAGS: case ARES_RR_SVCB_PRIORITY: case ARES_RR_HTTPS_PRIORITY: case ARES_RR_URI_PRIORITY: case ARES_RR_URI_WEIGHT: case ARES_RR_RAW_RR_TYPE: return ARES_DATATYPE_U16; case ARES_RR_OPT_VERSION: case ARES_RR_TLSA_CERT_USAGE: case ARES_RR_TLSA_SELECTOR: case ARES_RR_TLSA_MATCH: case ARES_RR_CAA_CRITICAL: return ARES_DATATYPE_U8; case ARES_RR_CAA_VALUE: case ARES_RR_TXT_DATA: return ARES_DATATYPE_BINP; case ARES_RR_TLSA_DATA: case ARES_RR_RAW_RR_DATA: return ARES_DATATYPE_BIN; case ARES_RR_OPT_OPTIONS: case ARES_RR_SVCB_PARAMS: case ARES_RR_HTTPS_PARAMS: return ARES_DATATYPE_OPT; } return 0; } static const ares_dns_rr_key_t rr_a_keys[] = { ARES_RR_A_ADDR }; static const ares_dns_rr_key_t rr_ns_keys[] = { ARES_RR_NS_NSDNAME }; static const ares_dns_rr_key_t rr_cname_keys[] = { ARES_RR_CNAME_CNAME }; static const ares_dns_rr_key_t rr_soa_keys[] = { ARES_RR_SOA_MNAME, ARES_RR_SOA_RNAME, ARES_RR_SOA_SERIAL, ARES_RR_SOA_REFRESH, ARES_RR_SOA_RETRY, ARES_RR_SOA_EXPIRE, ARES_RR_SOA_MINIMUM }; static const ares_dns_rr_key_t rr_ptr_keys[] = { ARES_RR_PTR_DNAME }; static const ares_dns_rr_key_t rr_hinfo_keys[] = { ARES_RR_HINFO_CPU, ARES_RR_HINFO_OS }; static const ares_dns_rr_key_t rr_mx_keys[] = { ARES_RR_MX_PREFERENCE, ARES_RR_MX_EXCHANGE }; static const ares_dns_rr_key_t rr_txt_keys[] = { ARES_RR_TXT_DATA }; static const ares_dns_rr_key_t rr_aaaa_keys[] = { ARES_RR_AAAA_ADDR }; static const ares_dns_rr_key_t rr_srv_keys[] = { ARES_RR_SRV_PRIORITY, ARES_RR_SRV_WEIGHT, ARES_RR_SRV_PORT, ARES_RR_SRV_TARGET }; static const ares_dns_rr_key_t rr_naptr_keys[] = { ARES_RR_NAPTR_ORDER, ARES_RR_NAPTR_PREFERENCE, ARES_RR_NAPTR_FLAGS, ARES_RR_NAPTR_SERVICES, ARES_RR_NAPTR_REGEXP, ARES_RR_NAPTR_REPLACEMENT }; static const ares_dns_rr_key_t rr_opt_keys[] = { ARES_RR_OPT_UDP_SIZE, ARES_RR_OPT_VERSION, ARES_RR_OPT_FLAGS, ARES_RR_OPT_OPTIONS }; static const ares_dns_rr_key_t rr_tlsa_keys[] = { ARES_RR_TLSA_CERT_USAGE, ARES_RR_TLSA_SELECTOR, ARES_RR_TLSA_MATCH, ARES_RR_TLSA_DATA }; static const ares_dns_rr_key_t rr_svcb_keys[] = { ARES_RR_SVCB_PRIORITY, ARES_RR_SVCB_TARGET, ARES_RR_SVCB_PARAMS }; static const ares_dns_rr_key_t rr_https_keys[] = { ARES_RR_HTTPS_PRIORITY, ARES_RR_HTTPS_TARGET, ARES_RR_HTTPS_PARAMS }; static const ares_dns_rr_key_t rr_uri_keys[] = { ARES_RR_URI_PRIORITY, ARES_RR_URI_WEIGHT, ARES_RR_URI_TARGET }; static const ares_dns_rr_key_t rr_caa_keys[] = { ARES_RR_CAA_CRITICAL, ARES_RR_CAA_TAG, ARES_RR_CAA_VALUE }; static const ares_dns_rr_key_t rr_raw_rr_keys[] = { ARES_RR_RAW_RR_TYPE, ARES_RR_RAW_RR_DATA }; const ares_dns_rr_key_t *ares_dns_rr_get_keys(ares_dns_rec_type_t type, size_t *cnt) { if (cnt == NULL) { return NULL; } *cnt = 0; switch (type) { case ARES_REC_TYPE_A: *cnt = sizeof(rr_a_keys) / sizeof(*rr_a_keys); return rr_a_keys; case ARES_REC_TYPE_NS: *cnt = sizeof(rr_ns_keys) / sizeof(*rr_ns_keys); return rr_ns_keys; case ARES_REC_TYPE_CNAME: *cnt = sizeof(rr_cname_keys) / sizeof(*rr_cname_keys); return rr_cname_keys; case ARES_REC_TYPE_SOA: *cnt = sizeof(rr_soa_keys) / sizeof(*rr_soa_keys); return rr_soa_keys; case ARES_REC_TYPE_PTR: *cnt = sizeof(rr_ptr_keys) / sizeof(*rr_ptr_keys); return rr_ptr_keys; case ARES_REC_TYPE_HINFO: *cnt = sizeof(rr_hinfo_keys) / sizeof(*rr_hinfo_keys); return rr_hinfo_keys; case ARES_REC_TYPE_MX: *cnt = sizeof(rr_mx_keys) / sizeof(*rr_mx_keys); return rr_mx_keys; case ARES_REC_TYPE_TXT: *cnt = sizeof(rr_txt_keys) / sizeof(*rr_txt_keys); return rr_txt_keys; case ARES_REC_TYPE_AAAA: *cnt = sizeof(rr_aaaa_keys) / sizeof(*rr_aaaa_keys); return rr_aaaa_keys; case ARES_REC_TYPE_SRV: *cnt = sizeof(rr_srv_keys) / sizeof(*rr_srv_keys); return rr_srv_keys; case ARES_REC_TYPE_NAPTR: *cnt = sizeof(rr_naptr_keys) / sizeof(*rr_naptr_keys); return rr_naptr_keys; case ARES_REC_TYPE_OPT: *cnt = sizeof(rr_opt_keys) / sizeof(*rr_opt_keys); return rr_opt_keys; case ARES_REC_TYPE_TLSA: *cnt = sizeof(rr_tlsa_keys) / sizeof(*rr_tlsa_keys); return rr_tlsa_keys; case ARES_REC_TYPE_SVCB: *cnt = sizeof(rr_svcb_keys) / sizeof(*rr_svcb_keys); return rr_svcb_keys; case ARES_REC_TYPE_HTTPS: *cnt = sizeof(rr_https_keys) / sizeof(*rr_https_keys); return rr_https_keys; case ARES_REC_TYPE_ANY: /* Not real */ break; case ARES_REC_TYPE_URI: *cnt = sizeof(rr_uri_keys) / sizeof(*rr_uri_keys); return rr_uri_keys; case ARES_REC_TYPE_CAA: *cnt = sizeof(rr_caa_keys) / sizeof(*rr_caa_keys); return rr_caa_keys; case ARES_REC_TYPE_RAW_RR: *cnt = sizeof(rr_raw_rr_keys) / sizeof(*rr_raw_rr_keys); return rr_raw_rr_keys; } return NULL; } ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str) { size_t i; static const struct { const char *name; ares_dns_class_t qclass; } list[] = { {"IN", ARES_CLASS_IN }, { "CH", ARES_CLASS_CHAOS }, { "HS", ARES_CLASS_HESOID}, { "NONE", ARES_CLASS_NONE }, { "ANY", ARES_CLASS_ANY }, { NULL, 0 } }; if (qclass == NULL || str == NULL) { return ARES_FALSE; } for (i = 0; list[i].name != NULL; i++) { if (strcasecmp(list[i].name, str) == 0) { *qclass = list[i].qclass; return ARES_TRUE; } } return ARES_FALSE; } ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, const char *str) { size_t i; static const struct { const char *name; ares_dns_rec_type_t type; } list[] = { {"A", ARES_REC_TYPE_A }, { "NS", ARES_REC_TYPE_NS }, { "CNAME", ARES_REC_TYPE_CNAME }, { "SOA", ARES_REC_TYPE_SOA }, { "PTR", ARES_REC_TYPE_PTR }, { "HINFO", ARES_REC_TYPE_HINFO }, { "MX", ARES_REC_TYPE_MX }, { "TXT", ARES_REC_TYPE_TXT }, { "AAAA", ARES_REC_TYPE_AAAA }, { "SRV", ARES_REC_TYPE_SRV }, { "NAPTR", ARES_REC_TYPE_NAPTR }, { "OPT", ARES_REC_TYPE_OPT }, { "TLSA", ARES_REC_TYPE_TLSA }, { "SVCB", ARES_REC_TYPE_SVCB }, { "HTTPS", ARES_REC_TYPE_HTTPS }, { "ANY", ARES_REC_TYPE_ANY }, { "URI", ARES_REC_TYPE_URI }, { "CAA", ARES_REC_TYPE_CAA }, { "RAW_RR", ARES_REC_TYPE_RAW_RR}, { NULL, 0 } }; if (qtype == NULL || str == NULL) { return ARES_FALSE; } for (i = 0; list[i].name != NULL; i++) { if (strcasecmp(list[i].name, str) == 0) { *qtype = list[i].type; return ARES_TRUE; } } return ARES_FALSE; } const char *ares_dns_section_tostr(ares_dns_section_t section) { switch (section) { case ARES_SECTION_ANSWER: return "ANSWER"; case ARES_SECTION_AUTHORITY: return "AUTHORITY"; case ARES_SECTION_ADDITIONAL: return "ADDITIONAL"; } return "UNKNOWN"; } static ares_dns_opt_datatype_t ares_dns_opt_get_type_opt(unsigned short opt) { ares_opt_param_t param = (ares_opt_param_t)opt; switch (param) { case ARES_OPT_PARAM_LLQ: /* Really it is u16 version, u16 opcode, u16 error, u64 id, u32 lease */ return ARES_OPT_DATATYPE_BIN; case ARES_OPT_PARAM_UL: return ARES_OPT_DATATYPE_U32; case ARES_OPT_PARAM_NSID: return ARES_OPT_DATATYPE_BIN; case ARES_OPT_PARAM_DAU: return ARES_OPT_DATATYPE_U8_LIST; case ARES_OPT_PARAM_DHU: return ARES_OPT_DATATYPE_U8_LIST; case ARES_OPT_PARAM_N3U: return ARES_OPT_DATATYPE_U8_LIST; case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET: /* Really it is a u16 address family, u8 source prefix length, * u8 scope prefix length, address */ return ARES_OPT_DATATYPE_BIN; case ARES_OPT_PARAM_EDNS_EXPIRE: return ARES_OPT_DATATYPE_U32; case ARES_OPT_PARAM_COOKIE: /* 8 bytes for client, 16-40 bytes for server */ return ARES_OPT_DATATYPE_BIN; case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE: /* Timeout in 100ms intervals */ return ARES_OPT_DATATYPE_U16; case ARES_OPT_PARAM_PADDING: /* Arbitrary padding */ return ARES_OPT_DATATYPE_BIN; case ARES_OPT_PARAM_CHAIN: return ARES_OPT_DATATYPE_NAME; case ARES_OPT_PARAM_EDNS_KEY_TAG: return ARES_OPT_DATATYPE_U16_LIST; case ARES_OPT_PARAM_EXTENDED_DNS_ERROR: /* Really 16bit code followed by textual message */ return ARES_OPT_DATATYPE_BIN; } return ARES_OPT_DATATYPE_BIN; } static ares_dns_opt_datatype_t ares_dns_opt_get_type_svcb(unsigned short opt) { ares_svcb_param_t param = (ares_svcb_param_t)opt; switch (param) { case ARES_SVCB_PARAM_NO_DEFAULT_ALPN: return ARES_OPT_DATATYPE_NONE; case ARES_SVCB_PARAM_ECH: return ARES_OPT_DATATYPE_BIN; case ARES_SVCB_PARAM_MANDATORY: return ARES_OPT_DATATYPE_U16_LIST; case ARES_SVCB_PARAM_ALPN: return ARES_OPT_DATATYPE_STR_LIST; case ARES_SVCB_PARAM_PORT: return ARES_OPT_DATATYPE_U16; case ARES_SVCB_PARAM_IPV4HINT: return ARES_OPT_DATATYPE_INADDR4_LIST; case ARES_SVCB_PARAM_IPV6HINT: return ARES_OPT_DATATYPE_INADDR6_LIST; } return ARES_OPT_DATATYPE_BIN; } ares_dns_opt_datatype_t ares_dns_opt_get_datatype(ares_dns_rr_key_t key, unsigned short opt) { switch (key) { case ARES_RR_OPT_OPTIONS: return ares_dns_opt_get_type_opt(opt); case ARES_RR_SVCB_PARAMS: case ARES_RR_HTTPS_PARAMS: return ares_dns_opt_get_type_svcb(opt); default: break; } return ARES_OPT_DATATYPE_BIN; } static const char *ares_dns_opt_get_name_opt(unsigned short opt) { ares_opt_param_t param = (ares_opt_param_t)opt; switch (param) { case ARES_OPT_PARAM_LLQ: return "LLQ"; case ARES_OPT_PARAM_UL: return "UL"; case ARES_OPT_PARAM_NSID: return "NSID"; case ARES_OPT_PARAM_DAU: return "DAU"; case ARES_OPT_PARAM_DHU: return "DHU"; case ARES_OPT_PARAM_N3U: return "N3U"; case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET: return "edns-client-subnet"; case ARES_OPT_PARAM_EDNS_EXPIRE: return "edns-expire"; case ARES_OPT_PARAM_COOKIE: return "COOKIE"; case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE: return "edns-tcp-keepalive"; case ARES_OPT_PARAM_PADDING: return "Padding"; case ARES_OPT_PARAM_CHAIN: return "CHAIN"; case ARES_OPT_PARAM_EDNS_KEY_TAG: return "edns-key-tag"; case ARES_OPT_PARAM_EXTENDED_DNS_ERROR: return "extended-dns-error"; } return NULL; } static const char *ares_dns_opt_get_name_svcb(unsigned short opt) { ares_svcb_param_t param = (ares_svcb_param_t)opt; switch (param) { case ARES_SVCB_PARAM_NO_DEFAULT_ALPN: return "no-default-alpn"; case ARES_SVCB_PARAM_ECH: return "ech"; case ARES_SVCB_PARAM_MANDATORY: return "mandatory"; case ARES_SVCB_PARAM_ALPN: return "alpn"; case ARES_SVCB_PARAM_PORT: return "port"; case ARES_SVCB_PARAM_IPV4HINT: return "ipv4hint"; case ARES_SVCB_PARAM_IPV6HINT: return "ipv6hint"; } return NULL; } const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, unsigned short opt) { switch (key) { case ARES_RR_OPT_OPTIONS: return ares_dns_opt_get_name_opt(opt); case ARES_RR_SVCB_PARAMS: case ARES_RR_HTTPS_PARAMS: return ares_dns_opt_get_name_svcb(opt); default: break; } return NULL; } const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode) { switch (rcode) { case ARES_RCODE_NOERROR: return "NOERROR"; case ARES_RCODE_FORMERR: return "FORMERR"; case ARES_RCODE_SERVFAIL: return "SERVFAIL"; case ARES_RCODE_NXDOMAIN: return "NXDOMAIN"; case ARES_RCODE_NOTIMP: return "NOTIMP"; case ARES_RCODE_REFUSED: return "REFUSED"; case ARES_RCODE_YXDOMAIN: return "YXDOMAIN"; case ARES_RCODE_YXRRSET: return "YXRRSET"; case ARES_RCODE_NXRRSET: return "NXRRSET"; case ARES_RCODE_NOTAUTH: return "NOTAUTH"; case ARES_RCODE_NOTZONE: return "NOTZONE"; case ARES_RCODE_DSOTYPEI: return "DSOTYPEI"; case ARES_RCODE_BADSIG: return "BADSIG"; case ARES_RCODE_BADKEY: return "BADKEY"; case ARES_RCODE_BADTIME: return "BADTIME"; case ARES_RCODE_BADMODE: return "BADMODE"; case ARES_RCODE_BADNAME: return "BADNAME"; case ARES_RCODE_BADALG: return "BADALG"; case ARES_RCODE_BADTRUNC: return "BADTRUNC"; case ARES_RCODE_BADCOOKIE: return "BADCOOKIE"; } return "UNKNOWN"; }