From 85da8a0ffa9107ed17fd37920dff53018e0cde9e Mon Sep 17 00:00:00 2001 From: Jan Kadlec <jan@hp4-jankadlec.(none)> Date: Fri, 12 Nov 2010 16:57:45 +0100 Subject: [PATCH] Initial implementation of RR type descriptors. It's more or less a simplified copy from NSD, will need changes and maybe more API functions. --- src/dnslib/descriptor.c | 369 ++++++++++++++++++++++++++++++++++++++++ src/dnslib/descriptor.h | 128 ++++++++++++++ 2 files changed, 497 insertions(+) create mode 100644 src/dnslib/descriptor.c create mode 100644 src/dnslib/descriptor.h diff --git a/src/dnslib/descriptor.c b/src/dnslib/descriptor.c new file mode 100644 index 000000000..a6f319353 --- /dev/null +++ b/src/dnslib/descriptor.c @@ -0,0 +1,369 @@ +/* + * File descriptor.c + * Date 12.11.2010 12:06 + * Author: NLabs: NSD team, modifications by Jan Kadlec + * Project: CuteDNS + * Description: + */ + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <ctype.h> + +#include "descriptor.h" + +#define DNSLIB_RRTYPE_DESCRIPTORS_LENGTH 101 + +#define RRTYPE_DESCRIPTORS_LENGTH 101 + +const uint16_t DNSLIB_PSEUDO_TYPE_DLV = 32769; + +static dnslib_rrtype_descriptor_t dnslib_rrtype_descriptors[101] = { //XXX magic constant + /* 0 */ + { 0, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 1 */ + { DNSLIB_RRTYPE_A, "A", 1, { DNSLIB_RDATA_WF_A } }, + /* 2 */ + { DNSLIB_RRTYPE_NS, "NS", 1, { DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 3 */ + { DNSLIB_RRTYPE_MD, "MD", 1, + { DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME } }, + /* 4 */ + { DNSLIB_RRTYPE_MF, "MF", 1, + { DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME } }, + /* 5 */ + { DNSLIB_RRTYPE_CNAME, "CNAME", 1, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 6 */ + { DNSLIB_RRTYPE_SOA, "SOA", 7, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME, DNSLIB_RDATA_WF_COMPRESSED_DNAME, DNSLIB_RDATA_WF_LONG, + DNSLIB_RDATA_WF_LONG, DNSLIB_RDATA_WF_LONG, DNSLIB_RDATA_WF_LONG, DNSLIB_RDATA_WF_LONG } }, + /* 7 */ + { DNSLIB_RRTYPE_MB, "MB", 1, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 8 */ + { DNSLIB_RRTYPE_MG, "MG", 1, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 9 */ + { DNSLIB_RRTYPE_MR, "MR", 1, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 10 */ + { DNSLIB_RRTYPE_NULL, NULL, 1, + { DNSLIB_RDATA_WF_BINARY } }, + /* 11 */ + { DNSLIB_RRTYPE_WKS, "WKS", 2, + { DNSLIB_RDATA_WF_A, DNSLIB_RDATA_WF_BINARY } }, + /* 12 */ + { DNSLIB_RRTYPE_PTR, "PTR", 1, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 13 */ + { DNSLIB_RRTYPE_HINFO, "HINFO", 2, + { DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT } }, + /* 14 */ + { DNSLIB_RRTYPE_MINFO, "MINFO", 2, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME, DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 15 */ + { DNSLIB_RRTYPE_MX, "MX", 2, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 16 */ /* This is obscure, but I guess there's no other way */ + { DNSLIB_RRTYPE_TXT, "TXT", MAXRDATALEN, + { DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT } }, + /* 17 */ + { DNSLIB_RRTYPE_RP, "RP", 2, + { DNSLIB_RDATA_WF_COMPRESSED_DNAME, DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 18 */ + { DNSLIB_RRTYPE_AFSDB, "AFSDB", 2, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 19 */ + { DNSLIB_RRTYPE_X25, "X25", 1, + { DNSLIB_RDATA_WF_TEXT } }, + /* 20 */ + { DNSLIB_RRTYPE_ISDN, "ISDN", 2, + { DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT } }, + /* 21 */ + { DNSLIB_RRTYPE_RT, "RT", 2, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_COMPRESSED_DNAME } }, + /* 22 */ + { DNSLIB_RRTYPE_NSAP, "NSAP", 1, + { DNSLIB_RDATA_WF_BINARY } }, + /* 23 */ + { 23, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 24 */ + { DNSLIB_RRTYPE_SIG, "SIG", 9, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_LONG, + DNSLIB_RDATA_WF_LONG, DNSLIB_RDATA_WF_LONG, DNSLIB_RDATA_WF_SHORT, + DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME, DNSLIB_RDATA_WF_BINARY } }, + /* 25 */ + { DNSLIB_RRTYPE_KEY, "KEY", 4, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BINARY } }, + /* 26 */ + { DNSLIB_RRTYPE_PX, "PX", 3, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME, + DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME } }, + /* 27 */ + { 27, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 28 */ + { DNSLIB_RRTYPE_AAAA, "AAAA", 1, + { DNSLIB_RDATA_WF_AAAA } }, + /* 29 */ + { DNSLIB_RRTYPE_LOC, "LOC", 1, + { DNSLIB_RDATA_WF_BINARY } }, + /* 30 */ + { DNSLIB_RRTYPE_NXT, "NXT", 2, + { DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME, DNSLIB_RDATA_WF_BINARY } }, + /* 31 */ + { 31, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 32 */ + { 32, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 33 */ + { DNSLIB_RRTYPE_SRV, "SRV", 4, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_SHORT, + DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME } }, + /* 34 */ + { 34, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 35 */ + { DNSLIB_RRTYPE_NAPTR, "NAPTR", 6, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME } }, + /* 36 */ + { DNSLIB_RRTYPE_KX, "KX", 2, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME } }, + /* 37 */ + { DNSLIB_RRTYPE_CERT, "CERT", 4, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BINARY } }, + /* 38 */ + { DNSLIB_RRTYPE_A6, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 39 */ + { DNSLIB_RRTYPE_DNAME, "DNAME", 1, + { DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME } }, + /* 40 */ + { 40, NULL, 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 41 */ + { DNSLIB_RRTYPE_OPT, "OPT", 1, + { DNSLIB_RDATA_WF_BINARY } }, + /* 42 */ + { DNSLIB_RRTYPE_APL, "APL", MAXRDATALEN, + { DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, + DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL, DNSLIB_RDATA_WF_APL } }, + /* 43 */ + { DNSLIB_RRTYPE_DS, "DS", 4, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BINARY } }, + /* 44 */ + { DNSLIB_RRTYPE_SSHFP, "SSHFP", 3, + { DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BINARY } }, + /* 45 */ + { DNSLIB_RRTYPE_IPSECKEY, "IPSECKEY", 5, + { DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_IPSECGATEWAY, + DNSLIB_RDATA_WF_BINARY } }, + /* 46 */ + { DNSLIB_RRTYPE_RRSIG, "RRSIG", 9, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_LONG, + DNSLIB_RDATA_WF_LONG, DNSLIB_RDATA_WF_LONG, DNSLIB_RDATA_WF_SHORT, + DNSLIB_RDATA_WF_LITERAL_DNAME, DNSLIB_RDATA_WF_BINARY } }, + /* 47 */ + { DNSLIB_RRTYPE_NSEC, "NSEC", 2, + { DNSLIB_RDATA_WF_LITERAL_DNAME, DNSLIB_RDATA_WF_BINARY } }, + /* 48 */ + { DNSLIB_RRTYPE_DNSKEY, "DNSKEY", 4, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BINARY } }, + /* 49 */ + { DNSLIB_RRTYPE_DHCID, "DHCID", 1, { DNSLIB_RDATA_WF_BINARY } }, + /* 50 */ + { DNSLIB_RRTYPE_NSEC3, "NSEC3", 6, + { DNSLIB_RDATA_WF_BYTE, /* hash type */ + DNSLIB_RDATA_WF_BYTE, /* flags */ + DNSLIB_RDATA_WF_SHORT, /* iterations */ + DNSLIB_RDATA_WF_BINARYWITHLENGTH, /* salt */ + DNSLIB_RDATA_WF_BINARYWITHLENGTH, /* next hashed name */ + DNSLIB_RDATA_WF_BINARY /* type bitmap */ } }, + /* 51 */ + { DNSLIB_RRTYPE_NSEC3PARAM, "NSEC3PARAM", 4, + { DNSLIB_RDATA_WF_BYTE, /* hash type */ + DNSLIB_RDATA_WF_BYTE, /* flags */ + DNSLIB_RDATA_WF_SHORT, /* iterations */ + DNSLIB_RDATA_WF_BINARYWITHLENGTH /* salt */ } }, + /* 52 */ + + + /* In NSD they have indices between 52 and 99 filled with + unknown types. TODO add here if it's really needed? */ + + /* There's a GNU extension that works like this: [first ... last] = value */ + + /* 99 */ + [99] = { DNSLIB_RRTYPE_SPF, "SPF", MAXRDATALEN, + { DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, + DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT, DNSLIB_RDATA_WF_TEXT } }, + /* 32769 */ +/* [100] = { DNSLIB_RRTYPE_DLV, "DLV", 4, + { DNSLIB_RDATA_WF_SHORT, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BYTE, DNSLIB_RDATA_WF_BINARY } },*/ +}; + +dnslib_rrtype_descriptor_t *dnslib_rrtype_descriptor_by_type(uint16_t type) +{ + if (type < DNSLIB_RRTYPE_DESCRIPTORS_LENGTH) + return &dnslib_rrtype_descriptors[type]; + else if (type == DNSLIB_RRTYPE_DLV) + return &dnslib_rrtype_descriptors[DNSLIB_RRTYPE_DS]; + return &dnslib_rrtype_descriptors[0]; +} + +//Will we ever need this? XXX +dnslib_rrtype_descriptor_t *rrtype_descriptor_by_name(const char *name) +{ + int i; + + for (i = 0; i < RRTYPE_DESCRIPTORS_LENGTH; ++i) { + if (dnslib_rrtype_descriptors[i].name + && strcasecmp(dnslib_rrtype_descriptors[i].name, name) == 0) + { + return &dnslib_rrtype_descriptors[i]; + } + } + + if (dnslib_rrtype_descriptors[DNSLIB_PSEUDO_TYPE_DLV].name + && strcasecmp(dnslib_rrtype_descriptors[DNSLIB_PSEUDO_TYPE_DLV].name, name) == 0) + { + return &dnslib_rrtype_descriptors[DNSLIB_RRTYPE_DS]; + } + + return NULL; +} + +const char *rrtype_to_string(uint16_t rrtype) +{ + static char buf[20]; + dnslib_rrtype_descriptor_t *descriptor = dnslib_rrtype_descriptor_by_type(rrtype); + if (descriptor->name) { + return descriptor->name; + } else { + snprintf(buf, sizeof(buf), "TYPE%d", (int) rrtype); + return buf; + } +} + +/* + * Lookup the type in the ztypes lookup table. If not found, check if + * the type uses the "TYPExxx" notation for unknown types. + * + * Return 0 if no type matches. + */ +uint16_t rrtype_from_string(const char *name) +{ + char *end; + long rrtype; + dnslib_rrtype_descriptor_t *entry; + + entry = rrtype_descriptor_by_name(name); + if (entry) { + return entry->type; + } + + if (strlen(name) < 5) + return 0; + + if (strncasecmp(name, "TYPE", 4) != 0) + return 0; + + if (!isdigit((int)name[4])) + return 0; + + /* The rest from the string must be a number. */ + 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((int)name[5])) + return 0; + +// The rest from the string must be a number. + rrclass = strtol(name + 5, &end, 10); + if (*end != '\0') + return 0; + if (rrclass < 0 || rrclass > 65535L) + return 0; + + return (uint16_t) rrclass; +} + +*/ +/* end of file descriptor.c */ diff --git a/src/dnslib/descriptor.h b/src/dnslib/descriptor.h new file mode 100644 index 000000000..41bbc7571 --- /dev/null +++ b/src/dnslib/descriptor.h @@ -0,0 +1,128 @@ +/* + * File: descriptor.h + * Date: 12.11.2010 11:13 + * Author: jan + * Project: + * Description: + */ + + +#ifndef __DESCRIPTOR_H__ +#define __DESCRIPTOR_H__ + +#include <stdint.h> + +#include "common.h" + +//static const uint MAXRDATALEN=64; +#define MAXRDATALEN 64 +/* 64 is in NSD. Seems a little too much, but I'd say it's not a real issue. */ + +enum dnslib_rr_type +{ + DNSLIB_RRTYPE_UNKNOWN, /* 0 - an unknown type */ + DNSLIB_RRTYPE_A, /* 1 - a host address */ + DNSLIB_RRTYPE_NS, /* 2 - an authoritative name server */ + DNSLIB_RRTYPE_MD, /* 3 - a mail destination (Obsolete - use MX) */ + DNSLIB_RRTYPE_MF, /* 4 - a mail forwarder (Obsolete - use MX) */ + DNSLIB_RRTYPE_CNAME, /* 5 - the canonical name for an alias */ + DNSLIB_RRTYPE_SOA, /* 6 - marks the start of a zone of authority */ + DNSLIB_RRTYPE_MB, /* 7 - a mailbox domain name (EXPERIMENTAL) */ + DNSLIB_RRTYPE_MG, /* 8 - a mail group member (EXPERIMENTAL) */ + DNSLIB_RRTYPE_MR, /* 9 - a mail rename domain name (EXPERIMENTAL) */ + DNSLIB_RRTYPE_NULL, /* 10 - a null RR (EXPERIMENTAL) */ + DNSLIB_RRTYPE_WKS, /* 11 - a well known service description */ + DNSLIB_RRTYPE_PTR, /* 12 - a domain name pointer */ + DNSLIB_RRTYPE_HINFO, /* 13 - host information */ + DNSLIB_RRTYPE_MINFO, /* 14 - mailbox or mail list information */ + DNSLIB_RRTYPE_MX, /* 15 - mail exchange */ + DNSLIB_RRTYPE_TXT, /* 16 - text strings */ + DNSLIB_RRTYPE_RP, /* 17 - RFC1183 */ + DNSLIB_RRTYPE_AFSDB, /* 18 - RFC1183 */ + DNSLIB_RRTYPE_X25, /* 19 - RFC1183 */ + DNSLIB_RRTYPE_ISDN, /* 20 - RFC1183 */ + DNSLIB_RRTYPE_RT, /* 21 - RFC1183 */ + DNSLIB_RRTYPE_NSAP, /* 22 - RFC1706 */ + + DNSLIB_RRTYPE_SIG, /* 24 - 2535typecode */ + DNSLIB_RRTYPE_KEY, /* 25 - 2535typecode */ + DNSLIB_RRTYPE_PX, /* 26 - RFC2163 */ + + DNSLIB_RRTYPE_AAAA, /* 28 - ipv6 address */ + DNSLIB_RRTYPE_LOC, /* 29 - LOC record RFC1876 */ + DNSLIB_RRTYPE_NXT, /* 30 - 2535typecode */ + + DNSLIB_RRTYPE_SRV, /* 33 - SRV record RFC2782 */ + + DNSLIB_RRTYPE_NAPTR, /* 35 - RFC2915 */ + DNSLIB_RRTYPE_KX, /* 36 - RFC2230 Key Exchange Delegation Record */ + DNSLIB_RRTYPE_CERT, /* 37 - RFC2538 */ + + DNSLIB_RRTYPE_A6, /* 38 - RFC2874 */ + + DNSLIB_RRTYPE_DNAME, /* 39 - RFC2672 */ + + DNSLIB_RRTYPE_OPT, /* 41 - Pseudo OPT record... */ + DNSLIB_RRTYPE_APL, /* 42 - RFC3123 */ + DNSLIB_RRTYPE_DS, /* 43 - RFC 4033, 4034, and 4035 */ + DNSLIB_RRTYPE_SSHFP, /* 44 - SSH Key Fingerprint */ + DNSLIB_RRTYPE_IPSECKEY, /* 45 - public key for ipsec use. RFC 4025 */ + + DNSLIB_RRTYPE_RRSIG, /* 46 - RFC 4033, 4034, and 4035 */ + DNSLIB_RRTYPE_NSEC, /* 47 - RFC 4033, 4034, and 4035 */ + DNSLIB_RRTYPE_DNSKEY, /* 48 - RFC 4033, 4034, and 4035 */ + DNSLIB_RRTYPE_DHCID, /* 49 - RFC4701 DHCP information */ + DNSLIB_RRTYPE_NSEC3, /* 50 - NSEC3, secure denial, prevents zonewalking */ + DNSLIB_RRTYPE_NSEC3PARAM, /* 51 - NSEC3PARAM at zone apex nsec3 parameters */ + + /* TODO consider some better way of doing this, indices too high */ + + DNSLIB_RRTYPE_SPF = 99, /* RFC 4408 */ + + // not designating any RRs + DNSLIB_RRTYPE_TSIG = 250, + DNSLIB_RRTYPE_IXFR = 251, + DNSLIB_RRTYPE_AXFR = 252, + DNSLIB_RRTYPE_MAILB = 253, /* A request for mailbox-related records (MB, MG or MR) */ + DNSLIB_RRTYPE_MAILA = 254, /* A request for mail agent RRs (Obsolete - see MX) */ + DNSLIB_RRTYPE_ANY = 255, /* any type (wildcard) */ + + // totally weird numbers (cannot use for indexing) + DNSLIB_RRTYPE_TA = 32768, /* DNSSEC Trust Authorities ([Weiler] 2005-12-13) */ + DNSLIB_RRTYPE_DLV = 32769/* RFC 4431 */ +}; + +typedef enum dnslib_rr_type dnslib_rr_type_t; + +enum dnslib_rdata_wireformat +{ + DNSLIB_RDATA_WF_COMPRESSED_DNAME, /* Possibly compressed domain name. */ + DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME, /* Uncompressed domain name. */ + DNSLIB_RDATA_WF_LITERAL_DNAME, /* Literal (not downcased) dname. */ + DNSLIB_RDATA_WF_BYTE, /* 8-bit integer. */ + DNSLIB_RDATA_WF_SHORT, /* 16-bit integer. */ + DNSLIB_RDATA_WF_LONG, /* 32-bit integer. */ + DNSLIB_RDATA_WF_TEXT, /* Text string. */ + DNSLIB_RDATA_WF_A, /* 32-bit IPv4 address. */ + DNSLIB_RDATA_WF_AAAA, /* 128-bit IPv6 address. */ + DNSLIB_RDATA_WF_BINARY, /* Binary data (unknown length). */ + DNSLIB_RDATA_WF_BINARYWITHLENGTH, /* Binary data preceded by 1 byte length */ + DNSLIB_RDATA_WF_APL, /* APL data. */ + DNSLIB_RDATA_WF_IPSECGATEWAY /* IPSECKEY gateway ip4, ip6 or dname. */ +}; + +typedef enum dnslib_rdatawireformat dnslib_rdata_wireformat_t; + +struct dnslib_rrtype_descriptor +{ + uint16_t type; /* RR type */ + const char *name; /* Textual name. */ + uint32_t length; /* Maximum number of RDATAs. */ + uint8_t wireformat[MAXRDATALEN]; /* rdata_wireformat_type */ +}; + +typedef struct dnslib_rrtype_descriptor dnslib_rrtype_descriptor_t; + +#endif + +/* end of file descriptor.h */ -- GitLab