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