#include "config.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <netdb.h>
#include <string.h>
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#include "dns.h"
#include "rdata.h"
static lookup_table_type dns_rrclasses[] = {
{ CLASS_IN, "IN" },
{ CLASS_CS, "CS" },
{ CLASS_CH, "CH" },
{ CLASS_HS, "HS" },
{ 0, NULL }
};
#define FIELD(name, size) { name, 0 , size, NULL , NULL }
#define FIELD_ENTRY(name, is_optional, size, calc_len_func, cal_len_uncompressed_wire_func ) { name, is_optional, size, calc_len_func, cal_len_uncompressed_wire_func }
static const struct nsd_rdata_descriptor generic_rdata_fields[] = {
FIELD("", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor a_rdata_fields[] = {
FIELD("address", 4)
};
static const struct nsd_rdata_descriptor ns_rdata_fields[] = {
FIELD("host", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor md_rdata_fields[] = {
FIELD("madname", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor mf_rdata_fields[] = {
FIELD("madname", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor cname_rdata_fields[] = {
FIELD("host", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor soa_rdata_fields[] = {
FIELD("primary", RDATA_COMPRESSED_DNAME),
FIELD("mailbox", RDATA_COMPRESSED_DNAME),
FIELD("serial", 4),
FIELD("refresh", 4),
FIELD("retry", 4),
FIELD("expire", 4),
FIELD("minimum", 4)
};
static const struct nsd_rdata_descriptor mb_rdata_fields[] = {
FIELD("madname", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor mg_rdata_fields[] = {
FIELD("mgmname", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor mr_rdata_fields[] = {
FIELD("newname", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor wks_rdata_fields[] = {
FIELD("address", 4),
FIELD("protocol", 1),
FIELD("bitmap", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor ptr_rdata_fields[] = {
FIELD("ptrdname", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor hinfo_rdata_fields[] = {
FIELD("cpu", RDATA_STRING),
FIELD("os", RDATA_STRING)
};
static const struct nsd_rdata_descriptor minfo_rdata_fields[] = {
FIELD("rmailbx", RDATA_COMPRESSED_DNAME),
FIELD("emailbx", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor mx_rdata_fields[] = {
FIELD("priority", 2),
FIELD("hostname", RDATA_COMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor txt_rdata_fields[] = {
FIELD("text", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor rp_rdata_fields[] = {
FIELD("mailbox", RDATA_UNCOMPRESSED_DNAME),
FIELD("text", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor afsdb_rdata_fields[] = {
FIELD("subtype", 2),
FIELD("hostname", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor x25_rdata_fields[] = {
FIELD("address", RDATA_STRING)
};
static const struct nsd_rdata_descriptor isdn_rdata_fields[] = {
FIELD("address", RDATA_STRING),
FIELD_ENTRY("subaddress", 1, RDATA_STRING, NULL, NULL)
};
static const struct nsd_rdata_descriptor rt_rdata_fields[] = {
FIELD("preference", 2),
FIELD("hostname", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor nsap_rdata_fields[] = {
FIELD("address", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor nsap_ptr_rdata_fields[] = {
FIELD("hostname", RDATA_STRING)
};
static const struct nsd_rdata_descriptor sig_rdata_fields[] = {
FIELD("sigtype", 2),
FIELD("algorithm", 1),
FIELD("labels", 1),
FIELD("origttl", 4),
FIELD("expire", 4),
FIELD("inception", 4),
FIELD("keytag", 2),
FIELD("signer", RDATA_LITERAL_DNAME),
FIELD("signature", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor key_rdata_fields[] = {
FIELD("flags", 2),
FIELD("protocol", 1),
FIELD("algorithm", 1),
FIELD("publickey", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor px_rdata_fields[] = {
FIELD("preference", 2),
FIELD("map822", RDATA_UNCOMPRESSED_DNAME),
FIELD("mapx400", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor gpos_rdata_fields[] = {
FIELD("latitude", RDATA_STRING),
FIELD("longitude", RDATA_STRING),
FIELD("altitude", RDATA_STRING)
};
static const struct nsd_rdata_descriptor aaaa_rdata_fields[] = {
FIELD("address", 16)
};
static const struct nsd_rdata_descriptor loc_rdata_fields[] = {
FIELD("version", 1),
FIELD("size", 1),
FIELD("horizontal precision", 1),
FIELD("vertical precision", 1),
FIELD("latitude", 4),
FIELD("longitude", 4),
FIELD("altitude", 4),
};
static const struct nsd_rdata_descriptor nxt_rdata_fields[] = {
FIELD("next domain name", RDATA_UNCOMPRESSED_DNAME),
FIELD("type bit map", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor eid_rdata_fields[] = {
FIELD("end point identifier", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor nimloc_rdata_fields[] = {
FIELD("nimrod locator", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor srv_rdata_fields[] = {
FIELD("priority", 2),
FIELD("weight", 2),
FIELD("port", 2),
FIELD("target", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor atma_rdata_fields[] = {
FIELD("address", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor naptr_rdata_fields[] = {
FIELD("order", 2),
FIELD("preference", 2),
FIELD("flags", RDATA_STRING),
FIELD("services", RDATA_STRING),
FIELD("regex", RDATA_STRING),
FIELD("replacement", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor kx_rdata_fields[] = {
FIELD("preference", 2),
FIELD("exchanger", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor cert_rdata_fields[] = {
FIELD("type", 2),
FIELD("key tag", 2),
FIELD("algorithm", 1),
FIELD("certificate", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor a6_rdata_fields[] = {
FIELD("address", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor dname_rdata_fields[] = {
FIELD("source", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor sink_rdata_fields[] = {
FIELD("coding", 1),
FIELD("subcoding", 1),
FIELD("data", RDATA_REMAINDER),
};
static const struct nsd_rdata_descriptor apl_rdata_fields[] = {
FIELD_ENTRY("prefix", 1, RDATA_REMAINDER, NULL, NULL)
};
static const struct nsd_rdata_descriptor ds_rdata_fields[] = {
FIELD("keytag", 2),
FIELD("algorithm", 1),
FIELD("digtype", 1),
FIELD("digest", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor sshfp_rdata_fields[] = {
FIELD("algorithm", 1),
FIELD("ftype", 1),
FIELD("fingerprint", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor ipseckey_rdata_fields[] = {
FIELD("precedence", 1),
FIELD("gateway type", 1),
FIELD("algorithm", 1),
FIELD_ENTRY("gateway", 0, RDATA_IPSECGATEWAY,
ipseckey_gateway_length, ipseckey_gateway_length),
FIELD_ENTRY("public key", 1, RDATA_REMAINDER, NULL, NULL)
};
static const struct nsd_rdata_descriptor rrsig_rdata_fields[] = {
FIELD("rrtype", 2),
FIELD("algorithm", 1),
FIELD("labels", 1),
FIELD("origttl", 4),
FIELD("expire", 4),
FIELD("inception", 4),
FIELD("keytag", 2),
FIELD("signer", RDATA_LITERAL_DNAME),
FIELD("signature", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor nsec_rdata_fields[] = {
FIELD("next", RDATA_LITERAL_DNAME),
FIELD("types", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor dnskey_rdata_fields[] = {
FIELD("flags", 2),
FIELD("protocol", 1),
FIELD("algorithm", 1),
FIELD("publickey", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor dhcid_rdata_fields[] = {
FIELD("dhcpinfo", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor nsec3_rdata_fields[] = {
FIELD("algorithm", 1),
FIELD("flags", 1),
FIELD("iterations", 2),
FIELD("salt", RDATA_BINARY),
FIELD("next", RDATA_BINARY),
FIELD("types", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor nsec3param_rdata_fields[] = {
FIELD("algorithm", 1),
FIELD("flags", 1),
FIELD("iterations", 2),
FIELD("salt", RDATA_BINARY)
};
static const struct nsd_rdata_descriptor tlsa_rdata_fields[] = {
FIELD("usage", 1),
FIELD("selector", 1),
FIELD("matching type", 1),
FIELD("certificate association data", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor smimea_rdata_fields[] = {
FIELD("usage", 1),
FIELD("selector", 1),
FIELD("matching type", 1),
FIELD("certificate association data", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor hip_rdata_fields[] = {
FIELD("hip", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor ninfo_rdata_fields[] = {
FIELD("text", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor rkey_rdata_fields[] = {
FIELD("flags", 2),
FIELD("protocol", 1),
FIELD("algorithm", 1),
FIELD("publickey", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor talink_rdata_fields[] = {
FIELD("start or previous", RDATA_LITERAL_DNAME),
FIELD("end or next", RDATA_LITERAL_DNAME)
};
static const struct nsd_rdata_descriptor cds_rdata_fields[] = {
FIELD("keytag", 2),
FIELD("algorithm", 1),
FIELD("digtype", 1),
FIELD("digest", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor cdnskey_rdata_fields[] = {
FIELD("flags", 2),
FIELD("protocol", 1),
FIELD("algorithm", 1),
FIELD("publickey", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor openpgpkey_rdata_fields[] = {
FIELD("key", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor csync_rdata_fields[] = {
FIELD("serial", 4),
FIELD("flags", 2),
FIELD("types", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor zonemd_rdata_fields[] = {
FIELD("serial", 4),
FIELD("scheme", 1),
FIELD("algorithm", 1),
FIELD("digest", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor svcb_rdata_fields[] = {
FIELD("priority", 2),
FIELD("target", RDATA_UNCOMPRESSED_DNAME),
FIELD("params", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor https_rdata_fields[] = {
FIELD("priority", 2),
FIELD("target", RDATA_UNCOMPRESSED_DNAME),
FIELD("params", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor dsync_rdata_fields[] = {
FIELD("rrtype", 2),
FIELD("scheme", 1),
FIELD("port", 2),
FIELD("target", RDATA_LITERAL_DNAME)
};
static const struct nsd_rdata_descriptor spf_rdata_fields[] = {
FIELD("text", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor nid_rdata_fields[] = {
FIELD("nid", 2),
FIELD("locator", 8)
};
static const struct nsd_rdata_descriptor l32_rdata_fields[] = {
FIELD("preference", 2),
FIELD("locator", 4)
};
static const struct nsd_rdata_descriptor l64_rdata_fields[] = {
FIELD("preference", 2),
FIELD("locator", 8)
};
static const struct nsd_rdata_descriptor lp_rdata_fields[] = {
FIELD("preference", 2),
FIELD("pointer", RDATA_UNCOMPRESSED_DNAME)
};
static const struct nsd_rdata_descriptor eui48_rdata_fields[] = {
FIELD("address", 6)
};
static const struct nsd_rdata_descriptor eui64_rdata_fields[] = {
FIELD("address", 8)
};
static const struct nsd_rdata_descriptor uri_rdata_fields[] = {
FIELD("priority", 2),
FIELD("weight", 2),
FIELD("target", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor caa_rdata_fields[] = {
FIELD("flags", 1),
FIELD("tag", RDATA_STRING),
FIELD("value", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor avc_rdata_fields[] = {
FIELD("text", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor doa_rdata_fields[] = {
FIELD("enterprise", 4),
FIELD("type", 4),
FIELD("location", 1),
FIELD("media type", RDATA_STRING),
FIELD("data", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor amtrelay_rdata_fields[] = {
FIELD("precedence", 1),
FIELD("discovery_type", 1),
FIELD_ENTRY("relay", 0, RDATA_AMTRELAY_RELAY,
amtrelay_relay_length, amtrelay_relay_length)
};
static const struct nsd_rdata_descriptor resinfo_rdata_fields[] = {
FIELD("text", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor wallet_rdata_fields[] = {
FIELD("wallet", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor cla_rdata_fields[] = {
FIELD("CLA", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor ipn_rdata_fields[] = {
FIELD("CBHE Node Number", 8)
};
static const struct nsd_rdata_descriptor ta_rdata_fields[] = {
FIELD("key", 2),
FIELD("algorithm", 1),
FIELD("type", 1),
FIELD("digest", RDATA_REMAINDER)
};
static const struct nsd_rdata_descriptor dlv_rdata_fields[] = {
FIELD("key", 2),
FIELD("algorithm", 1),
FIELD("type", 1),
FIELD("digest", RDATA_REMAINDER)
};
#define TYPE(name, code, bools, read, write, print, fields) \
{ code, name, bools, read, write, print, { sizeof(fields)/sizeof(fields[0]), fields } }
#define UNKNOWN_TYPE(code) \
{ code, NULL , 0 , 0 , 0 , read_generic_rdata, write_generic_rdata, print_generic_rdata, { sizeof(generic_rdata_fields)/sizeof(generic_rdata_fields[0]), generic_rdata_fields } }
#define TYPE_HAS_NO_REFS 0, 0, 0
#define TYPE_HAS_COMPRESSED_DNAME 1, 1, 1
#define TYPE_HAS_UNCOMPRESSED_DNAME 1, 0, 1
#define TYPE_HAS_LITERAL_DNAME 0, 0, 1
#define TYPE_HAS_FLAGS(has_references, is_compressible, has_dnames) has_references, is_compressible, has_dnames
const nsd_type_descriptor_type type_descriptors[] = {
UNKNOWN_TYPE(0),
TYPE("A", TYPE_A, TYPE_HAS_NO_REFS,
read_a_rdata, write_generic_rdata,
print_a_rdata, a_rdata_fields),
TYPE("NS", TYPE_NS, TYPE_HAS_COMPRESSED_DNAME,
read_compressed_name_rdata, write_compressed_name_rdata,
print_name_rdata, ns_rdata_fields),
TYPE("MD", TYPE_MD, TYPE_HAS_UNCOMPRESSED_DNAME,
read_uncompressed_name_rdata, write_uncompressed_name_rdata,
print_name_rdata, md_rdata_fields),
TYPE("MF", TYPE_MF, TYPE_HAS_UNCOMPRESSED_DNAME,
read_uncompressed_name_rdata, write_uncompressed_name_rdata,
print_name_rdata, mf_rdata_fields),
TYPE("CNAME", TYPE_CNAME, TYPE_HAS_COMPRESSED_DNAME,
read_compressed_name_rdata, write_compressed_name_rdata,
print_name_rdata, cname_rdata_fields),
TYPE("SOA", TYPE_SOA, TYPE_HAS_COMPRESSED_DNAME,
read_soa_rdata, write_soa_rdata,
print_soa_rdata, soa_rdata_fields),
TYPE("MB", TYPE_MB, TYPE_HAS_COMPRESSED_DNAME,
read_compressed_name_rdata, write_compressed_name_rdata,
print_name_rdata, mb_rdata_fields),
TYPE("MG", TYPE_MG, TYPE_HAS_COMPRESSED_DNAME,
read_compressed_name_rdata, write_compressed_name_rdata,
print_name_rdata, mg_rdata_fields),
TYPE("MR", TYPE_MR, TYPE_HAS_COMPRESSED_DNAME,
read_compressed_name_rdata, write_compressed_name_rdata,
print_name_rdata, mr_rdata_fields),
TYPE("NULL", TYPE_NULL, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata,
print_generic_rdata, generic_rdata_fields),
TYPE("WKS", TYPE_WKS, TYPE_HAS_NO_REFS,
read_wks_rdata, write_generic_rdata,
print_wks_rdata, wks_rdata_fields),
TYPE("PTR", TYPE_PTR, TYPE_HAS_COMPRESSED_DNAME,
read_compressed_name_rdata, write_compressed_name_rdata,
print_name_rdata, ptr_rdata_fields),
TYPE("HINFO", TYPE_HINFO, TYPE_HAS_NO_REFS,
read_hinfo_rdata, write_generic_rdata,
print_hinfo_rdata, hinfo_rdata_fields),
TYPE("MINFO", TYPE_MINFO, TYPE_HAS_COMPRESSED_DNAME,
read_minfo_rdata, write_minfo_rdata,
print_minfo_rdata, minfo_rdata_fields),
TYPE("MX", TYPE_MX, TYPE_HAS_COMPRESSED_DNAME,
read_mx_rdata, write_mx_rdata,
print_mx_rdata, mx_rdata_fields),
TYPE("TXT", TYPE_TXT, TYPE_HAS_NO_REFS,
read_txt_rdata, write_generic_rdata,
print_txt_rdata, txt_rdata_fields),
TYPE("RP", TYPE_RP, TYPE_HAS_UNCOMPRESSED_DNAME,
read_rp_rdata, write_rp_rdata, print_rp_rdata,
rp_rdata_fields),
TYPE("AFSDB", TYPE_AFSDB, TYPE_HAS_UNCOMPRESSED_DNAME,
read_afsdb_rdata, write_afsdb_rdata, print_afsdb_rdata,
afsdb_rdata_fields),
TYPE("X25", TYPE_X25, TYPE_HAS_NO_REFS,
read_x25_rdata, write_generic_rdata, print_x25_rdata,
x25_rdata_fields),
TYPE("ISDN", TYPE_ISDN, TYPE_HAS_NO_REFS,
read_isdn_rdata, write_generic_rdata, print_isdn_rdata,
isdn_rdata_fields),
TYPE("RT", TYPE_RT, TYPE_HAS_UNCOMPRESSED_DNAME,
read_rt_rdata, write_rt_rdata, print_mx_rdata,
rt_rdata_fields),
TYPE("NSAP", TYPE_NSAP, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata, print_nsap_rdata,
nsap_rdata_fields),
TYPE("NSAP-PTR", TYPE_NSAP_PTR, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata,
print_nsap_ptr_rdata, nsap_ptr_rdata_fields),
TYPE("SIG", TYPE_SIG, TYPE_HAS_LITERAL_DNAME,
read_rrsig_rdata, write_generic_rdata, print_rrsig_rdata,
sig_rdata_fields),
TYPE("KEY", TYPE_KEY, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata, print_key_rdata,
key_rdata_fields),
TYPE("PX", TYPE_PX, TYPE_HAS_UNCOMPRESSED_DNAME,
read_px_rdata, write_px_rdata, print_px_rdata,
px_rdata_fields),
TYPE("GPOS", TYPE_GPOS, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata, print_gpos_rdata,
gpos_rdata_fields),
TYPE("AAAA", TYPE_AAAA, TYPE_HAS_NO_REFS,
read_aaaa_rdata, write_generic_rdata, print_aaaa_rdata,
aaaa_rdata_fields),
TYPE("LOC", TYPE_LOC, TYPE_HAS_NO_REFS,
read_loc_rdata, write_generic_rdata, print_loc_rdata,
loc_rdata_fields),
TYPE("NXT", TYPE_NXT, TYPE_HAS_UNCOMPRESSED_DNAME,
read_nxt_rdata, write_nxt_rdata, print_nxt_rdata,
nxt_rdata_fields),
TYPE("EID", TYPE_EID, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata, print_eid_rdata,
eid_rdata_fields),
TYPE("NIMLOC", TYPE_NIMLOC, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata, print_nimloc_rdata,
nimloc_rdata_fields),
TYPE("SRV", TYPE_SRV, TYPE_HAS_UNCOMPRESSED_DNAME,
read_srv_rdata, write_srv_rdata,
print_srv_rdata, srv_rdata_fields),
TYPE("ATMA", TYPE_ATMA, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata, print_atma_rdata,
atma_rdata_fields),
TYPE("NAPTR", TYPE_NAPTR, TYPE_HAS_UNCOMPRESSED_DNAME,
read_naptr_rdata, write_naptr_rdata,
print_naptr_rdata, naptr_rdata_fields),
TYPE("KX", TYPE_KX, TYPE_HAS_UNCOMPRESSED_DNAME,
read_kx_rdata, write_kx_rdata,
print_mx_rdata, kx_rdata_fields),
TYPE("CERT", TYPE_CERT, TYPE_HAS_NO_REFS,
read_cert_rdata, write_generic_rdata,
print_cert_rdata, cert_rdata_fields),
TYPE("A6", TYPE_A6, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata,
print_generic_rdata, a6_rdata_fields),
TYPE("DNAME", TYPE_DNAME, TYPE_HAS_UNCOMPRESSED_DNAME,
read_uncompressed_name_rdata, write_uncompressed_name_rdata,
print_name_rdata, dname_rdata_fields),
TYPE("SINK", TYPE_SINK, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata, print_sink_rdata,
sink_rdata_fields),
UNKNOWN_TYPE(41),
TYPE("APL", TYPE_APL, TYPE_HAS_NO_REFS,
read_apl_rdata, write_generic_rdata,
print_apl_rdata, apl_rdata_fields),
TYPE("DS", TYPE_DS, TYPE_HAS_NO_REFS,
read_ds_rdata, write_generic_rdata,
print_ds_rdata, ds_rdata_fields),
TYPE("SSHFP", TYPE_SSHFP, TYPE_HAS_NO_REFS,
read_sshfp_rdata, write_generic_rdata,
print_sshfp_rdata, sshfp_rdata_fields),
TYPE("IPSECKEY", TYPE_IPSECKEY, TYPE_HAS_LITERAL_DNAME,
read_ipseckey_rdata, write_generic_rdata,
print_ipseckey_rdata, ipseckey_rdata_fields),
TYPE("RRSIG", TYPE_RRSIG, TYPE_HAS_LITERAL_DNAME,
read_rrsig_rdata, write_generic_rdata,
print_rrsig_rdata, rrsig_rdata_fields),
TYPE("NSEC", TYPE_NSEC, TYPE_HAS_LITERAL_DNAME,
read_nsec_rdata, write_generic_rdata,
print_nsec_rdata, nsec_rdata_fields),
TYPE("DNSKEY", TYPE_DNSKEY, TYPE_HAS_NO_REFS,
read_dnskey_rdata, write_generic_rdata,
print_dnskey_rdata, dnskey_rdata_fields),
TYPE("DHCID", TYPE_DHCID, TYPE_HAS_NO_REFS,
read_dhcid_rdata, write_generic_rdata,
print_dhcid_rdata, dhcid_rdata_fields),
TYPE("NSEC3", TYPE_NSEC3, TYPE_HAS_NO_REFS,
read_nsec3_rdata, write_generic_rdata,
print_nsec3_rdata, nsec3_rdata_fields),
TYPE("NSEC3PARAM", TYPE_NSEC3PARAM, TYPE_HAS_NO_REFS,
read_nsec3param_rdata, write_generic_rdata,
print_nsec3param_rdata, nsec3param_rdata_fields),
TYPE("TLSA", TYPE_TLSA, TYPE_HAS_NO_REFS,
read_tlsa_rdata, write_generic_rdata,
print_tlsa_rdata, tlsa_rdata_fields),
TYPE("SMIMEA", TYPE_SMIMEA, TYPE_HAS_NO_REFS,
read_tlsa_rdata, write_generic_rdata,
print_tlsa_rdata, smimea_rdata_fields),
UNKNOWN_TYPE(54),
TYPE("HIP", TYPE_HIP, TYPE_HAS_LITERAL_DNAME,
read_hip_rdata, write_generic_rdata,
print_hip_rdata, hip_rdata_fields),
TYPE("NINFO", TYPE_NINFO, TYPE_HAS_NO_REFS,
read_txt_rdata, write_generic_rdata,
print_txt_rdata, ninfo_rdata_fields),
TYPE("RKEY", TYPE_RKEY, TYPE_HAS_NO_REFS,
read_rkey_rdata, write_generic_rdata,
print_rkey_rdata, rkey_rdata_fields),
TYPE("TALINK", TYPE_TALINK, TYPE_HAS_LITERAL_DNAME,
read_talink_rdata, write_generic_rdata,
print_talink_rdata, talink_rdata_fields),
TYPE("CDS", TYPE_CDS, TYPE_HAS_NO_REFS,
read_ds_rdata, write_generic_rdata,
print_ds_rdata, cds_rdata_fields),
TYPE("CDNSKEY", TYPE_CDNSKEY, TYPE_HAS_NO_REFS,
read_dnskey_rdata, write_generic_rdata,
print_dnskey_rdata, cdnskey_rdata_fields),
TYPE("OPENPGPKEY", TYPE_OPENPGPKEY, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata,
print_openpgpkey_rdata, openpgpkey_rdata_fields),
TYPE("CSYNC", TYPE_CSYNC, TYPE_HAS_NO_REFS,
read_csync_rdata, write_generic_rdata,
print_csync_rdata, csync_rdata_fields),
TYPE("ZONEMD", TYPE_ZONEMD, TYPE_HAS_NO_REFS,
read_zonemd_rdata, write_generic_rdata,
print_zonemd_rdata, zonemd_rdata_fields),
TYPE("SVCB", TYPE_SVCB, TYPE_HAS_UNCOMPRESSED_DNAME,
read_svcb_rdata, write_svcb_rdata,
print_svcb_rdata, svcb_rdata_fields),
TYPE("HTTPS", TYPE_HTTPS, TYPE_HAS_UNCOMPRESSED_DNAME,
read_svcb_rdata, write_svcb_rdata,
print_svcb_rdata, https_rdata_fields),
TYPE("DSYNC", TYPE_DSYNC, TYPE_HAS_LITERAL_DNAME,
read_dsync_rdata, write_generic_rdata,
print_dsync_rdata, dsync_rdata_fields),
UNKNOWN_TYPE(67),
UNKNOWN_TYPE(68),
UNKNOWN_TYPE(69),
UNKNOWN_TYPE(70),
UNKNOWN_TYPE(71),
UNKNOWN_TYPE(72),
UNKNOWN_TYPE(73),
UNKNOWN_TYPE(74),
UNKNOWN_TYPE(75),
UNKNOWN_TYPE(76),
UNKNOWN_TYPE(77),
UNKNOWN_TYPE(78),
UNKNOWN_TYPE(79),
UNKNOWN_TYPE(80),
UNKNOWN_TYPE(81),
UNKNOWN_TYPE(82),
UNKNOWN_TYPE(83),
UNKNOWN_TYPE(84),
UNKNOWN_TYPE(85),
UNKNOWN_TYPE(86),
UNKNOWN_TYPE(87),
UNKNOWN_TYPE(88),
UNKNOWN_TYPE(89),
UNKNOWN_TYPE(90),
UNKNOWN_TYPE(91),
UNKNOWN_TYPE(92),
UNKNOWN_TYPE(93),
UNKNOWN_TYPE(94),
UNKNOWN_TYPE(95),
UNKNOWN_TYPE(96),
UNKNOWN_TYPE(97),
UNKNOWN_TYPE(98),
TYPE("SPF", TYPE_SPF, TYPE_HAS_NO_REFS,
read_txt_rdata, write_generic_rdata,
print_txt_rdata, spf_rdata_fields),
UNKNOWN_TYPE(100),
UNKNOWN_TYPE(101),
UNKNOWN_TYPE(102),
UNKNOWN_TYPE(103),
TYPE("NID", TYPE_NID, TYPE_HAS_NO_REFS,
read_nid_rdata, write_generic_rdata,
print_nid_rdata, nid_rdata_fields),
TYPE("L32", TYPE_L32, TYPE_HAS_NO_REFS,
read_l32_rdata, write_generic_rdata,
print_l32_rdata, l32_rdata_fields),
TYPE("L64", TYPE_L64, TYPE_HAS_NO_REFS,
read_l64_rdata, write_generic_rdata,
print_l64_rdata, l64_rdata_fields),
TYPE("LP", TYPE_LP, TYPE_HAS_UNCOMPRESSED_DNAME,
read_lp_rdata, write_lp_rdata,
print_lp_rdata, lp_rdata_fields),
TYPE("EUI48", TYPE_EUI48, TYPE_HAS_NO_REFS,
read_eui48_rdata, write_generic_rdata,
print_eui48_rdata, eui48_rdata_fields),
TYPE("EUI64", TYPE_EUI64, TYPE_HAS_NO_REFS,
read_eui64_rdata, write_generic_rdata,
print_eui64_rdata, eui64_rdata_fields),
UNKNOWN_TYPE(110),
UNKNOWN_TYPE(111),
UNKNOWN_TYPE(112),
UNKNOWN_TYPE(113),
UNKNOWN_TYPE(114),
UNKNOWN_TYPE(115),
UNKNOWN_TYPE(116),
UNKNOWN_TYPE(117),
UNKNOWN_TYPE(118),
UNKNOWN_TYPE(119),
UNKNOWN_TYPE(120),
UNKNOWN_TYPE(121),
UNKNOWN_TYPE(122),
UNKNOWN_TYPE(123),
UNKNOWN_TYPE(124),
UNKNOWN_TYPE(125),
UNKNOWN_TYPE(126),
UNKNOWN_TYPE(127),
TYPE("NXNAME", TYPE_NXNAME, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata,
print_generic_rdata, generic_rdata_fields),
UNKNOWN_TYPE(129),
UNKNOWN_TYPE(130),
UNKNOWN_TYPE(131),
UNKNOWN_TYPE(132),
UNKNOWN_TYPE(133),
UNKNOWN_TYPE(134),
UNKNOWN_TYPE(135),
UNKNOWN_TYPE(136),
UNKNOWN_TYPE(137),
UNKNOWN_TYPE(138),
UNKNOWN_TYPE(139),
UNKNOWN_TYPE(140),
UNKNOWN_TYPE(141),
UNKNOWN_TYPE(142),
UNKNOWN_TYPE(143),
UNKNOWN_TYPE(144),
UNKNOWN_TYPE(145),
UNKNOWN_TYPE(146),
UNKNOWN_TYPE(147),
UNKNOWN_TYPE(148),
UNKNOWN_TYPE(149),
UNKNOWN_TYPE(150),
UNKNOWN_TYPE(151),
UNKNOWN_TYPE(152),
UNKNOWN_TYPE(153),
UNKNOWN_TYPE(154),
UNKNOWN_TYPE(155),
UNKNOWN_TYPE(156),
UNKNOWN_TYPE(157),
UNKNOWN_TYPE(158),
UNKNOWN_TYPE(159),
UNKNOWN_TYPE(160),
UNKNOWN_TYPE(161),
UNKNOWN_TYPE(162),
UNKNOWN_TYPE(163),
UNKNOWN_TYPE(164),
UNKNOWN_TYPE(165),
UNKNOWN_TYPE(166),
UNKNOWN_TYPE(167),
UNKNOWN_TYPE(168),
UNKNOWN_TYPE(169),
UNKNOWN_TYPE(170),
UNKNOWN_TYPE(171),
UNKNOWN_TYPE(172),
UNKNOWN_TYPE(173),
UNKNOWN_TYPE(174),
UNKNOWN_TYPE(175),
UNKNOWN_TYPE(176),
UNKNOWN_TYPE(177),
UNKNOWN_TYPE(178),
UNKNOWN_TYPE(179),
UNKNOWN_TYPE(180),
UNKNOWN_TYPE(181),
UNKNOWN_TYPE(182),
UNKNOWN_TYPE(183),
UNKNOWN_TYPE(184),
UNKNOWN_TYPE(185),
UNKNOWN_TYPE(186),
UNKNOWN_TYPE(187),
UNKNOWN_TYPE(188),
UNKNOWN_TYPE(189),
UNKNOWN_TYPE(190),
UNKNOWN_TYPE(191),
UNKNOWN_TYPE(192),
UNKNOWN_TYPE(193),
UNKNOWN_TYPE(194),
UNKNOWN_TYPE(195),
UNKNOWN_TYPE(196),
UNKNOWN_TYPE(197),
UNKNOWN_TYPE(198),
UNKNOWN_TYPE(199),
UNKNOWN_TYPE(200),
UNKNOWN_TYPE(201),
UNKNOWN_TYPE(202),
UNKNOWN_TYPE(203),
UNKNOWN_TYPE(204),
UNKNOWN_TYPE(205),
UNKNOWN_TYPE(206),
UNKNOWN_TYPE(207),
UNKNOWN_TYPE(208),
UNKNOWN_TYPE(209),
UNKNOWN_TYPE(210),
UNKNOWN_TYPE(211),
UNKNOWN_TYPE(212),
UNKNOWN_TYPE(213),
UNKNOWN_TYPE(214),
UNKNOWN_TYPE(215),
UNKNOWN_TYPE(216),
UNKNOWN_TYPE(217),
UNKNOWN_TYPE(218),
UNKNOWN_TYPE(219),
UNKNOWN_TYPE(220),
UNKNOWN_TYPE(221),
UNKNOWN_TYPE(222),
UNKNOWN_TYPE(223),
UNKNOWN_TYPE(224),
UNKNOWN_TYPE(225),
UNKNOWN_TYPE(226),
UNKNOWN_TYPE(227),
UNKNOWN_TYPE(228),
UNKNOWN_TYPE(229),
UNKNOWN_TYPE(230),
UNKNOWN_TYPE(231),
UNKNOWN_TYPE(232),
UNKNOWN_TYPE(233),
UNKNOWN_TYPE(234),
UNKNOWN_TYPE(235),
UNKNOWN_TYPE(236),
UNKNOWN_TYPE(237),
UNKNOWN_TYPE(238),
UNKNOWN_TYPE(239),
UNKNOWN_TYPE(240),
UNKNOWN_TYPE(241),
UNKNOWN_TYPE(242),
UNKNOWN_TYPE(243),
UNKNOWN_TYPE(244),
UNKNOWN_TYPE(245),
UNKNOWN_TYPE(246),
UNKNOWN_TYPE(247),
UNKNOWN_TYPE(248),
UNKNOWN_TYPE(249),
UNKNOWN_TYPE(250),
UNKNOWN_TYPE(251),
UNKNOWN_TYPE(252),
UNKNOWN_TYPE(253),
UNKNOWN_TYPE(254),
UNKNOWN_TYPE(255),
TYPE("URI", TYPE_URI, TYPE_HAS_NO_REFS,
read_uri_rdata, write_generic_rdata,
print_uri_rdata, uri_rdata_fields),
TYPE("CAA", TYPE_CAA, TYPE_HAS_NO_REFS,
read_caa_rdata, write_generic_rdata,
print_caa_rdata, caa_rdata_fields),
TYPE("AVC", TYPE_AVC, TYPE_HAS_NO_REFS,
read_txt_rdata, write_generic_rdata,
print_txt_rdata, avc_rdata_fields),
TYPE("DOA", TYPE_DOA, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata,
print_doa_rdata, doa_rdata_fields),
TYPE("AMTRELAY", TYPE_AMTRELAY, TYPE_HAS_LITERAL_DNAME,
read_amtrelay_rdata, write_generic_rdata,
print_amtrelay_rdata, amtrelay_rdata_fields),
TYPE("RESINFO", TYPE_RESINFO, TYPE_HAS_NO_REFS,
read_txt_rdata, write_generic_rdata,
print_resinfo_rdata, resinfo_rdata_fields),
TYPE("WALLET", TYPE_WALLET, TYPE_HAS_NO_REFS,
read_txt_rdata, write_generic_rdata,
print_txt_rdata, wallet_rdata_fields),
TYPE("CLA", TYPE_CLA, TYPE_HAS_NO_REFS,
read_txt_rdata, write_generic_rdata,
print_txt_rdata, cla_rdata_fields),
TYPE("IPN", TYPE_IPN, TYPE_HAS_NO_REFS,
read_generic_rdata, write_generic_rdata,
print_ipn_rdata, ipn_rdata_fields),
TYPE("TA", TYPE_TA, TYPE_HAS_NO_REFS,
read_dlv_rdata, write_generic_rdata,
print_dlv_rdata, ta_rdata_fields),
TYPE("DLV", TYPE_DLV, TYPE_HAS_NO_REFS,
read_dlv_rdata, write_generic_rdata,
print_dlv_rdata, dlv_rdata_fields)
};
#undef UNKNOWN_TYPE
#undef TYPE
#undef FIELD
#undef FIELD_ENTRY
#undef TYPE_HAS_NO_REFS
#undef TYPE_HAS_COMPRESSED_DNAME
#undef TYPE_HAS_UNCOMPRESSED_DNAME
#undef TYPE_HAS_LITERAL_DNAME
#undef TYPE_HAS_FLAGS
const char *
rrtype_to_string(uint16_t rrtype)
{
static char buf[20];
const nsd_type_descriptor_type *descriptor =
nsd_type_descriptor(rrtype);
if (descriptor->name) {
return descriptor->name;
} else {
snprintf(buf, sizeof(buf), "TYPE%d", (int) rrtype);
return buf;
}
}
uint16_t
rrtype_from_string(const char *name)
{
char *end;
long rrtype;
switch(name[0]) {
case 'r':
case 'R':
if(strcasecmp(name+1, "RSIG") == 0) return TYPE_RRSIG;
break;
case 'n':
case 'N':
switch(name[1]) {
case 's':
case 'S':
switch(name[2]) {
case 0: return TYPE_NS;
case 'e':
case 'E':
if(strcasecmp(name+2, "EC") == 0) return TYPE_NSEC;
if(strcasecmp(name+2, "EC3") == 0) return TYPE_NSEC3;
if(strcasecmp(name+2, "EC3PARAM") == 0) return TYPE_NSEC3PARAM;
break;
}
break;
}
break;
case 'd':
case 'D':
switch(name[1]) {
case 's':
case 'S':
if(name[2]==0) return TYPE_DS;
break;
case 'n':
case 'N':
if(strcasecmp(name+2, "SKEY") == 0) return TYPE_DNSKEY;
break;
}
break;
case 'a':
case 'A':
switch(name[1]) {
case 0: return TYPE_A;
case 'a':
case 'A':
if(strcasecmp(name+2, "AA") == 0) return TYPE_AAAA;
break;
}
break;
case 's':
case 'S':
if(strcasecmp(name+1, "OA") == 0) return TYPE_SOA;
break;
case 't':
case 'T':
if(strcasecmp(name+1, "XT") == 0) return TYPE_TXT;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return 0;
case 'i':
case 'I':
switch(name[1]) {
case 'n':
case 'N':
return 0;
}
break;
}
for (int i=0, n=sizeof(type_descriptors)/sizeof(type_descriptors[0]); i < n; i++) {
if (type_descriptors[i].name && strcasecmp(type_descriptors[i].name, name) == 0)
return type_descriptors[i].type;
}
if (strlen(name) < 5)
return 0;
if (strncasecmp(name, "TYPE", 4) != 0)
return 0;
if (!isdigit((unsigned char)name[4]))
return 0;
rrtype = strtol(name + 4, &end, 10);
if (*end != '\0')
return 0;
if (rrtype < 0 || rrtype > 65535L)
return 0;
return (uint16_t) rrtype;
}
const char *
rrclass_to_string(uint16_t rrclass)
{
static char buf[20];
lookup_table_type *entry = lookup_by_id(dns_rrclasses, rrclass);
if (entry) {
assert(strlen(entry->name) < sizeof(buf));
strlcpy(buf, entry->name, sizeof(buf));
} else {
snprintf(buf, sizeof(buf), "CLASS%d", (int) rrclass);
}
return buf;
}
uint16_t
rrclass_from_string(const char *name)
{
char *end;
long rrclass;
lookup_table_type *entry;
entry = lookup_by_name(dns_rrclasses, name);
if (entry) {
return (uint16_t) entry->id;
}
if (strlen(name) < 6)
return 0;
if (strncasecmp(name, "CLASS", 5) != 0)
return 0;
if (!isdigit((unsigned char)name[5]))
return 0;
rrclass = strtol(name + 5, &end, 10);
if (*end != '\0')
return 0;
if (rrclass < 0 || rrclass > 65535L)
return 0;
return (uint16_t) rrclass;
}