xref: /freebsd/contrib/ldns/rr.c (revision 5afab0e5e56fe90a378fb57249600e7924e1cab2)
17b5038d7SDag-Erling Smørgrav /* rr.c
27b5038d7SDag-Erling Smørgrav  *
37b5038d7SDag-Erling Smørgrav  * access functions for ldns_rr -
47b5038d7SDag-Erling Smørgrav  * a Net::DNS like library for C
57b5038d7SDag-Erling Smørgrav  * LibDNS Team @ NLnet Labs
67b5038d7SDag-Erling Smørgrav  *
77b5038d7SDag-Erling Smørgrav  * (c) NLnet Labs, 2004-2006
87b5038d7SDag-Erling Smørgrav  * See the file LICENSE for the license
97b5038d7SDag-Erling Smørgrav  */
107b5038d7SDag-Erling Smørgrav #include <ldns/config.h>
117b5038d7SDag-Erling Smørgrav 
127b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h>
13*5afab0e5SDag-Erling Smørgrav #include <ldns/internal.h>
147b5038d7SDag-Erling Smørgrav 
157b5038d7SDag-Erling Smørgrav #include <strings.h>
167b5038d7SDag-Erling Smørgrav #include <limits.h>
177b5038d7SDag-Erling Smørgrav 
187b5038d7SDag-Erling Smørgrav #include <errno.h>
197b5038d7SDag-Erling Smørgrav 
207b5038d7SDag-Erling Smørgrav #define LDNS_SYNTAX_DATALEN 16
217b5038d7SDag-Erling Smørgrav #define LDNS_TTL_DATALEN    21
227b5038d7SDag-Erling Smørgrav #define LDNS_RRLIST_INIT    8
237b5038d7SDag-Erling Smørgrav 
24*5afab0e5SDag-Erling Smørgrav #define _IS_WHITESPACE(chr) \
25*5afab0e5SDag-Erling Smørgrav     ( NULL != strchr( LDNS_PARSE_NO_NL, chr) )
26*5afab0e5SDag-Erling Smørgrav 
27*5afab0e5SDag-Erling Smørgrav #define _BUFFER_IS_AT_WHITESPACE(rd_buf) \
28*5afab0e5SDag-Erling Smørgrav     _IS_WHITESPACE(*(ldns_buffer_current(rd_buf)))
29*5afab0e5SDag-Erling Smørgrav 
307b5038d7SDag-Erling Smørgrav ldns_rr *
ldns_rr_new(void)317b5038d7SDag-Erling Smørgrav ldns_rr_new(void)
327b5038d7SDag-Erling Smørgrav {
337b5038d7SDag-Erling Smørgrav 	ldns_rr *rr;
347b5038d7SDag-Erling Smørgrav 	rr = LDNS_MALLOC(ldns_rr);
357b5038d7SDag-Erling Smørgrav         if (!rr) {
367b5038d7SDag-Erling Smørgrav                 return NULL;
377b5038d7SDag-Erling Smørgrav 	}
387b5038d7SDag-Erling Smørgrav 
397b5038d7SDag-Erling Smørgrav 	ldns_rr_set_owner(rr, NULL);
407b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(rr, false);
417b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, 0);
427b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields = NULL;
437b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(rr, LDNS_RR_CLASS_IN);
447b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL);
457b5038d7SDag-Erling Smørgrav         return rr;
467b5038d7SDag-Erling Smørgrav }
477b5038d7SDag-Erling Smørgrav 
487b5038d7SDag-Erling Smørgrav ldns_rr *
ldns_rr_new_frm_type(ldns_rr_type t)497b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_type(ldns_rr_type t)
507b5038d7SDag-Erling Smørgrav {
517b5038d7SDag-Erling Smørgrav 	ldns_rr *rr;
527b5038d7SDag-Erling Smørgrav 	const ldns_rr_descriptor *desc;
537b5038d7SDag-Erling Smørgrav 	size_t i;
547b5038d7SDag-Erling Smørgrav 
557b5038d7SDag-Erling Smørgrav 	rr = LDNS_MALLOC(ldns_rr);
567b5038d7SDag-Erling Smørgrav         if (!rr) {
577b5038d7SDag-Erling Smørgrav                 return NULL;
587b5038d7SDag-Erling Smørgrav 	}
597b5038d7SDag-Erling Smørgrav 
607b5038d7SDag-Erling Smørgrav 	desc = ldns_rr_descript(t);
617b5038d7SDag-Erling Smørgrav 
627b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields = LDNS_XMALLOC(ldns_rdf *, ldns_rr_descriptor_minimum(desc));
637b5038d7SDag-Erling Smørgrav         if(!rr->_rdata_fields) {
647b5038d7SDag-Erling Smørgrav                 LDNS_FREE(rr);
657b5038d7SDag-Erling Smørgrav                 return NULL;
667b5038d7SDag-Erling Smørgrav         }
677b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_descriptor_minimum(desc); i++) {
687b5038d7SDag-Erling Smørgrav 		rr->_rdata_fields[i] = NULL;
697b5038d7SDag-Erling Smørgrav 	}
707b5038d7SDag-Erling Smørgrav 
717b5038d7SDag-Erling Smørgrav 	ldns_rr_set_owner(rr, NULL);
727b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(rr, false);
737b5038d7SDag-Erling Smørgrav 	/* set the count to minimum */
747b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, ldns_rr_descriptor_minimum(desc));
757b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(rr, LDNS_RR_CLASS_IN);
767b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL);
777b5038d7SDag-Erling Smørgrav 	ldns_rr_set_type(rr, t);
787b5038d7SDag-Erling Smørgrav 	return rr;
797b5038d7SDag-Erling Smørgrav }
807b5038d7SDag-Erling Smørgrav 
817b5038d7SDag-Erling Smørgrav void
ldns_rr_free(ldns_rr * rr)827b5038d7SDag-Erling Smørgrav ldns_rr_free(ldns_rr *rr)
837b5038d7SDag-Erling Smørgrav {
847b5038d7SDag-Erling Smørgrav 	size_t i;
857b5038d7SDag-Erling Smørgrav 	if (rr) {
867b5038d7SDag-Erling Smørgrav 		if (ldns_rr_owner(rr)) {
877b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(ldns_rr_owner(rr));
887b5038d7SDag-Erling Smørgrav 		}
897b5038d7SDag-Erling Smørgrav 		for (i = 0; i < ldns_rr_rd_count(rr); i++) {
907b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(ldns_rr_rdf(rr, i));
917b5038d7SDag-Erling Smørgrav 		}
927b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr->_rdata_fields);
937b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr);
947b5038d7SDag-Erling Smørgrav 	}
957b5038d7SDag-Erling Smørgrav }
967b5038d7SDag-Erling Smørgrav 
9717d15b25SDag-Erling Smørgrav /* Syntactic sugar for ldns_rr_new_frm_str_internal */
9817d15b25SDag-Erling Smørgrav INLINE bool
ldns_rdf_type_maybe_quoted(ldns_rdf_type rdf_type)9917d15b25SDag-Erling Smørgrav ldns_rdf_type_maybe_quoted(ldns_rdf_type rdf_type)
10017d15b25SDag-Erling Smørgrav {
10117d15b25SDag-Erling Smørgrav 	return  rdf_type == LDNS_RDF_TYPE_STR ||
10217d15b25SDag-Erling Smørgrav 		rdf_type == LDNS_RDF_TYPE_LONG_STR;
10317d15b25SDag-Erling Smørgrav }
10417d15b25SDag-Erling Smørgrav 
1057b5038d7SDag-Erling Smørgrav /*
1067b5038d7SDag-Erling Smørgrav  * trailing spaces are allowed
1077b5038d7SDag-Erling Smørgrav  * leading spaces are not allowed
1087b5038d7SDag-Erling Smørgrav  * allow ttl to be optional
1097b5038d7SDag-Erling Smørgrav  * class is optional too
1107b5038d7SDag-Erling Smørgrav  * if ttl is missing, and default_ttl is 0, use DEF_TTL
1117b5038d7SDag-Erling Smørgrav  * allow ttl to be written as 1d3h
1127b5038d7SDag-Erling Smørgrav  * So the RR should look like. e.g.
1137b5038d7SDag-Erling Smørgrav  * miek.nl. 3600 IN MX 10 elektron.atoom.net
1147b5038d7SDag-Erling Smørgrav  * or
1157b5038d7SDag-Erling Smørgrav  * miek.nl. 1h IN MX 10 elektron.atoom.net
1167b5038d7SDag-Erling Smørgrav  * or
1177b5038d7SDag-Erling Smørgrav  * miek.nl. IN MX 10 elektron.atoom.net
1187b5038d7SDag-Erling Smørgrav  */
1197b5038d7SDag-Erling Smørgrav static ldns_status
ldns_rr_new_frm_str_internal(ldns_rr ** newrr,const char * str,uint32_t default_ttl,const ldns_rdf * origin,ldns_rdf ** prev,bool question,bool * explicit_ttl)1207b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
121986ba33cSDag-Erling Smørgrav                              uint32_t default_ttl, const ldns_rdf *origin,
122*5afab0e5SDag-Erling Smørgrav                              ldns_rdf **prev, bool question,
123*5afab0e5SDag-Erling Smørgrav 			     bool *explicit_ttl)
1247b5038d7SDag-Erling Smørgrav {
1257b5038d7SDag-Erling Smørgrav 	ldns_rr *new;
1267b5038d7SDag-Erling Smørgrav 	const ldns_rr_descriptor *desc;
1277b5038d7SDag-Erling Smørgrav 	ldns_rr_type rr_type;
1287b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr_buf = NULL;
1297b5038d7SDag-Erling Smørgrav 	ldns_buffer *rd_buf = NULL;
1307b5038d7SDag-Erling Smørgrav 	uint32_t ttl_val;
1317b5038d7SDag-Erling Smørgrav 	char  *owner = NULL;
1327b5038d7SDag-Erling Smørgrav 	char  *ttl = NULL;
1337b5038d7SDag-Erling Smørgrav 	ldns_rr_class clas_val;
1347b5038d7SDag-Erling Smørgrav 	char  *clas = NULL;
1357b5038d7SDag-Erling Smørgrav 	char  *type = NULL;
136*5afab0e5SDag-Erling Smørgrav 	size_t type_sz;
1377b5038d7SDag-Erling Smørgrav 	char  *rdata = NULL;
1387b5038d7SDag-Erling Smørgrav 	char  *rd = NULL;
13917d15b25SDag-Erling Smørgrav 	char  *xtok = NULL; /* For RDF types with spaces (i.e. extra tokens) */
1407b5038d7SDag-Erling Smørgrav 	size_t rd_strlen;
1417b5038d7SDag-Erling Smørgrav 	const char *delimiters;
1427b5038d7SDag-Erling Smørgrav 	ssize_t c;
1437b5038d7SDag-Erling Smørgrav 	ldns_rdf *owner_dname;
1447b5038d7SDag-Erling Smørgrav         const char* endptr;
1457b5038d7SDag-Erling Smørgrav         int was_unknown_rr_format = 0;
1467b5038d7SDag-Erling Smørgrav 	ldns_status status = LDNS_STATUS_OK;
1477b5038d7SDag-Erling Smørgrav 
1487b5038d7SDag-Erling Smørgrav 	/* used for types with unknown number of rdatas */
1497b5038d7SDag-Erling Smørgrav 	bool done;
1507b5038d7SDag-Erling Smørgrav 	bool quoted;
1517b5038d7SDag-Erling Smørgrav 
1527b5038d7SDag-Erling Smørgrav 	ldns_rdf *r = NULL;
1537b5038d7SDag-Erling Smørgrav 	uint16_t r_cnt;
1547b5038d7SDag-Erling Smørgrav 	uint16_t r_min;
1557b5038d7SDag-Erling Smørgrav 	uint16_t r_max;
1567b5038d7SDag-Erling Smørgrav         size_t pre_data_pos;
1577b5038d7SDag-Erling Smørgrav 
15817d15b25SDag-Erling Smørgrav 	uint16_t hex_data_size;
15917d15b25SDag-Erling Smørgrav 	char *hex_data_str = NULL;
16017d15b25SDag-Erling Smørgrav 	uint16_t cur_hex_data_size;
16117d15b25SDag-Erling Smørgrav 	size_t hex_pos = 0;
16217d15b25SDag-Erling Smørgrav 	uint8_t *hex_data = NULL;
16317d15b25SDag-Erling Smørgrav 
1647b5038d7SDag-Erling Smørgrav 	new = ldns_rr_new();
1657b5038d7SDag-Erling Smørgrav 
1667b5038d7SDag-Erling Smørgrav 	owner = LDNS_XMALLOC(char, LDNS_MAX_DOMAINLEN + 1);
1677b5038d7SDag-Erling Smørgrav 	ttl = LDNS_XMALLOC(char, LDNS_TTL_DATALEN);
1687b5038d7SDag-Erling Smørgrav 	clas = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN);
1697b5038d7SDag-Erling Smørgrav 	rdata = LDNS_XMALLOC(char, LDNS_MAX_PACKETLEN + 1);
1707b5038d7SDag-Erling Smørgrav 	rr_buf = LDNS_MALLOC(ldns_buffer);
1717b5038d7SDag-Erling Smørgrav 	rd_buf = LDNS_MALLOC(ldns_buffer);
1727b5038d7SDag-Erling Smørgrav 	rd = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
17317d15b25SDag-Erling Smørgrav 	xtok = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
17417d15b25SDag-Erling Smørgrav 	if (rr_buf) {
17517d15b25SDag-Erling Smørgrav 		rr_buf->_data = NULL;
17617d15b25SDag-Erling Smørgrav 	}
17717d15b25SDag-Erling Smørgrav 	if (rd_buf) {
17817d15b25SDag-Erling Smørgrav 		rd_buf->_data = NULL;
17917d15b25SDag-Erling Smørgrav 	}
18017d15b25SDag-Erling Smørgrav 	if (!new || !owner || !ttl || !clas || !rdata ||
18117d15b25SDag-Erling Smørgrav 			!rr_buf || !rd_buf || !rd || !xtok) {
18217d15b25SDag-Erling Smørgrav 
18317d15b25SDag-Erling Smørgrav 		goto memerror;
1847b5038d7SDag-Erling Smørgrav 	}
1857b5038d7SDag-Erling Smørgrav 
1867b5038d7SDag-Erling Smørgrav 	ldns_buffer_new_frm_data(rr_buf, (char*)str, strlen(str));
1877b5038d7SDag-Erling Smørgrav 
1887b5038d7SDag-Erling Smørgrav 	/* split the rr in its parts -1 signals trouble */
1897b5038d7SDag-Erling Smørgrav 	if (ldns_bget_token(rr_buf, owner, "\t\n ", LDNS_MAX_DOMAINLEN) == -1){
19017d15b25SDag-Erling Smørgrav 
1917b5038d7SDag-Erling Smørgrav 		status = LDNS_STATUS_SYNTAX_ERR;
19217d15b25SDag-Erling Smørgrav 		goto error;
1937b5038d7SDag-Erling Smørgrav 	}
1947b5038d7SDag-Erling Smørgrav 
1957b5038d7SDag-Erling Smørgrav 	if (ldns_bget_token(rr_buf, ttl, "\t\n ", LDNS_TTL_DATALEN) == -1) {
19617d15b25SDag-Erling Smørgrav 
1977b5038d7SDag-Erling Smørgrav 		status = LDNS_STATUS_SYNTAX_TTL_ERR;
19817d15b25SDag-Erling Smørgrav 		goto error;
1997b5038d7SDag-Erling Smørgrav 	}
2007b5038d7SDag-Erling Smørgrav 	ttl_val = (uint32_t) ldns_str2period(ttl, &endptr);
2017b5038d7SDag-Erling Smørgrav 
2027b5038d7SDag-Erling Smørgrav 	if (strlen(ttl) > 0 && !isdigit((int) ttl[0])) {
2037b5038d7SDag-Erling Smørgrav 		/* ah, it's not there or something */
2047b5038d7SDag-Erling Smørgrav 		if (default_ttl == 0) {
2057b5038d7SDag-Erling Smørgrav 			ttl_val = LDNS_DEFAULT_TTL;
2067b5038d7SDag-Erling Smørgrav 		} else {
2077b5038d7SDag-Erling Smørgrav 			ttl_val = default_ttl;
2087b5038d7SDag-Erling Smørgrav 		}
209*5afab0e5SDag-Erling Smørgrav 		if (explicit_ttl)
210*5afab0e5SDag-Erling Smørgrav 			*explicit_ttl = false;
211*5afab0e5SDag-Erling Smørgrav 
2127b5038d7SDag-Erling Smørgrav 		/* we not ASSUMING the TTL is missing and that
2137b5038d7SDag-Erling Smørgrav 		 * the rest of the RR is still there. That is
2147b5038d7SDag-Erling Smørgrav 		 * CLASS TYPE RDATA
2157b5038d7SDag-Erling Smørgrav 		 * so ttl value we read is actually the class
2167b5038d7SDag-Erling Smørgrav 		 */
2177b5038d7SDag-Erling Smørgrav 		clas_val = ldns_get_rr_class_by_name(ttl);
2187b5038d7SDag-Erling Smørgrav 		/* class can be left out too, assume IN, current
2197b5038d7SDag-Erling Smørgrav 		 * token must be type
2207b5038d7SDag-Erling Smørgrav 		 */
2217b5038d7SDag-Erling Smørgrav 		if (clas_val == 0) {
2227b5038d7SDag-Erling Smørgrav 			clas_val = LDNS_RR_CLASS_IN;
223*5afab0e5SDag-Erling Smørgrav 			type_sz = strlen(ttl) + 1;
224*5afab0e5SDag-Erling Smørgrav 			type = LDNS_XMALLOC(char, type_sz);
2257b5038d7SDag-Erling Smørgrav 			if (!type) {
22617d15b25SDag-Erling Smørgrav 				goto memerror;
2277b5038d7SDag-Erling Smørgrav 			}
228*5afab0e5SDag-Erling Smørgrav 			strlcpy(type, ttl, type_sz);
2297b5038d7SDag-Erling Smørgrav 		}
2307b5038d7SDag-Erling Smørgrav 	} else {
231*5afab0e5SDag-Erling Smørgrav 		if (explicit_ttl)
232*5afab0e5SDag-Erling Smørgrav 			*explicit_ttl = true;
233*5afab0e5SDag-Erling Smørgrav 
23417d15b25SDag-Erling Smørgrav 		if (-1 == ldns_bget_token(
23517d15b25SDag-Erling Smørgrav 				rr_buf, clas, "\t\n ", LDNS_SYNTAX_DATALEN)) {
23617d15b25SDag-Erling Smørgrav 
2377b5038d7SDag-Erling Smørgrav 			status = LDNS_STATUS_SYNTAX_CLASS_ERR;
23817d15b25SDag-Erling Smørgrav 			goto error;
2397b5038d7SDag-Erling Smørgrav 		}
2407b5038d7SDag-Erling Smørgrav 		clas_val = ldns_get_rr_class_by_name(clas);
2417b5038d7SDag-Erling Smørgrav 		/* class can be left out too, assume IN, current
2427b5038d7SDag-Erling Smørgrav 		 * token must be type
2437b5038d7SDag-Erling Smørgrav 		 */
2447b5038d7SDag-Erling Smørgrav 		if (clas_val == 0) {
2457b5038d7SDag-Erling Smørgrav 			clas_val = LDNS_RR_CLASS_IN;
246*5afab0e5SDag-Erling Smørgrav 			type_sz = strlen(clas) + 1;
247*5afab0e5SDag-Erling Smørgrav 			type = LDNS_XMALLOC(char, type_sz);
2487b5038d7SDag-Erling Smørgrav 			if (!type) {
24917d15b25SDag-Erling Smørgrav 				goto memerror;
2507b5038d7SDag-Erling Smørgrav 			}
251*5afab0e5SDag-Erling Smørgrav 			strlcpy(type, clas, type_sz);
2527b5038d7SDag-Erling Smørgrav 		}
2537b5038d7SDag-Erling Smørgrav 	}
2547b5038d7SDag-Erling Smørgrav 	/* the rest should still be waiting for us */
2557b5038d7SDag-Erling Smørgrav 
2567b5038d7SDag-Erling Smørgrav 	if (!type) {
2577b5038d7SDag-Erling Smørgrav 		type = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN);
2587b5038d7SDag-Erling Smørgrav 		if (!type) {
25917d15b25SDag-Erling Smørgrav 			goto memerror;
2607b5038d7SDag-Erling Smørgrav 		}
26117d15b25SDag-Erling Smørgrav 		if (-1 == ldns_bget_token(
26217d15b25SDag-Erling Smørgrav 				rr_buf, type, "\t\n ", LDNS_SYNTAX_DATALEN)) {
26317d15b25SDag-Erling Smørgrav 
2647b5038d7SDag-Erling Smørgrav 			status = LDNS_STATUS_SYNTAX_TYPE_ERR;
26517d15b25SDag-Erling Smørgrav 			goto error;
2667b5038d7SDag-Erling Smørgrav 		}
2677b5038d7SDag-Erling Smørgrav 	}
2687b5038d7SDag-Erling Smørgrav 
2697b5038d7SDag-Erling Smørgrav 	if (ldns_bget_token(rr_buf, rdata, "\0", LDNS_MAX_PACKETLEN) == -1) {
2707b5038d7SDag-Erling Smørgrav 		/* apparently we are done, and it's only a question RR
2717b5038d7SDag-Erling Smørgrav 		 * so do not set status and go to ldnserror here
2727b5038d7SDag-Erling Smørgrav 		 */
2737b5038d7SDag-Erling Smørgrav 	}
2747b5038d7SDag-Erling Smørgrav 	ldns_buffer_new_frm_data(rd_buf, rdata, strlen(rdata));
2757b5038d7SDag-Erling Smørgrav 
276*5afab0e5SDag-Erling Smørgrav 	if (strncmp(owner, "@", 1) == 0) {
2777b5038d7SDag-Erling Smørgrav 		if (origin) {
2787b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, ldns_rdf_clone(origin));
2797b5038d7SDag-Erling Smørgrav 		} else if (prev && *prev) {
2807b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, ldns_rdf_clone(*prev));
2817b5038d7SDag-Erling Smørgrav 		} else {
2827b5038d7SDag-Erling Smørgrav 			/* default to root */
2837b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, ldns_dname_new_frm_str("."));
2847b5038d7SDag-Erling Smørgrav 		}
2857b5038d7SDag-Erling Smørgrav 
2867b5038d7SDag-Erling Smørgrav 		/* @ also overrides prev */
2877b5038d7SDag-Erling Smørgrav 		if (prev) {
2887b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(*prev);
2897b5038d7SDag-Erling Smørgrav 			*prev = ldns_rdf_clone(ldns_rr_owner(new));
2907b5038d7SDag-Erling Smørgrav 			if (!*prev) {
29117d15b25SDag-Erling Smørgrav 				goto memerror;
2927b5038d7SDag-Erling Smørgrav 			}
2937b5038d7SDag-Erling Smørgrav 		}
2947b5038d7SDag-Erling Smørgrav 	} else {
2957b5038d7SDag-Erling Smørgrav 		if (strlen(owner) == 0) {
2967b5038d7SDag-Erling Smørgrav 			/* no ownername was given, try prev, if that fails
2977b5038d7SDag-Erling Smørgrav 			 * origin, else default to root */
2987b5038d7SDag-Erling Smørgrav 			if (prev && *prev) {
2997b5038d7SDag-Erling Smørgrav 				ldns_rr_set_owner(new, ldns_rdf_clone(*prev));
3007b5038d7SDag-Erling Smørgrav 			} else if (origin) {
3017b5038d7SDag-Erling Smørgrav 				ldns_rr_set_owner(new, ldns_rdf_clone(origin));
3027b5038d7SDag-Erling Smørgrav 			} else {
30317d15b25SDag-Erling Smørgrav 				ldns_rr_set_owner(new,
30417d15b25SDag-Erling Smørgrav 						ldns_dname_new_frm_str("."));
3057b5038d7SDag-Erling Smørgrav 			}
3067b5038d7SDag-Erling Smørgrav 			if(!ldns_rr_owner(new)) {
30717d15b25SDag-Erling Smørgrav 				goto memerror;
3087b5038d7SDag-Erling Smørgrav 			}
3097b5038d7SDag-Erling Smørgrav 		} else {
3107b5038d7SDag-Erling Smørgrav 			owner_dname = ldns_dname_new_frm_str(owner);
3117b5038d7SDag-Erling Smørgrav 			if (!owner_dname) {
3127b5038d7SDag-Erling Smørgrav 				status = LDNS_STATUS_SYNTAX_ERR;
31317d15b25SDag-Erling Smørgrav 				goto error;
3147b5038d7SDag-Erling Smørgrav 			}
3157b5038d7SDag-Erling Smørgrav 
3167b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, owner_dname);
3177b5038d7SDag-Erling Smørgrav 			if (!ldns_dname_str_absolute(owner) && origin) {
31817d15b25SDag-Erling Smørgrav 				if(ldns_dname_cat(ldns_rr_owner(new), origin)
31917d15b25SDag-Erling Smørgrav 						!= LDNS_STATUS_OK) {
32017d15b25SDag-Erling Smørgrav 
3217b5038d7SDag-Erling Smørgrav 					status = LDNS_STATUS_SYNTAX_ERR;
32217d15b25SDag-Erling Smørgrav 					goto error;
3237b5038d7SDag-Erling Smørgrav 				}
3247b5038d7SDag-Erling Smørgrav 			}
3257b5038d7SDag-Erling Smørgrav 			if (prev) {
3267b5038d7SDag-Erling Smørgrav 				ldns_rdf_deep_free(*prev);
3277b5038d7SDag-Erling Smørgrav 				*prev = ldns_rdf_clone(ldns_rr_owner(new));
3287b5038d7SDag-Erling Smørgrav 				if (!*prev) {
32917d15b25SDag-Erling Smørgrav 					goto error;
3307b5038d7SDag-Erling Smørgrav 				}
3317b5038d7SDag-Erling Smørgrav 			}
3327b5038d7SDag-Erling Smørgrav 		}
3337b5038d7SDag-Erling Smørgrav 	}
3347b5038d7SDag-Erling Smørgrav 	LDNS_FREE(owner);
3357b5038d7SDag-Erling Smørgrav 
3367b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(new, question);
3377b5038d7SDag-Erling Smørgrav 
3387b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(new, ttl_val);
3397b5038d7SDag-Erling Smørgrav 	LDNS_FREE(ttl);
3407b5038d7SDag-Erling Smørgrav 
3417b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(new, clas_val);
3427b5038d7SDag-Erling Smørgrav 	LDNS_FREE(clas);
3437b5038d7SDag-Erling Smørgrav 
3447b5038d7SDag-Erling Smørgrav 	rr_type = ldns_get_rr_type_by_name(type);
3457b5038d7SDag-Erling Smørgrav 	LDNS_FREE(type);
3467b5038d7SDag-Erling Smørgrav 
3477b5038d7SDag-Erling Smørgrav 	desc = ldns_rr_descript((uint16_t)rr_type);
3487b5038d7SDag-Erling Smørgrav 	ldns_rr_set_type(new, rr_type);
3497b5038d7SDag-Erling Smørgrav 	if (desc) {
3507b5038d7SDag-Erling Smørgrav 		/* only the rdata remains */
3517b5038d7SDag-Erling Smørgrav 		r_max = ldns_rr_descriptor_maximum(desc);
3527b5038d7SDag-Erling Smørgrav 		r_min = ldns_rr_descriptor_minimum(desc);
3537b5038d7SDag-Erling Smørgrav 	} else {
3547b5038d7SDag-Erling Smørgrav 		r_min = 0;
3557b5038d7SDag-Erling Smørgrav 		r_max = 1;
3567b5038d7SDag-Erling Smørgrav 	}
3577b5038d7SDag-Erling Smørgrav 
35817d15b25SDag-Erling Smørgrav 	for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
3597b5038d7SDag-Erling Smørgrav 		quoted = false;
36017d15b25SDag-Erling Smørgrav 
36117d15b25SDag-Erling Smørgrav 		switch (ldns_rr_descriptor_field_type(desc, r_cnt)) {
36217d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_B64        :
36317d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_HEX        : /* These rdf types may con- */
364*5afab0e5SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_NSEC       : /* tain whitespace, only if */
365*5afab0e5SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_LOC        : /* it is the last rd field. */
366*5afab0e5SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_WKS        :
36717d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_IPSECKEY   :
368*5afab0e5SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_AMTRELAY   :
369*5afab0e5SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_SVCPARAMS  :	if (r_cnt == r_max - 1) {
370986ba33cSDag-Erling Smørgrav 							delimiters = "\n";
37117d15b25SDag-Erling Smørgrav 							break;
37217d15b25SDag-Erling Smørgrav 						}
373*5afab0e5SDag-Erling Smørgrav 						/* fallthrough */
37417d15b25SDag-Erling Smørgrav 		default                       :	delimiters = "\n\t ";
3757b5038d7SDag-Erling Smørgrav 		}
3767b5038d7SDag-Erling Smørgrav 
37717d15b25SDag-Erling Smørgrav 		if (ldns_rdf_type_maybe_quoted(
37817d15b25SDag-Erling Smørgrav 				ldns_rr_descriptor_field_type(
37917d15b25SDag-Erling Smørgrav 				desc, r_cnt)) &&
3807b5038d7SDag-Erling Smørgrav 				ldns_buffer_remaining(rd_buf) > 0){
38117d15b25SDag-Erling Smørgrav 
382*5afab0e5SDag-Erling Smørgrav 			/* skip whitespace */
383*5afab0e5SDag-Erling Smørgrav 			while (ldns_buffer_remaining(rd_buf) > 0 &&
384*5afab0e5SDag-Erling Smørgrav 				_BUFFER_IS_AT_WHITESPACE(rd_buf)) {
3857b5038d7SDag-Erling Smørgrav 				ldns_buffer_skip(rd_buf, 1);
3867b5038d7SDag-Erling Smørgrav 			}
3877b5038d7SDag-Erling Smørgrav 
388*5afab0e5SDag-Erling Smørgrav 			if (ldns_buffer_remaining(rd_buf) > 0 &&
389*5afab0e5SDag-Erling Smørgrav 				*(ldns_buffer_current(rd_buf)) == '\"') {
3907b5038d7SDag-Erling Smørgrav 				delimiters = "\"\0";
3917b5038d7SDag-Erling Smørgrav 				ldns_buffer_skip(rd_buf, 1);
3927b5038d7SDag-Erling Smørgrav 				quoted = true;
393*5afab0e5SDag-Erling Smørgrav 			}
394*5afab0e5SDag-Erling Smørgrav 			if (!quoted && ldns_rr_descriptor_field_type(desc, r_cnt)
395986ba33cSDag-Erling Smørgrav 					== LDNS_RDF_TYPE_LONG_STR) {
396986ba33cSDag-Erling Smørgrav 
397986ba33cSDag-Erling Smørgrav 				status = LDNS_STATUS_SYNTAX_RDATA_ERR;
398986ba33cSDag-Erling Smørgrav 				goto error;
3997b5038d7SDag-Erling Smørgrav 			}
4007b5038d7SDag-Erling Smørgrav 		}
4017b5038d7SDag-Erling Smørgrav 
40217d15b25SDag-Erling Smørgrav 		/* because number of fields can be variable, we can't rely on
40317d15b25SDag-Erling Smørgrav 		 * _maximum() only
40417d15b25SDag-Erling Smørgrav 		 */
40517d15b25SDag-Erling Smørgrav 
406*5afab0e5SDag-Erling Smørgrav 		/* skip whitespace */
40717d15b25SDag-Erling Smørgrav 		while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
408*5afab0e5SDag-Erling Smørgrav 				&& _BUFFER_IS_AT_WHITESPACE(rd_buf)
40917d15b25SDag-Erling Smørgrav 				&& !quoted) {
41017d15b25SDag-Erling Smørgrav 
4117b5038d7SDag-Erling Smørgrav 			ldns_buffer_skip(rd_buf, 1);
4127b5038d7SDag-Erling Smørgrav 		}
4137b5038d7SDag-Erling Smørgrav 
4147b5038d7SDag-Erling Smørgrav 		pre_data_pos = ldns_buffer_position(rd_buf);
41517d15b25SDag-Erling Smørgrav 		if (-1 == (c = ldns_bget_token(
41617d15b25SDag-Erling Smørgrav 				rd_buf, rd, delimiters, LDNS_MAX_RDFLEN))) {
41717d15b25SDag-Erling Smørgrav 
41817d15b25SDag-Erling Smørgrav 			done = true;
419*5afab0e5SDag-Erling Smørgrav 			(void)done; /* we're breaking, so done not read anymore */
42017d15b25SDag-Erling Smørgrav 			break;
42117d15b25SDag-Erling Smørgrav 		}
42217d15b25SDag-Erling Smørgrav 		/* hmmz, rfc3597 specifies that any type can be represented
42317d15b25SDag-Erling Smørgrav 		 * with \# method, which can contain spaces...
4247b5038d7SDag-Erling Smørgrav 		 * it does specify size though...
4257b5038d7SDag-Erling Smørgrav 		 */
4267b5038d7SDag-Erling Smørgrav 		rd_strlen = strlen(rd);
4277b5038d7SDag-Erling Smørgrav 
4287b5038d7SDag-Erling Smørgrav 		/* unknown RR data */
42917d15b25SDag-Erling Smørgrav 		if (strncmp(rd, "\\#", 2) == 0 && !quoted &&
430*5afab0e5SDag-Erling Smørgrav 				(rd_strlen == 2 || _IS_WHITESPACE(rd[2]))) {
4317b5038d7SDag-Erling Smørgrav 
4327b5038d7SDag-Erling Smørgrav 			was_unknown_rr_format = 1;
43317d15b25SDag-Erling Smørgrav 			/* go back to before \#
43417d15b25SDag-Erling Smørgrav 			 * and skip it while setting delimiters better
43517d15b25SDag-Erling Smørgrav 			 */
4367b5038d7SDag-Erling Smørgrav 			ldns_buffer_set_position(rd_buf, pre_data_pos);
4377b5038d7SDag-Erling Smørgrav 			delimiters = "\n\t ";
43817d15b25SDag-Erling Smørgrav 			(void)ldns_bget_token(rd_buf, rd,
43917d15b25SDag-Erling Smørgrav 					delimiters, LDNS_MAX_RDFLEN);
4407b5038d7SDag-Erling Smørgrav 			/* read rdata octet length */
44117d15b25SDag-Erling Smørgrav 			c = ldns_bget_token(rd_buf, rd,
44217d15b25SDag-Erling Smørgrav 					delimiters, LDNS_MAX_RDFLEN);
4437b5038d7SDag-Erling Smørgrav 			if (c == -1) {
4447b5038d7SDag-Erling Smørgrav 				/* something goes very wrong here */
44517d15b25SDag-Erling Smørgrav 				status = LDNS_STATUS_SYNTAX_RDATA_ERR;
44617d15b25SDag-Erling Smørgrav 				goto error;
4477b5038d7SDag-Erling Smørgrav 			}
4487b5038d7SDag-Erling Smørgrav 			hex_data_size = (uint16_t) atoi(rd);
44917d15b25SDag-Erling Smørgrav 			/* copy hex chars into hex str (2 chars per byte) */
4507b5038d7SDag-Erling Smørgrav 			hex_data_str = LDNS_XMALLOC(char, 2*hex_data_size + 1);
4517b5038d7SDag-Erling Smørgrav 			if (!hex_data_str) {
4527b5038d7SDag-Erling Smørgrav 				/* malloc error */
45317d15b25SDag-Erling Smørgrav 				goto memerror;
4547b5038d7SDag-Erling Smørgrav 			}
4557b5038d7SDag-Erling Smørgrav 			cur_hex_data_size = 0;
4567b5038d7SDag-Erling Smørgrav 			while(cur_hex_data_size < 2 * hex_data_size) {
45717d15b25SDag-Erling Smørgrav 				c = ldns_bget_token(rd_buf, rd,
45817d15b25SDag-Erling Smørgrav 						delimiters, LDNS_MAX_RDFLEN);
459*5afab0e5SDag-Erling Smørgrav 				if (c == -1) {
46017d15b25SDag-Erling Smørgrav 					status = LDNS_STATUS_SYNTAX_RDATA_ERR;
46117d15b25SDag-Erling Smørgrav 					goto error;
4627b5038d7SDag-Erling Smørgrav 				}
463*5afab0e5SDag-Erling Smørgrav 				rd_strlen = strlen(rd);
464*5afab0e5SDag-Erling Smørgrav 				if ((size_t)cur_hex_data_size + rd_strlen >
465*5afab0e5SDag-Erling Smørgrav 				    2 * (size_t)hex_data_size) {
466*5afab0e5SDag-Erling Smørgrav 					status = LDNS_STATUS_SYNTAX_RDATA_ERR;
467*5afab0e5SDag-Erling Smørgrav 					goto error;
468*5afab0e5SDag-Erling Smørgrav 				}
469*5afab0e5SDag-Erling Smørgrav 				strlcpy(hex_data_str + cur_hex_data_size, rd,
470*5afab0e5SDag-Erling Smørgrav 						rd_strlen + 1);
47117d15b25SDag-Erling Smørgrav 
4727b5038d7SDag-Erling Smørgrav 				cur_hex_data_size += rd_strlen;
4737b5038d7SDag-Erling Smørgrav 			}
4747b5038d7SDag-Erling Smørgrav 			hex_data_str[cur_hex_data_size] = '\0';
4757b5038d7SDag-Erling Smørgrav 
4767b5038d7SDag-Erling Smørgrav 			/* correct the rdf type */
4777b5038d7SDag-Erling Smørgrav 			/* if *we* know the type, interpret it as wireformat */
4787b5038d7SDag-Erling Smørgrav 			if (desc) {
47917d15b25SDag-Erling Smørgrav 				hex_pos = 0;
48017d15b25SDag-Erling Smørgrav 				hex_data =
48117d15b25SDag-Erling Smørgrav 					LDNS_XMALLOC(uint8_t, hex_data_size+2);
48217d15b25SDag-Erling Smørgrav 
4837b5038d7SDag-Erling Smørgrav 				if (!hex_data) {
48417d15b25SDag-Erling Smørgrav 					goto memerror;
4857b5038d7SDag-Erling Smørgrav 				}
4867b5038d7SDag-Erling Smørgrav 				ldns_write_uint16(hex_data, hex_data_size);
48717d15b25SDag-Erling Smørgrav 				ldns_hexstring_to_data(
48817d15b25SDag-Erling Smørgrav 						hex_data + 2, hex_data_str);
48917d15b25SDag-Erling Smørgrav 				status = ldns_wire2rdf(new, hex_data,
4907b5038d7SDag-Erling Smørgrav 						hex_data_size + 2, &hex_pos);
49117d15b25SDag-Erling Smørgrav 				if (status != LDNS_STATUS_OK) {
49217d15b25SDag-Erling Smørgrav 					goto error;
4937b5038d7SDag-Erling Smørgrav 				}
4947b5038d7SDag-Erling Smørgrav 				LDNS_FREE(hex_data);
4957b5038d7SDag-Erling Smørgrav 			} else {
49617d15b25SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_HEX,
49717d15b25SDag-Erling Smørgrav 						hex_data_str);
4987b5038d7SDag-Erling Smørgrav 				if (!r) {
49917d15b25SDag-Erling Smørgrav 					goto memerror;
5007b5038d7SDag-Erling Smørgrav 				}
5017b5038d7SDag-Erling Smørgrav 				ldns_rdf_set_type(r, LDNS_RDF_TYPE_UNKNOWN);
5027b5038d7SDag-Erling Smørgrav 				if (!ldns_rr_push_rdf(new, r)) {
50317d15b25SDag-Erling Smørgrav 					goto memerror;
5047b5038d7SDag-Erling Smørgrav 				}
5057b5038d7SDag-Erling Smørgrav 			}
5067b5038d7SDag-Erling Smørgrav 			LDNS_FREE(hex_data_str);
50717d15b25SDag-Erling Smørgrav 
508986ba33cSDag-Erling Smørgrav 		} else if(rd_strlen > 0 || quoted) {
5097b5038d7SDag-Erling Smørgrav 			/* Normal RR */
5107b5038d7SDag-Erling Smørgrav 			switch(ldns_rr_descriptor_field_type(desc, r_cnt)) {
51117d15b25SDag-Erling Smørgrav 
5127b5038d7SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_HEX:
5137b5038d7SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_B64:
51417d15b25SDag-Erling Smørgrav 				/* When this is the last rdata field, then the
51517d15b25SDag-Erling Smørgrav 				 * rest should be read in (cause then these
51617d15b25SDag-Erling Smørgrav 				 * rdf types may contain spaces).
51717d15b25SDag-Erling Smørgrav 				 */
51817d15b25SDag-Erling Smørgrav 				if (r_cnt == r_max - 1) {
51917d15b25SDag-Erling Smørgrav 					c = ldns_bget_token(rd_buf, xtok,
52017d15b25SDag-Erling Smørgrav 							"\n", LDNS_MAX_RDFLEN);
52117d15b25SDag-Erling Smørgrav 					if (c != -1) {
52217d15b25SDag-Erling Smørgrav 						(void) strncat(rd, xtok,
52317d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
52417d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
52517d15b25SDag-Erling Smørgrav 					}
5267b5038d7SDag-Erling Smørgrav 				}
5277b5038d7SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
52817d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
52917d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
5307b5038d7SDag-Erling Smørgrav 				break;
53117d15b25SDag-Erling Smørgrav 
53217d15b25SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_HIP:
53317d15b25SDag-Erling Smørgrav 				/*
53417d15b25SDag-Erling Smørgrav 				 * In presentation format this RDATA type has
53517d15b25SDag-Erling Smørgrav 				 * three tokens: An algorithm byte, then a
53617d15b25SDag-Erling Smørgrav 				 * variable length HIT (in hexbytes) and then
53717d15b25SDag-Erling Smørgrav 				 * a variable length Public Key (in base64).
53817d15b25SDag-Erling Smørgrav 				 *
53917d15b25SDag-Erling Smørgrav 				 * We have just read the algorithm, so we need
54017d15b25SDag-Erling Smørgrav 				 * two more tokens: HIT and Public Key.
54117d15b25SDag-Erling Smørgrav 				 */
54217d15b25SDag-Erling Smørgrav 				do {
54317d15b25SDag-Erling Smørgrav 					/* Read and append HIT */
54417d15b25SDag-Erling Smørgrav 					if (ldns_bget_token(rd_buf,
54517d15b25SDag-Erling Smørgrav 							xtok, delimiters,
54617d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN) == -1)
54717d15b25SDag-Erling Smørgrav 						break;
54817d15b25SDag-Erling Smørgrav 
54917d15b25SDag-Erling Smørgrav 					(void) strncat(rd, " ",
55017d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
55117d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
55217d15b25SDag-Erling Smørgrav 					(void) strncat(rd, xtok,
55317d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
55417d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
55517d15b25SDag-Erling Smørgrav 
55617d15b25SDag-Erling Smørgrav 					/* Read and append Public Key*/
55717d15b25SDag-Erling Smørgrav 					if (ldns_bget_token(rd_buf,
55817d15b25SDag-Erling Smørgrav 							xtok, delimiters,
55917d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN) == -1)
56017d15b25SDag-Erling Smørgrav 						break;
56117d15b25SDag-Erling Smørgrav 
56217d15b25SDag-Erling Smørgrav 					(void) strncat(rd, " ",
56317d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
56417d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
56517d15b25SDag-Erling Smørgrav 					(void) strncat(rd, xtok,
56617d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
56717d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
56817d15b25SDag-Erling Smørgrav 				} while (false);
56917d15b25SDag-Erling Smørgrav 
57017d15b25SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
57117d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
57217d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
57317d15b25SDag-Erling Smørgrav 				break;
57417d15b25SDag-Erling Smørgrav 
5757b5038d7SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_DNAME:
5767b5038d7SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
57717d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
57817d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
5797b5038d7SDag-Erling Smørgrav 
58017d15b25SDag-Erling Smørgrav 				/* check if the origin should be used
58117d15b25SDag-Erling Smørgrav 				 * or concatenated
58217d15b25SDag-Erling Smørgrav 				 */
58317d15b25SDag-Erling Smørgrav 				if (r && ldns_rdf_size(r) > 1 &&
58417d15b25SDag-Erling Smørgrav 						ldns_rdf_data(r)[0] == 1 &&
58517d15b25SDag-Erling Smørgrav 						ldns_rdf_data(r)[1] == '@') {
58617d15b25SDag-Erling Smørgrav 
5877b5038d7SDag-Erling Smørgrav 					ldns_rdf_deep_free(r);
58817d15b25SDag-Erling Smørgrav 
58917d15b25SDag-Erling Smørgrav 					r = origin ? ldns_rdf_clone(origin)
59017d15b25SDag-Erling Smørgrav 
59117d15b25SDag-Erling Smørgrav 					  : ( rr_type == LDNS_RR_TYPE_SOA ?
59217d15b25SDag-Erling Smørgrav 
59317d15b25SDag-Erling Smørgrav 					      ldns_rdf_clone(
59417d15b25SDag-Erling Smørgrav 						      ldns_rr_owner(new))
59517d15b25SDag-Erling Smørgrav 
59617d15b25SDag-Erling Smørgrav 					    : ldns_rdf_new_frm_str(
59717d15b25SDag-Erling Smørgrav 						    LDNS_RDF_TYPE_DNAME, ".")
59817d15b25SDag-Erling Smørgrav 					    );
59917d15b25SDag-Erling Smørgrav 
600*5afab0e5SDag-Erling Smørgrav 				} else if (r && rd_strlen >= 1
601*5afab0e5SDag-Erling Smørgrav 				    && (origin || rr_type == LDNS_RR_TYPE_SOA)
602*5afab0e5SDag-Erling Smørgrav 				    && !ldns_dname_str_absolute(rd)) {
60317d15b25SDag-Erling Smørgrav 
604*5afab0e5SDag-Erling Smørgrav 					status = ldns_dname_cat(r, origin
605*5afab0e5SDag-Erling Smørgrav 					    ? origin : ldns_rr_owner(new));
60617d15b25SDag-Erling Smørgrav 					if (status != LDNS_STATUS_OK) {
60717d15b25SDag-Erling Smørgrav 						goto error;
6087b5038d7SDag-Erling Smørgrav 					}
6097b5038d7SDag-Erling Smørgrav 				}
6107b5038d7SDag-Erling Smørgrav 				break;
6117b5038d7SDag-Erling Smørgrav 			default:
6127b5038d7SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
61317d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
61417d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
6157b5038d7SDag-Erling Smørgrav 				break;
6167b5038d7SDag-Erling Smørgrav 			}
61717d15b25SDag-Erling Smørgrav 			if (!r) {
61817d15b25SDag-Erling Smørgrav 				status = LDNS_STATUS_SYNTAX_RDATA_ERR;
61917d15b25SDag-Erling Smørgrav 				goto error;
6207b5038d7SDag-Erling Smørgrav 			}
62117d15b25SDag-Erling Smørgrav 			ldns_rr_push_rdf(new, r);
6227b5038d7SDag-Erling Smørgrav 		}
62317d15b25SDag-Erling Smørgrav 	} /* for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) */
6247b5038d7SDag-Erling Smørgrav 	LDNS_FREE(rd);
62517d15b25SDag-Erling Smørgrav 	LDNS_FREE(xtok);
6267b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(rr_buf);
6277b5038d7SDag-Erling Smørgrav 	LDNS_FREE(rdata);
628986ba33cSDag-Erling Smørgrav 	if (ldns_buffer_remaining(rd_buf) > 0) {
629986ba33cSDag-Erling Smørgrav 		ldns_buffer_free(rd_buf);
630986ba33cSDag-Erling Smørgrav 		ldns_rr_free(new);
631986ba33cSDag-Erling Smørgrav 		return LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR;
632986ba33cSDag-Erling Smørgrav 	}
633986ba33cSDag-Erling Smørgrav 	ldns_buffer_free(rd_buf);
6347b5038d7SDag-Erling Smørgrav 
63517d15b25SDag-Erling Smørgrav 	if (!question && desc && !was_unknown_rr_format &&
63617d15b25SDag-Erling Smørgrav 			ldns_rr_rd_count(new) < r_min) {
63717d15b25SDag-Erling Smørgrav 
6387b5038d7SDag-Erling Smørgrav 		ldns_rr_free(new);
6397b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
6407b5038d7SDag-Erling Smørgrav 	}
6417b5038d7SDag-Erling Smørgrav 
6427b5038d7SDag-Erling Smørgrav 	if (newrr) {
6437b5038d7SDag-Erling Smørgrav 		*newrr = new;
6442787e39aSDag-Erling Smørgrav 	} else {
6452787e39aSDag-Erling Smørgrav 		/* Maybe the caller just wanted to see if it would parse? */
6462787e39aSDag-Erling Smørgrav 		ldns_rr_free(new);
6477b5038d7SDag-Erling Smørgrav 	}
6487b5038d7SDag-Erling Smørgrav 	return LDNS_STATUS_OK;
6497b5038d7SDag-Erling Smørgrav 
65017d15b25SDag-Erling Smørgrav memerror:
65117d15b25SDag-Erling Smørgrav 	status = LDNS_STATUS_MEM_ERR;
65217d15b25SDag-Erling Smørgrav error:
65317d15b25SDag-Erling Smørgrav 	if (rd_buf && rd_buf->_data) {
65417d15b25SDag-Erling Smørgrav 		ldns_buffer_free(rd_buf);
65517d15b25SDag-Erling Smørgrav 	} else {
65617d15b25SDag-Erling Smørgrav 		LDNS_FREE(rd_buf);
65717d15b25SDag-Erling Smørgrav 	}
65817d15b25SDag-Erling Smørgrav 	if (rr_buf && rr_buf->_data) {
65917d15b25SDag-Erling Smørgrav 		ldns_buffer_free(rr_buf);
66017d15b25SDag-Erling Smørgrav 	} else {
66117d15b25SDag-Erling Smørgrav 		LDNS_FREE(rr_buf);
66217d15b25SDag-Erling Smørgrav 	}
6637b5038d7SDag-Erling Smørgrav 	LDNS_FREE(type);
6647b5038d7SDag-Erling Smørgrav 	LDNS_FREE(owner);
6657b5038d7SDag-Erling Smørgrav 	LDNS_FREE(ttl);
6667b5038d7SDag-Erling Smørgrav 	LDNS_FREE(clas);
66717d15b25SDag-Erling Smørgrav 	LDNS_FREE(hex_data);
66817d15b25SDag-Erling Smørgrav 	LDNS_FREE(hex_data_str);
66917d15b25SDag-Erling Smørgrav 	LDNS_FREE(xtok);
6707b5038d7SDag-Erling Smørgrav 	LDNS_FREE(rd);
67117d15b25SDag-Erling Smørgrav 	LDNS_FREE(rdata);
6727b5038d7SDag-Erling Smørgrav 	ldns_rr_free(new);
6737b5038d7SDag-Erling Smørgrav 	return status;
6747b5038d7SDag-Erling Smørgrav }
6757b5038d7SDag-Erling Smørgrav 
6767b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr_new_frm_str(ldns_rr ** newrr,const char * str,uint32_t default_ttl,const ldns_rdf * origin,ldns_rdf ** prev)6777b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_str(ldns_rr **newrr, const char *str,
678986ba33cSDag-Erling Smørgrav                     uint32_t default_ttl, const ldns_rdf *origin,
6797b5038d7SDag-Erling Smørgrav 				    ldns_rdf **prev)
6807b5038d7SDag-Erling Smørgrav {
6817b5038d7SDag-Erling Smørgrav 	return ldns_rr_new_frm_str_internal(newrr,
6827b5038d7SDag-Erling Smørgrav 	                                    str,
6837b5038d7SDag-Erling Smørgrav 	                                    default_ttl,
6847b5038d7SDag-Erling Smørgrav 	                                    origin,
6857b5038d7SDag-Erling Smørgrav 	                                    prev,
686*5afab0e5SDag-Erling Smørgrav 	                                    false,
687*5afab0e5SDag-Erling Smørgrav 					    NULL);
6887b5038d7SDag-Erling Smørgrav }
6897b5038d7SDag-Erling Smørgrav 
6907b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr_new_question_frm_str(ldns_rr ** newrr,const char * str,const ldns_rdf * origin,ldns_rdf ** prev)6917b5038d7SDag-Erling Smørgrav ldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str,
692986ba33cSDag-Erling Smørgrav                              const ldns_rdf *origin, ldns_rdf **prev)
6937b5038d7SDag-Erling Smørgrav {
6947b5038d7SDag-Erling Smørgrav 	return ldns_rr_new_frm_str_internal(newrr,
6957b5038d7SDag-Erling Smørgrav 	                                    str,
6967b5038d7SDag-Erling Smørgrav 	                                    0,
6977b5038d7SDag-Erling Smørgrav 	                                    origin,
6987b5038d7SDag-Erling Smørgrav 	                                    prev,
699*5afab0e5SDag-Erling Smørgrav 	                                    true,
700*5afab0e5SDag-Erling Smørgrav 					    NULL);
7017b5038d7SDag-Erling Smørgrav }
7027b5038d7SDag-Erling Smørgrav 
703986ba33cSDag-Erling Smørgrav /* Strip whitespace from the start and the end of <line>.  */
704986ba33cSDag-Erling Smørgrav static char *
ldns_strip_ws(char * line)705986ba33cSDag-Erling Smørgrav ldns_strip_ws(char *line)
706986ba33cSDag-Erling Smørgrav {
707986ba33cSDag-Erling Smørgrav 	char *s = line, *e;
708986ba33cSDag-Erling Smørgrav 
709986ba33cSDag-Erling Smørgrav 	for (s = line; *s && isspace((unsigned char)*s); s++)
710986ba33cSDag-Erling Smørgrav 		;
711986ba33cSDag-Erling Smørgrav 
712986ba33cSDag-Erling Smørgrav 	for (e = strchr(s, 0); e > s+2 && isspace((unsigned char)e[-1]) && e[-2] != '\\'; e--)
713986ba33cSDag-Erling Smørgrav 		;
714986ba33cSDag-Erling Smørgrav 	*e = 0;
715986ba33cSDag-Erling Smørgrav 
716986ba33cSDag-Erling Smørgrav 	return s;
717986ba33cSDag-Erling Smørgrav }
718986ba33cSDag-Erling Smørgrav 
7197b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr_new_frm_fp(ldns_rr ** newrr,FILE * fp,uint32_t * ttl,ldns_rdf ** origin,ldns_rdf ** prev)7207b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev)
7217b5038d7SDag-Erling Smørgrav {
7227b5038d7SDag-Erling Smørgrav 	return ldns_rr_new_frm_fp_l(newrr, fp, ttl, origin, prev, NULL);
7237b5038d7SDag-Erling Smørgrav }
7247b5038d7SDag-Erling Smørgrav 
7257b5038d7SDag-Erling Smørgrav ldns_status
_ldns_rr_new_frm_fp_l_internal(ldns_rr ** newrr,FILE * fp,uint32_t * default_ttl,ldns_rdf ** origin,ldns_rdf ** prev,int * line_nr,bool * explicit_ttl)726*5afab0e5SDag-Erling Smørgrav _ldns_rr_new_frm_fp_l_internal(ldns_rr **newrr, FILE *fp,
727*5afab0e5SDag-Erling Smørgrav 		uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev,
728*5afab0e5SDag-Erling Smørgrav 		int *line_nr, bool *explicit_ttl)
7297b5038d7SDag-Erling Smørgrav {
730*5afab0e5SDag-Erling Smørgrav 	char *line = NULL;
731*5afab0e5SDag-Erling Smørgrav 	size_t limit = 0;
7327b5038d7SDag-Erling Smørgrav 	const char *endptr;  /* unused */
7337b5038d7SDag-Erling Smørgrav 	ldns_rr *rr;
7347b5038d7SDag-Erling Smørgrav 	uint32_t ttl;
7357b5038d7SDag-Erling Smørgrav 	ldns_rdf *tmp;
7367b5038d7SDag-Erling Smørgrav 	ldns_status s;
7377b5038d7SDag-Erling Smørgrav 
7387b5038d7SDag-Erling Smørgrav 	if (default_ttl) {
7397b5038d7SDag-Erling Smørgrav 		ttl = *default_ttl;
7407b5038d7SDag-Erling Smørgrav 	} else {
7417b5038d7SDag-Erling Smørgrav 		ttl = 0;
7427b5038d7SDag-Erling Smørgrav 	}
7437b5038d7SDag-Erling Smørgrav 	/* read an entire line in from the file */
744*5afab0e5SDag-Erling Smørgrav 	if ((s = ldns_fget_token_l_st( fp, &line, &limit, false
745*5afab0e5SDag-Erling Smørgrav 	                             , LDNS_PARSE_SKIP_SPACE, line_nr))) {
7467b5038d7SDag-Erling Smørgrav 		LDNS_FREE(line);
747*5afab0e5SDag-Erling Smørgrav 		return s;
7487b5038d7SDag-Erling Smørgrav 	}
7497b5038d7SDag-Erling Smørgrav 
750986ba33cSDag-Erling Smørgrav 	if (strncmp(line, "$ORIGIN", 7) == 0 && isspace((unsigned char)line[7])) {
7517b5038d7SDag-Erling Smørgrav 		if (*origin) {
7527b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(*origin);
7537b5038d7SDag-Erling Smørgrav 			*origin = NULL;
7547b5038d7SDag-Erling Smørgrav 		}
755986ba33cSDag-Erling Smørgrav 		tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME,
756986ba33cSDag-Erling Smørgrav 				ldns_strip_ws(line + 8));
7577b5038d7SDag-Erling Smørgrav 		if (!tmp) {
7587b5038d7SDag-Erling Smørgrav 			/* could not parse what next to $ORIGIN */
7597b5038d7SDag-Erling Smørgrav 			LDNS_FREE(line);
7607b5038d7SDag-Erling Smørgrav 			return LDNS_STATUS_SYNTAX_DNAME_ERR;
7617b5038d7SDag-Erling Smørgrav 		}
7627b5038d7SDag-Erling Smørgrav 		*origin = tmp;
7637b5038d7SDag-Erling Smørgrav 		s = LDNS_STATUS_SYNTAX_ORIGIN;
764986ba33cSDag-Erling Smørgrav 	} else if (strncmp(line, "$TTL", 4) == 0 && isspace((unsigned char)line[4])) {
7657b5038d7SDag-Erling Smørgrav 		if (default_ttl) {
766986ba33cSDag-Erling Smørgrav 			*default_ttl = ldns_str2period(
767986ba33cSDag-Erling Smørgrav 					ldns_strip_ws(line + 5), &endptr);
7687b5038d7SDag-Erling Smørgrav 		}
7697b5038d7SDag-Erling Smørgrav 		s = LDNS_STATUS_SYNTAX_TTL;
7707b5038d7SDag-Erling Smørgrav 	} else if (strncmp(line, "$INCLUDE", 8) == 0) {
7717b5038d7SDag-Erling Smørgrav 		s = LDNS_STATUS_SYNTAX_INCLUDE;
772986ba33cSDag-Erling Smørgrav 	} else if (!*ldns_strip_ws(line)) {
773986ba33cSDag-Erling Smørgrav 		LDNS_FREE(line);
774986ba33cSDag-Erling Smørgrav 		return LDNS_STATUS_SYNTAX_EMPTY;
7757b5038d7SDag-Erling Smørgrav 	} else {
7767b5038d7SDag-Erling Smørgrav 		if (origin && *origin) {
777*5afab0e5SDag-Erling Smørgrav 			s = ldns_rr_new_frm_str_internal(&rr, (const char*)line,
778*5afab0e5SDag-Erling Smørgrav 				ttl, *origin, prev, false, explicit_ttl);
7797b5038d7SDag-Erling Smørgrav 		} else {
780*5afab0e5SDag-Erling Smørgrav 			s = ldns_rr_new_frm_str_internal(&rr, (const char*)line,
781*5afab0e5SDag-Erling Smørgrav 				ttl, NULL, prev, false, explicit_ttl);
7827b5038d7SDag-Erling Smørgrav 		}
7837b5038d7SDag-Erling Smørgrav 	}
7847b5038d7SDag-Erling Smørgrav 	LDNS_FREE(line);
7852787e39aSDag-Erling Smørgrav 	if (s == LDNS_STATUS_OK) {
7862787e39aSDag-Erling Smørgrav 		if (newrr) {
7877b5038d7SDag-Erling Smørgrav 			*newrr = rr;
7882787e39aSDag-Erling Smørgrav 		} else {
7892787e39aSDag-Erling Smørgrav 			/* Just testing if it would parse? */
7902787e39aSDag-Erling Smørgrav 			ldns_rr_free(rr);
7912787e39aSDag-Erling Smørgrav 		}
7927b5038d7SDag-Erling Smørgrav 	}
7937b5038d7SDag-Erling Smørgrav 	return s;
7947b5038d7SDag-Erling Smørgrav }
7957b5038d7SDag-Erling Smørgrav 
796*5afab0e5SDag-Erling Smørgrav ldns_status
ldns_rr_new_frm_fp_l(ldns_rr ** newrr,FILE * fp,uint32_t * default_ttl,ldns_rdf ** origin,ldns_rdf ** prev,int * line_nr)797*5afab0e5SDag-Erling Smørgrav ldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl,
798*5afab0e5SDag-Erling Smørgrav 		ldns_rdf **origin, ldns_rdf **prev, int *line_nr)
799*5afab0e5SDag-Erling Smørgrav {
800*5afab0e5SDag-Erling Smørgrav 	return _ldns_rr_new_frm_fp_l_internal(newrr, fp, default_ttl, origin,
801*5afab0e5SDag-Erling Smørgrav 			prev, line_nr, NULL);
802*5afab0e5SDag-Erling Smørgrav }
803*5afab0e5SDag-Erling Smørgrav 
8047b5038d7SDag-Erling Smørgrav void
ldns_rr_set_owner(ldns_rr * rr,ldns_rdf * owner)8057b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner)
8067b5038d7SDag-Erling Smørgrav {
8077b5038d7SDag-Erling Smørgrav 	rr->_owner = owner;
8087b5038d7SDag-Erling Smørgrav }
8097b5038d7SDag-Erling Smørgrav 
8107b5038d7SDag-Erling Smørgrav void
ldns_rr_set_question(ldns_rr * rr,bool question)8117b5038d7SDag-Erling Smørgrav ldns_rr_set_question(ldns_rr *rr, bool question)
8127b5038d7SDag-Erling Smørgrav {
8137b5038d7SDag-Erling Smørgrav    rr->_rr_question = question;
8147b5038d7SDag-Erling Smørgrav }
8157b5038d7SDag-Erling Smørgrav 
8167b5038d7SDag-Erling Smørgrav void
ldns_rr_set_ttl(ldns_rr * rr,uint32_t ttl)8177b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl)
8187b5038d7SDag-Erling Smørgrav {
8197b5038d7SDag-Erling Smørgrav 	rr->_ttl = ttl;
8207b5038d7SDag-Erling Smørgrav }
8217b5038d7SDag-Erling Smørgrav 
8227b5038d7SDag-Erling Smørgrav void
ldns_rr_set_rd_count(ldns_rr * rr,size_t count)8237b5038d7SDag-Erling Smørgrav ldns_rr_set_rd_count(ldns_rr *rr, size_t count)
8247b5038d7SDag-Erling Smørgrav {
8257b5038d7SDag-Erling Smørgrav 	rr->_rd_count = count;
8267b5038d7SDag-Erling Smørgrav }
8277b5038d7SDag-Erling Smørgrav 
8287b5038d7SDag-Erling Smørgrav void
ldns_rr_set_type(ldns_rr * rr,ldns_rr_type rr_type)8297b5038d7SDag-Erling Smørgrav ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type)
8307b5038d7SDag-Erling Smørgrav {
8317b5038d7SDag-Erling Smørgrav 	rr->_rr_type = rr_type;
8327b5038d7SDag-Erling Smørgrav }
8337b5038d7SDag-Erling Smørgrav 
8347b5038d7SDag-Erling Smørgrav void
ldns_rr_set_class(ldns_rr * rr,ldns_rr_class rr_class)8357b5038d7SDag-Erling Smørgrav ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class)
8367b5038d7SDag-Erling Smørgrav {
8377b5038d7SDag-Erling Smørgrav 	rr->_rr_class = rr_class;
8387b5038d7SDag-Erling Smørgrav }
8397b5038d7SDag-Erling Smørgrav 
8407b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_set_rdf(ldns_rr * rr,const ldns_rdf * f,size_t position)8417b5038d7SDag-Erling Smørgrav ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position)
8427b5038d7SDag-Erling Smørgrav {
8437b5038d7SDag-Erling Smørgrav 	size_t rd_count;
8447b5038d7SDag-Erling Smørgrav 	ldns_rdf *pop;
8457b5038d7SDag-Erling Smørgrav 
8467b5038d7SDag-Erling Smørgrav 	rd_count = ldns_rr_rd_count(rr);
8477b5038d7SDag-Erling Smørgrav 	if (position < rd_count) {
848*5afab0e5SDag-Erling Smørgrav 		/* discard the old one */
8497b5038d7SDag-Erling Smørgrav 		pop = rr->_rdata_fields[position];
8507b5038d7SDag-Erling Smørgrav 		rr->_rdata_fields[position] = (ldns_rdf*)f;
8517b5038d7SDag-Erling Smørgrav 		return pop;
8527b5038d7SDag-Erling Smørgrav 	} else {
8537b5038d7SDag-Erling Smørgrav 		return NULL;
8547b5038d7SDag-Erling Smørgrav 	}
8557b5038d7SDag-Erling Smørgrav }
8567b5038d7SDag-Erling Smørgrav 
8577b5038d7SDag-Erling Smørgrav bool
ldns_rr_push_rdf(ldns_rr * rr,const ldns_rdf * f)8587b5038d7SDag-Erling Smørgrav ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f)
8597b5038d7SDag-Erling Smørgrav {
8607b5038d7SDag-Erling Smørgrav 	size_t rd_count;
8617b5038d7SDag-Erling Smørgrav 	ldns_rdf **rdata_fields;
8627b5038d7SDag-Erling Smørgrav 
8637b5038d7SDag-Erling Smørgrav 	rd_count = ldns_rr_rd_count(rr);
8647b5038d7SDag-Erling Smørgrav 
8657b5038d7SDag-Erling Smørgrav 	/* grow the array */
8667b5038d7SDag-Erling Smørgrav 	rdata_fields = LDNS_XREALLOC(
8677b5038d7SDag-Erling Smørgrav 		rr->_rdata_fields, ldns_rdf *, rd_count + 1);
8687b5038d7SDag-Erling Smørgrav 	if (!rdata_fields) {
8697b5038d7SDag-Erling Smørgrav 		return false;
8707b5038d7SDag-Erling Smørgrav 	}
8717b5038d7SDag-Erling Smørgrav 
8727b5038d7SDag-Erling Smørgrav 	/* add the new member */
8737b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields = rdata_fields;
8747b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields[rd_count] = (ldns_rdf*)f;
8757b5038d7SDag-Erling Smørgrav 
8767b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, rd_count + 1);
8777b5038d7SDag-Erling Smørgrav 	return true;
8787b5038d7SDag-Erling Smørgrav }
8797b5038d7SDag-Erling Smørgrav 
8807b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_pop_rdf(ldns_rr * rr)8817b5038d7SDag-Erling Smørgrav ldns_rr_pop_rdf(ldns_rr *rr)
8827b5038d7SDag-Erling Smørgrav {
8837b5038d7SDag-Erling Smørgrav 	size_t rd_count;
8847b5038d7SDag-Erling Smørgrav 	ldns_rdf *pop;
8857b5038d7SDag-Erling Smørgrav 	ldns_rdf** newrd;
8867b5038d7SDag-Erling Smørgrav 
8877b5038d7SDag-Erling Smørgrav 	rd_count = ldns_rr_rd_count(rr);
8887b5038d7SDag-Erling Smørgrav 
8897b5038d7SDag-Erling Smørgrav 	if (rd_count == 0) {
8907b5038d7SDag-Erling Smørgrav 		return NULL;
8917b5038d7SDag-Erling Smørgrav 	}
8927b5038d7SDag-Erling Smørgrav 
8937b5038d7SDag-Erling Smørgrav 	pop = rr->_rdata_fields[rd_count - 1];
8947b5038d7SDag-Erling Smørgrav 
8957b5038d7SDag-Erling Smørgrav 	/* try to shrink the array */
8967b5038d7SDag-Erling Smørgrav 	if(rd_count > 1) {
8977b5038d7SDag-Erling Smørgrav 		newrd = LDNS_XREALLOC(
8987b5038d7SDag-Erling Smørgrav 			rr->_rdata_fields, ldns_rdf *, rd_count - 1);
8997b5038d7SDag-Erling Smørgrav 		if(newrd)
9007b5038d7SDag-Erling Smørgrav 			rr->_rdata_fields = newrd;
9017b5038d7SDag-Erling Smørgrav 	} else {
9027b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr->_rdata_fields);
9037b5038d7SDag-Erling Smørgrav 	}
9047b5038d7SDag-Erling Smørgrav 
9057b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, rd_count - 1);
9067b5038d7SDag-Erling Smørgrav 	return pop;
9077b5038d7SDag-Erling Smørgrav }
9087b5038d7SDag-Erling Smørgrav 
9097b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rdf(const ldns_rr * rr,size_t nr)9107b5038d7SDag-Erling Smørgrav ldns_rr_rdf(const ldns_rr *rr, size_t nr)
9117b5038d7SDag-Erling Smørgrav {
9127b5038d7SDag-Erling Smørgrav 	if (rr && nr < ldns_rr_rd_count(rr)) {
9137b5038d7SDag-Erling Smørgrav 		return rr->_rdata_fields[nr];
9147b5038d7SDag-Erling Smørgrav 	} else {
9157b5038d7SDag-Erling Smørgrav 		return NULL;
9167b5038d7SDag-Erling Smørgrav 	}
9177b5038d7SDag-Erling Smørgrav }
9187b5038d7SDag-Erling Smørgrav 
9197b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_owner(const ldns_rr * rr)9207b5038d7SDag-Erling Smørgrav ldns_rr_owner(const ldns_rr *rr)
9217b5038d7SDag-Erling Smørgrav {
9227b5038d7SDag-Erling Smørgrav 	return rr->_owner;
9237b5038d7SDag-Erling Smørgrav }
9247b5038d7SDag-Erling Smørgrav 
9257b5038d7SDag-Erling Smørgrav bool
ldns_rr_is_question(const ldns_rr * rr)9267b5038d7SDag-Erling Smørgrav ldns_rr_is_question(const ldns_rr *rr)
9277b5038d7SDag-Erling Smørgrav {
9287b5038d7SDag-Erling Smørgrav    return rr->_rr_question;
9297b5038d7SDag-Erling Smørgrav }
9307b5038d7SDag-Erling Smørgrav 
9317b5038d7SDag-Erling Smørgrav uint32_t
ldns_rr_ttl(const ldns_rr * rr)9327b5038d7SDag-Erling Smørgrav ldns_rr_ttl(const ldns_rr *rr)
9337b5038d7SDag-Erling Smørgrav {
9347b5038d7SDag-Erling Smørgrav 	return rr->_ttl;
9357b5038d7SDag-Erling Smørgrav }
9367b5038d7SDag-Erling Smørgrav 
9377b5038d7SDag-Erling Smørgrav size_t
ldns_rr_rd_count(const ldns_rr * rr)9387b5038d7SDag-Erling Smørgrav ldns_rr_rd_count(const ldns_rr *rr)
9397b5038d7SDag-Erling Smørgrav {
9407b5038d7SDag-Erling Smørgrav 	return rr->_rd_count;
9417b5038d7SDag-Erling Smørgrav }
9427b5038d7SDag-Erling Smørgrav 
9437b5038d7SDag-Erling Smørgrav ldns_rr_type
ldns_rr_get_type(const ldns_rr * rr)9447b5038d7SDag-Erling Smørgrav ldns_rr_get_type(const ldns_rr *rr)
9457b5038d7SDag-Erling Smørgrav {
9467b5038d7SDag-Erling Smørgrav         return rr->_rr_type;
9477b5038d7SDag-Erling Smørgrav }
9487b5038d7SDag-Erling Smørgrav 
9497b5038d7SDag-Erling Smørgrav ldns_rr_class
ldns_rr_get_class(const ldns_rr * rr)9507b5038d7SDag-Erling Smørgrav ldns_rr_get_class(const ldns_rr *rr)
9517b5038d7SDag-Erling Smørgrav {
9527b5038d7SDag-Erling Smørgrav         return rr->_rr_class;
9537b5038d7SDag-Erling Smørgrav }
9547b5038d7SDag-Erling Smørgrav 
9557b5038d7SDag-Erling Smørgrav /* rr_lists */
9567b5038d7SDag-Erling Smørgrav 
9577b5038d7SDag-Erling Smørgrav size_t
ldns_rr_list_rr_count(const ldns_rr_list * rr_list)9587b5038d7SDag-Erling Smørgrav ldns_rr_list_rr_count(const ldns_rr_list *rr_list)
9597b5038d7SDag-Erling Smørgrav {
9607b5038d7SDag-Erling Smørgrav 	if (rr_list) {
9617b5038d7SDag-Erling Smørgrav 		return rr_list->_rr_count;
9627b5038d7SDag-Erling Smørgrav 	} else {
9637b5038d7SDag-Erling Smørgrav 		return 0;
9647b5038d7SDag-Erling Smørgrav 	}
9657b5038d7SDag-Erling Smørgrav }
9667b5038d7SDag-Erling Smørgrav 
9677b5038d7SDag-Erling Smørgrav ldns_rr *
ldns_rr_list_set_rr(ldns_rr_list * rr_list,const ldns_rr * r,size_t count)9687b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count)
9697b5038d7SDag-Erling Smørgrav {
9707b5038d7SDag-Erling Smørgrav 	ldns_rr *old;
9717b5038d7SDag-Erling Smørgrav 
9727b5038d7SDag-Erling Smørgrav 	if (count > ldns_rr_list_rr_count(rr_list)) {
9737b5038d7SDag-Erling Smørgrav 		return NULL;
9747b5038d7SDag-Erling Smørgrav 	}
9757b5038d7SDag-Erling Smørgrav 
9767b5038d7SDag-Erling Smørgrav 	old = ldns_rr_list_rr(rr_list, count);
9777b5038d7SDag-Erling Smørgrav 
9787b5038d7SDag-Erling Smørgrav 	/* overwrite old's pointer */
9797b5038d7SDag-Erling Smørgrav 	rr_list->_rrs[count] = (ldns_rr*)r;
9807b5038d7SDag-Erling Smørgrav 	return old;
9817b5038d7SDag-Erling Smørgrav }
9827b5038d7SDag-Erling Smørgrav 
9837b5038d7SDag-Erling Smørgrav void
ldns_rr_list_set_rr_count(ldns_rr_list * rr_list,size_t count)9847b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count)
9857b5038d7SDag-Erling Smørgrav {
9867b5038d7SDag-Erling Smørgrav 	assert(count <= rr_list->_rr_capacity);
9877b5038d7SDag-Erling Smørgrav 	rr_list->_rr_count = count;
9887b5038d7SDag-Erling Smørgrav }
9897b5038d7SDag-Erling Smørgrav 
9907b5038d7SDag-Erling Smørgrav ldns_rr *
ldns_rr_list_rr(const ldns_rr_list * rr_list,size_t nr)9917b5038d7SDag-Erling Smørgrav ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr)
9927b5038d7SDag-Erling Smørgrav {
9937b5038d7SDag-Erling Smørgrav 	if (nr < ldns_rr_list_rr_count(rr_list)) {
9947b5038d7SDag-Erling Smørgrav 		return rr_list->_rrs[nr];
9957b5038d7SDag-Erling Smørgrav 	} else {
9967b5038d7SDag-Erling Smørgrav 		return NULL;
9977b5038d7SDag-Erling Smørgrav 	}
9987b5038d7SDag-Erling Smørgrav }
9997b5038d7SDag-Erling Smørgrav 
10007b5038d7SDag-Erling Smørgrav ldns_rr_list *
ldns_rr_list_new(void)10017b5038d7SDag-Erling Smørgrav ldns_rr_list_new(void)
10027b5038d7SDag-Erling Smørgrav {
10037b5038d7SDag-Erling Smørgrav 	ldns_rr_list *rr_list = LDNS_MALLOC(ldns_rr_list);
10047b5038d7SDag-Erling Smørgrav         if(!rr_list) return NULL;
10057b5038d7SDag-Erling Smørgrav 	rr_list->_rr_count = 0;
10067b5038d7SDag-Erling Smørgrav 	rr_list->_rr_capacity = 0;
10077b5038d7SDag-Erling Smørgrav 	rr_list->_rrs = NULL;
10087b5038d7SDag-Erling Smørgrav 	return rr_list;
10097b5038d7SDag-Erling Smørgrav }
10107b5038d7SDag-Erling Smørgrav 
10117b5038d7SDag-Erling Smørgrav void
ldns_rr_list_free(ldns_rr_list * rr_list)10127b5038d7SDag-Erling Smørgrav ldns_rr_list_free(ldns_rr_list *rr_list)
10137b5038d7SDag-Erling Smørgrav {
10147b5038d7SDag-Erling Smørgrav 	if (rr_list) {
10157b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list->_rrs);
10167b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list);
10177b5038d7SDag-Erling Smørgrav 	}
10187b5038d7SDag-Erling Smørgrav }
10197b5038d7SDag-Erling Smørgrav 
10207b5038d7SDag-Erling Smørgrav void
ldns_rr_list_deep_free(ldns_rr_list * rr_list)10217b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(ldns_rr_list *rr_list)
10227b5038d7SDag-Erling Smørgrav {
10237b5038d7SDag-Erling Smørgrav 	size_t i;
10247b5038d7SDag-Erling Smørgrav 
10257b5038d7SDag-Erling Smørgrav 	if (rr_list) {
10267b5038d7SDag-Erling Smørgrav 		for (i=0; i < ldns_rr_list_rr_count(rr_list); i++) {
10277b5038d7SDag-Erling Smørgrav 			ldns_rr_free(ldns_rr_list_rr(rr_list, i));
10287b5038d7SDag-Erling Smørgrav 		}
10297b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list->_rrs);
10307b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list);
10317b5038d7SDag-Erling Smørgrav 	}
10327b5038d7SDag-Erling Smørgrav }
10337b5038d7SDag-Erling Smørgrav 
10347b5038d7SDag-Erling Smørgrav 
10357b5038d7SDag-Erling Smørgrav /* add right to left. So we modify *left! */
10367b5038d7SDag-Erling Smørgrav bool
ldns_rr_list_cat(ldns_rr_list * left,const ldns_rr_list * right)1037986ba33cSDag-Erling Smørgrav ldns_rr_list_cat(ldns_rr_list *left, const ldns_rr_list *right)
10387b5038d7SDag-Erling Smørgrav {
10397b5038d7SDag-Erling Smørgrav 	size_t r_rr_count;
10407b5038d7SDag-Erling Smørgrav 	size_t i;
10417b5038d7SDag-Erling Smørgrav 
10427b5038d7SDag-Erling Smørgrav 	if (!left) {
10437b5038d7SDag-Erling Smørgrav 		return false;
10447b5038d7SDag-Erling Smørgrav 	}
10457b5038d7SDag-Erling Smørgrav 
10467b5038d7SDag-Erling Smørgrav 	if (right) {
10477b5038d7SDag-Erling Smørgrav 		r_rr_count = ldns_rr_list_rr_count(right);
10487b5038d7SDag-Erling Smørgrav 	} else {
10497b5038d7SDag-Erling Smørgrav 		r_rr_count = 0;
10507b5038d7SDag-Erling Smørgrav 	}
10517b5038d7SDag-Erling Smørgrav 
10527b5038d7SDag-Erling Smørgrav 	/* push right to left */
10537b5038d7SDag-Erling Smørgrav 	for(i = 0; i < r_rr_count; i++) {
10547b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(left, ldns_rr_list_rr(right, i));
10557b5038d7SDag-Erling Smørgrav 	}
10567b5038d7SDag-Erling Smørgrav 	return true;
10577b5038d7SDag-Erling Smørgrav }
10587b5038d7SDag-Erling Smørgrav 
10597b5038d7SDag-Erling Smørgrav ldns_rr_list *
ldns_rr_list_cat_clone(const ldns_rr_list * left,const ldns_rr_list * right)1060986ba33cSDag-Erling Smørgrav ldns_rr_list_cat_clone(const ldns_rr_list *left, const ldns_rr_list *right)
10617b5038d7SDag-Erling Smørgrav {
10627b5038d7SDag-Erling Smørgrav 	size_t l_rr_count;
10637b5038d7SDag-Erling Smørgrav 	size_t r_rr_count;
10647b5038d7SDag-Erling Smørgrav 	size_t i;
10657b5038d7SDag-Erling Smørgrav 	ldns_rr_list *cat;
10667b5038d7SDag-Erling Smørgrav 
10677b5038d7SDag-Erling Smørgrav 	if (left) {
10687b5038d7SDag-Erling Smørgrav 		l_rr_count = ldns_rr_list_rr_count(left);
10697b5038d7SDag-Erling Smørgrav 	} else {
10707b5038d7SDag-Erling Smørgrav 		return ldns_rr_list_clone(right);
10717b5038d7SDag-Erling Smørgrav 	}
10727b5038d7SDag-Erling Smørgrav 
10737b5038d7SDag-Erling Smørgrav 	if (right) {
10747b5038d7SDag-Erling Smørgrav 		r_rr_count = ldns_rr_list_rr_count(right);
10757b5038d7SDag-Erling Smørgrav 	} else {
10767b5038d7SDag-Erling Smørgrav 		r_rr_count = 0;
10777b5038d7SDag-Erling Smørgrav 	}
10787b5038d7SDag-Erling Smørgrav 
10797b5038d7SDag-Erling Smørgrav 	cat = ldns_rr_list_new();
10807b5038d7SDag-Erling Smørgrav 
10817b5038d7SDag-Erling Smørgrav 	if (!cat) {
10827b5038d7SDag-Erling Smørgrav 		return NULL;
10837b5038d7SDag-Erling Smørgrav 	}
10847b5038d7SDag-Erling Smørgrav 
10857b5038d7SDag-Erling Smørgrav 	/* left */
10867b5038d7SDag-Erling Smørgrav 	for(i = 0; i < l_rr_count; i++) {
10877b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(cat,
10887b5038d7SDag-Erling Smørgrav 				ldns_rr_clone(ldns_rr_list_rr(left, i)));
10897b5038d7SDag-Erling Smørgrav 	}
10907b5038d7SDag-Erling Smørgrav 	/* right */
10917b5038d7SDag-Erling Smørgrav 	for(i = 0; i < r_rr_count; i++) {
10927b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(cat,
10937b5038d7SDag-Erling Smørgrav 				ldns_rr_clone(ldns_rr_list_rr(right, i)));
10947b5038d7SDag-Erling Smørgrav 	}
10957b5038d7SDag-Erling Smørgrav 	return cat;
10967b5038d7SDag-Erling Smørgrav }
10977b5038d7SDag-Erling Smørgrav 
10987b5038d7SDag-Erling Smørgrav ldns_rr_list *
ldns_rr_list_subtype_by_rdf(const ldns_rr_list * l,const ldns_rdf * r,size_t pos)1099986ba33cSDag-Erling Smørgrav ldns_rr_list_subtype_by_rdf(const ldns_rr_list *l, const ldns_rdf *r, size_t pos)
11007b5038d7SDag-Erling Smørgrav {
11017b5038d7SDag-Erling Smørgrav 	size_t i;
11027b5038d7SDag-Erling Smørgrav 	ldns_rr_list *subtyped;
11037b5038d7SDag-Erling Smørgrav 	ldns_rdf *list_rdf;
11047b5038d7SDag-Erling Smørgrav 
11057b5038d7SDag-Erling Smørgrav 	subtyped = ldns_rr_list_new();
11067b5038d7SDag-Erling Smørgrav 
11077b5038d7SDag-Erling Smørgrav 	for(i = 0; i < ldns_rr_list_rr_count(l); i++) {
11087b5038d7SDag-Erling Smørgrav 		list_rdf = ldns_rr_rdf(
11097b5038d7SDag-Erling Smørgrav 			ldns_rr_list_rr(l, i),
11107b5038d7SDag-Erling Smørgrav 			pos);
11117b5038d7SDag-Erling Smørgrav 		if (!list_rdf) {
11127b5038d7SDag-Erling Smørgrav 			/* pos is too large or any other error */
11137b5038d7SDag-Erling Smørgrav 			ldns_rr_list_deep_free(subtyped);
11147b5038d7SDag-Erling Smørgrav 			return NULL;
11157b5038d7SDag-Erling Smørgrav 		}
11167b5038d7SDag-Erling Smørgrav 
11177b5038d7SDag-Erling Smørgrav 		if (ldns_rdf_compare(list_rdf, r) == 0) {
11187b5038d7SDag-Erling Smørgrav 			/* a match */
11197b5038d7SDag-Erling Smørgrav 			ldns_rr_list_push_rr(subtyped,
11207b5038d7SDag-Erling Smørgrav 					ldns_rr_clone(ldns_rr_list_rr(l, i)));
11217b5038d7SDag-Erling Smørgrav 		}
11227b5038d7SDag-Erling Smørgrav 	}
11237b5038d7SDag-Erling Smørgrav 
11247b5038d7SDag-Erling Smørgrav 	if (ldns_rr_list_rr_count(subtyped) > 0) {
11257b5038d7SDag-Erling Smørgrav 		return subtyped;
11267b5038d7SDag-Erling Smørgrav 	} else {
11277b5038d7SDag-Erling Smørgrav 		ldns_rr_list_free(subtyped);
11287b5038d7SDag-Erling Smørgrav 		return NULL;
11297b5038d7SDag-Erling Smørgrav 	}
11307b5038d7SDag-Erling Smørgrav }
11317b5038d7SDag-Erling Smørgrav 
11327b5038d7SDag-Erling Smørgrav bool
ldns_rr_list_push_rr(ldns_rr_list * rr_list,const ldns_rr * rr)11337b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr)
11347b5038d7SDag-Erling Smørgrav {
11357b5038d7SDag-Erling Smørgrav 	size_t rr_count;
11367b5038d7SDag-Erling Smørgrav 	size_t cap;
11377b5038d7SDag-Erling Smørgrav 
11387b5038d7SDag-Erling Smørgrav 	rr_count = ldns_rr_list_rr_count(rr_list);
11397b5038d7SDag-Erling Smørgrav 	cap = rr_list->_rr_capacity;
11407b5038d7SDag-Erling Smørgrav 
11417b5038d7SDag-Erling Smørgrav 	/* grow the array */
11427b5038d7SDag-Erling Smørgrav 	if(rr_count+1 > cap) {
11437b5038d7SDag-Erling Smørgrav 		ldns_rr **rrs;
11447b5038d7SDag-Erling Smørgrav 
11457b5038d7SDag-Erling Smørgrav 		if(cap == 0)
11467b5038d7SDag-Erling Smørgrav 			cap = LDNS_RRLIST_INIT;  /* initial list size */
11477b5038d7SDag-Erling Smørgrav 		else	cap *= 2;
11487b5038d7SDag-Erling Smørgrav 		rrs = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap);
11497b5038d7SDag-Erling Smørgrav 		if (!rrs) {
11507b5038d7SDag-Erling Smørgrav 			return false;
11517b5038d7SDag-Erling Smørgrav 		}
11527b5038d7SDag-Erling Smørgrav 		rr_list->_rrs = rrs;
11537b5038d7SDag-Erling Smørgrav 		rr_list->_rr_capacity = cap;
11547b5038d7SDag-Erling Smørgrav 	}
11557b5038d7SDag-Erling Smørgrav 
11567b5038d7SDag-Erling Smørgrav 	/* add the new member */
11577b5038d7SDag-Erling Smørgrav 	rr_list->_rrs[rr_count] = (ldns_rr*)rr;
11587b5038d7SDag-Erling Smørgrav 
11597b5038d7SDag-Erling Smørgrav 	ldns_rr_list_set_rr_count(rr_list, rr_count + 1);
11607b5038d7SDag-Erling Smørgrav 	return true;
11617b5038d7SDag-Erling Smørgrav }
11627b5038d7SDag-Erling Smørgrav 
11637b5038d7SDag-Erling Smørgrav bool
ldns_rr_list_push_rr_list(ldns_rr_list * rr_list,const ldns_rr_list * push_list)11647b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list)
11657b5038d7SDag-Erling Smørgrav {
11667b5038d7SDag-Erling Smørgrav 	size_t i;
11677b5038d7SDag-Erling Smørgrav 
11687b5038d7SDag-Erling Smørgrav 	for(i = 0; i < ldns_rr_list_rr_count(push_list); i++) {
11697b5038d7SDag-Erling Smørgrav 		if (!ldns_rr_list_push_rr(rr_list,
11707b5038d7SDag-Erling Smørgrav 				ldns_rr_list_rr(push_list, i))) {
11717b5038d7SDag-Erling Smørgrav 			return false;
11727b5038d7SDag-Erling Smørgrav 		}
11737b5038d7SDag-Erling Smørgrav 	}
11747b5038d7SDag-Erling Smørgrav 	return true;
11757b5038d7SDag-Erling Smørgrav }
11767b5038d7SDag-Erling Smørgrav 
11777b5038d7SDag-Erling Smørgrav ldns_rr *
ldns_rr_list_pop_rr(ldns_rr_list * rr_list)11787b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rr(ldns_rr_list *rr_list)
11797b5038d7SDag-Erling Smørgrav {
11807b5038d7SDag-Erling Smørgrav 	size_t rr_count;
11817b5038d7SDag-Erling Smørgrav 	size_t cap;
11827b5038d7SDag-Erling Smørgrav 	ldns_rr *pop;
11837b5038d7SDag-Erling Smørgrav 
11847b5038d7SDag-Erling Smørgrav 	rr_count = ldns_rr_list_rr_count(rr_list);
11857b5038d7SDag-Erling Smørgrav 
11867b5038d7SDag-Erling Smørgrav 	if (rr_count == 0) {
11877b5038d7SDag-Erling Smørgrav 		return NULL;
11887b5038d7SDag-Erling Smørgrav 	}
11897b5038d7SDag-Erling Smørgrav 
11907b5038d7SDag-Erling Smørgrav 	cap = rr_list->_rr_capacity;
11917b5038d7SDag-Erling Smørgrav 	pop = ldns_rr_list_rr(rr_list, rr_count - 1);
11927b5038d7SDag-Erling Smørgrav 
11937b5038d7SDag-Erling Smørgrav 	/* shrink the array */
11947b5038d7SDag-Erling Smørgrav 	if(cap > LDNS_RRLIST_INIT && rr_count-1 <= cap/2) {
11957b5038d7SDag-Erling Smørgrav                 ldns_rr** a;
11967b5038d7SDag-Erling Smørgrav 		cap /= 2;
11977b5038d7SDag-Erling Smørgrav                 a = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap);
11987b5038d7SDag-Erling Smørgrav                 if(a) {
11997b5038d7SDag-Erling Smørgrav 		        rr_list->_rrs = a;
12007b5038d7SDag-Erling Smørgrav 		        rr_list->_rr_capacity = cap;
12017b5038d7SDag-Erling Smørgrav                 }
1202*5afab0e5SDag-Erling Smørgrav                 /* if the realloc fails, the capacity for the list remains unchanged */
12037b5038d7SDag-Erling Smørgrav 	}
12047b5038d7SDag-Erling Smørgrav 
12057b5038d7SDag-Erling Smørgrav 	ldns_rr_list_set_rr_count(rr_list, rr_count - 1);
12067b5038d7SDag-Erling Smørgrav 
12077b5038d7SDag-Erling Smørgrav 	return pop;
12087b5038d7SDag-Erling Smørgrav }
12097b5038d7SDag-Erling Smørgrav 
12107b5038d7SDag-Erling Smørgrav ldns_rr_list *
ldns_rr_list_pop_rr_list(ldns_rr_list * rr_list,size_t howmany)12117b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t howmany)
12127b5038d7SDag-Erling Smørgrav {
12137b5038d7SDag-Erling Smørgrav 	/* pop a number of rr's and put them in a rr_list */
12147b5038d7SDag-Erling Smørgrav 	ldns_rr_list *popped;
12157b5038d7SDag-Erling Smørgrav 	ldns_rr *p;
12167b5038d7SDag-Erling Smørgrav 	size_t i = howmany;
12177b5038d7SDag-Erling Smørgrav 
12187b5038d7SDag-Erling Smørgrav 	popped = ldns_rr_list_new();
12197b5038d7SDag-Erling Smørgrav 
12207b5038d7SDag-Erling Smørgrav 	if (!popped) {
12217b5038d7SDag-Erling Smørgrav 		return NULL;
12227b5038d7SDag-Erling Smørgrav 	}
12237b5038d7SDag-Erling Smørgrav 
12247b5038d7SDag-Erling Smørgrav 
12257b5038d7SDag-Erling Smørgrav 	while(i > 0 &&
12267b5038d7SDag-Erling Smørgrav 			(p = ldns_rr_list_pop_rr(rr_list)) != NULL) {
12277b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(popped, p);
12287b5038d7SDag-Erling Smørgrav 		i--;
12297b5038d7SDag-Erling Smørgrav 	}
12307b5038d7SDag-Erling Smørgrav 
12312787e39aSDag-Erling Smørgrav 	if (i == howmany) { /* so i <= 0 */
12322787e39aSDag-Erling Smørgrav 		ldns_rr_list_free(popped);
12337b5038d7SDag-Erling Smørgrav 		return NULL;
12347b5038d7SDag-Erling Smørgrav 	} else {
12357b5038d7SDag-Erling Smørgrav 		return popped;
12367b5038d7SDag-Erling Smørgrav 	}
12377b5038d7SDag-Erling Smørgrav }
12387b5038d7SDag-Erling Smørgrav 
12397b5038d7SDag-Erling Smørgrav 
12407b5038d7SDag-Erling Smørgrav bool
ldns_rr_list_contains_rr(const ldns_rr_list * rr_list,const ldns_rr * rr)1241986ba33cSDag-Erling Smørgrav ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, const ldns_rr *rr)
12427b5038d7SDag-Erling Smørgrav {
12437b5038d7SDag-Erling Smørgrav 	size_t i;
12447b5038d7SDag-Erling Smørgrav 
12457b5038d7SDag-Erling Smørgrav 	if (!rr_list || !rr || ldns_rr_list_rr_count(rr_list) == 0) {
12467b5038d7SDag-Erling Smørgrav 		return false;
12477b5038d7SDag-Erling Smørgrav 	}
12487b5038d7SDag-Erling Smørgrav 
12497b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) {
12507b5038d7SDag-Erling Smørgrav 		if (rr == ldns_rr_list_rr(rr_list, i)) {
12517b5038d7SDag-Erling Smørgrav 			return true;
12527b5038d7SDag-Erling Smørgrav 		} else if (ldns_rr_compare(rr, ldns_rr_list_rr(rr_list, i)) == 0) {
12537b5038d7SDag-Erling Smørgrav 			return true;
12547b5038d7SDag-Erling Smørgrav 		}
12557b5038d7SDag-Erling Smørgrav 	}
12567b5038d7SDag-Erling Smørgrav 	return false;
12577b5038d7SDag-Erling Smørgrav }
12587b5038d7SDag-Erling Smørgrav 
12597b5038d7SDag-Erling Smørgrav bool
ldns_is_rrset(const ldns_rr_list * rr_list)1260986ba33cSDag-Erling Smørgrav ldns_is_rrset(const ldns_rr_list *rr_list)
12617b5038d7SDag-Erling Smørgrav {
12627b5038d7SDag-Erling Smørgrav 	ldns_rr_type t;
12637b5038d7SDag-Erling Smørgrav 	ldns_rr_class c;
12647b5038d7SDag-Erling Smørgrav 	ldns_rdf *o;
12657b5038d7SDag-Erling Smørgrav 	ldns_rr *tmp;
12667b5038d7SDag-Erling Smørgrav 	size_t i;
12677b5038d7SDag-Erling Smørgrav 
12687b5038d7SDag-Erling Smørgrav 	if (!rr_list || ldns_rr_list_rr_count(rr_list) == 0) {
12697b5038d7SDag-Erling Smørgrav 		return false;
12707b5038d7SDag-Erling Smørgrav 	}
12717b5038d7SDag-Erling Smørgrav 
12727b5038d7SDag-Erling Smørgrav 	tmp = ldns_rr_list_rr(rr_list, 0);
12737b5038d7SDag-Erling Smørgrav 
12747b5038d7SDag-Erling Smørgrav 	t = ldns_rr_get_type(tmp);
12757b5038d7SDag-Erling Smørgrav 	c = ldns_rr_get_class(tmp);
12767b5038d7SDag-Erling Smørgrav 	o = ldns_rr_owner(tmp);
12777b5038d7SDag-Erling Smørgrav 
12787b5038d7SDag-Erling Smørgrav 	/* compare these with the rest of the rr_list, start with 1 */
12797b5038d7SDag-Erling Smørgrav 	for (i = 1; i < ldns_rr_list_rr_count(rr_list); i++) {
12807b5038d7SDag-Erling Smørgrav 		tmp = ldns_rr_list_rr(rr_list, i);
12817b5038d7SDag-Erling Smørgrav 		if (t != ldns_rr_get_type(tmp)) {
12827b5038d7SDag-Erling Smørgrav 			return false;
12837b5038d7SDag-Erling Smørgrav 		}
12847b5038d7SDag-Erling Smørgrav 		if (c != ldns_rr_get_class(tmp)) {
12857b5038d7SDag-Erling Smørgrav 			return false;
12867b5038d7SDag-Erling Smørgrav 		}
12877b5038d7SDag-Erling Smørgrav 		if (ldns_rdf_compare(o, ldns_rr_owner(tmp)) != 0) {
12887b5038d7SDag-Erling Smørgrav 			return false;
12897b5038d7SDag-Erling Smørgrav 		}
12907b5038d7SDag-Erling Smørgrav 	}
12917b5038d7SDag-Erling Smørgrav 	return true;
12927b5038d7SDag-Erling Smørgrav }
12937b5038d7SDag-Erling Smørgrav 
12947b5038d7SDag-Erling Smørgrav bool
ldns_rr_set_push_rr(ldns_rr_list * rr_list,ldns_rr * rr)12957b5038d7SDag-Erling Smørgrav ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr)
12967b5038d7SDag-Erling Smørgrav {
12977b5038d7SDag-Erling Smørgrav 	size_t rr_count;
12987b5038d7SDag-Erling Smørgrav 	size_t i;
12997b5038d7SDag-Erling Smørgrav 	ldns_rr *last;
13007b5038d7SDag-Erling Smørgrav 
13017b5038d7SDag-Erling Smørgrav 	assert(rr != NULL);
13027b5038d7SDag-Erling Smørgrav 
13037b5038d7SDag-Erling Smørgrav 	rr_count = ldns_rr_list_rr_count(rr_list);
13047b5038d7SDag-Erling Smørgrav 
13057b5038d7SDag-Erling Smørgrav 	if (rr_count == 0) {
13067b5038d7SDag-Erling Smørgrav 		/* nothing there, so checking it is
13077b5038d7SDag-Erling Smørgrav 		 * not needed */
13087b5038d7SDag-Erling Smørgrav 		return ldns_rr_list_push_rr(rr_list, rr);
13097b5038d7SDag-Erling Smørgrav 	} else {
13107b5038d7SDag-Erling Smørgrav 		/* check with the final rr in the rr_list */
13117b5038d7SDag-Erling Smørgrav 		last = ldns_rr_list_rr(rr_list, rr_count - 1);
13127b5038d7SDag-Erling Smørgrav 
13137b5038d7SDag-Erling Smørgrav 		if (ldns_rr_get_class(last) != ldns_rr_get_class(rr)) {
13147b5038d7SDag-Erling Smørgrav 			return false;
13157b5038d7SDag-Erling Smørgrav 		}
13167b5038d7SDag-Erling Smørgrav 		if (ldns_rr_get_type(last) != ldns_rr_get_type(rr)) {
13177b5038d7SDag-Erling Smørgrav 			return false;
13187b5038d7SDag-Erling Smørgrav 		}
13197b5038d7SDag-Erling Smørgrav 		/* only check if not equal to RRSIG */
13207b5038d7SDag-Erling Smørgrav 		if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) {
13217b5038d7SDag-Erling Smørgrav 			if (ldns_rr_ttl(last) != ldns_rr_ttl(rr)) {
13227b5038d7SDag-Erling Smørgrav 				return false;
13237b5038d7SDag-Erling Smørgrav 			}
13247b5038d7SDag-Erling Smørgrav 		}
13257b5038d7SDag-Erling Smørgrav 		if (ldns_rdf_compare(ldns_rr_owner(last),
13267b5038d7SDag-Erling Smørgrav 					ldns_rr_owner(rr)) != 0) {
13277b5038d7SDag-Erling Smørgrav 			return false;
13287b5038d7SDag-Erling Smørgrav 		}
13297b5038d7SDag-Erling Smørgrav 		/* ok, still alive - check if the rr already
1330*5afab0e5SDag-Erling Smørgrav 		 * exists - if so, don't add it */
13317b5038d7SDag-Erling Smørgrav 		for(i = 0; i < rr_count; i++) {
13327b5038d7SDag-Erling Smørgrav 			if(ldns_rr_compare(
13337b5038d7SDag-Erling Smørgrav 					ldns_rr_list_rr(rr_list, i), rr) == 0) {
13347b5038d7SDag-Erling Smørgrav 				return false;
13357b5038d7SDag-Erling Smørgrav 			}
13367b5038d7SDag-Erling Smørgrav 		}
13377b5038d7SDag-Erling Smørgrav 		/* it's safe, push it */
13387b5038d7SDag-Erling Smørgrav 		return ldns_rr_list_push_rr(rr_list, rr);
13397b5038d7SDag-Erling Smørgrav 	}
13407b5038d7SDag-Erling Smørgrav }
13417b5038d7SDag-Erling Smørgrav 
13427b5038d7SDag-Erling Smørgrav ldns_rr *
ldns_rr_set_pop_rr(ldns_rr_list * rr_list)13437b5038d7SDag-Erling Smørgrav ldns_rr_set_pop_rr(ldns_rr_list *rr_list)
13447b5038d7SDag-Erling Smørgrav {
13457b5038d7SDag-Erling Smørgrav 	return ldns_rr_list_pop_rr(rr_list);
13467b5038d7SDag-Erling Smørgrav }
13477b5038d7SDag-Erling Smørgrav 
13487b5038d7SDag-Erling Smørgrav ldns_rr_list *
ldns_rr_list_pop_rrset(ldns_rr_list * rr_list)13497b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rrset(ldns_rr_list *rr_list)
13507b5038d7SDag-Erling Smørgrav {
13517b5038d7SDag-Erling Smørgrav 	ldns_rr_list *rrset;
13527b5038d7SDag-Erling Smørgrav 	ldns_rr *last_rr = NULL;
13537b5038d7SDag-Erling Smørgrav 	ldns_rr *next_rr;
13547b5038d7SDag-Erling Smørgrav 
13557b5038d7SDag-Erling Smørgrav 	if (!rr_list) {
13567b5038d7SDag-Erling Smørgrav 		return NULL;
13577b5038d7SDag-Erling Smørgrav 	}
13587b5038d7SDag-Erling Smørgrav 
13597b5038d7SDag-Erling Smørgrav 	rrset = ldns_rr_list_new();
13607b5038d7SDag-Erling Smørgrav 	if (!last_rr) {
13617b5038d7SDag-Erling Smørgrav 		last_rr = ldns_rr_list_pop_rr(rr_list);
13627b5038d7SDag-Erling Smørgrav 		if (!last_rr) {
13637b5038d7SDag-Erling Smørgrav 			ldns_rr_list_free(rrset);
13647b5038d7SDag-Erling Smørgrav 			return NULL;
13657b5038d7SDag-Erling Smørgrav 		} else {
13667b5038d7SDag-Erling Smørgrav 			ldns_rr_list_push_rr(rrset, last_rr);
13677b5038d7SDag-Erling Smørgrav 		}
13687b5038d7SDag-Erling Smørgrav 	}
13697b5038d7SDag-Erling Smørgrav 
13707b5038d7SDag-Erling Smørgrav 	if (ldns_rr_list_rr_count(rr_list) > 0) {
13717b5038d7SDag-Erling Smørgrav 		next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1);
13727b5038d7SDag-Erling Smørgrav 	} else {
13737b5038d7SDag-Erling Smørgrav 		next_rr = NULL;
13747b5038d7SDag-Erling Smørgrav 	}
13757b5038d7SDag-Erling Smørgrav 
13767b5038d7SDag-Erling Smørgrav 	while (next_rr) {
13777b5038d7SDag-Erling Smørgrav 		if (
13787b5038d7SDag-Erling Smørgrav 			ldns_rdf_compare(ldns_rr_owner(next_rr),
13797b5038d7SDag-Erling Smørgrav 					 ldns_rr_owner(last_rr)) == 0
13807b5038d7SDag-Erling Smørgrav 			&&
13817b5038d7SDag-Erling Smørgrav 			ldns_rr_get_type(next_rr) == ldns_rr_get_type(last_rr)
13827b5038d7SDag-Erling Smørgrav 			&&
13837b5038d7SDag-Erling Smørgrav 			ldns_rr_get_class(next_rr) == ldns_rr_get_class(last_rr)
13847b5038d7SDag-Erling Smørgrav 		   ) {
13857b5038d7SDag-Erling Smørgrav 			ldns_rr_list_push_rr(rrset, ldns_rr_list_pop_rr(rr_list));
13867b5038d7SDag-Erling Smørgrav 			if (ldns_rr_list_rr_count(rr_list) > 0) {
13877b5038d7SDag-Erling Smørgrav 				last_rr = next_rr;
13887b5038d7SDag-Erling Smørgrav 				next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1);
13897b5038d7SDag-Erling Smørgrav 			} else {
13907b5038d7SDag-Erling Smørgrav 				next_rr = NULL;
13917b5038d7SDag-Erling Smørgrav 			}
13927b5038d7SDag-Erling Smørgrav 		} else {
13937b5038d7SDag-Erling Smørgrav 			next_rr = NULL;
13947b5038d7SDag-Erling Smørgrav 		}
13957b5038d7SDag-Erling Smørgrav 	}
13967b5038d7SDag-Erling Smørgrav 
13977b5038d7SDag-Erling Smørgrav 	return rrset;
13987b5038d7SDag-Erling Smørgrav }
13997b5038d7SDag-Erling Smørgrav 
14007b5038d7SDag-Erling Smørgrav ldns_rr *
ldns_rr_clone(const ldns_rr * rr)14017b5038d7SDag-Erling Smørgrav ldns_rr_clone(const ldns_rr *rr)
14027b5038d7SDag-Erling Smørgrav {
14037b5038d7SDag-Erling Smørgrav 	size_t i;
14047b5038d7SDag-Erling Smørgrav 	ldns_rr *new_rr;
14057b5038d7SDag-Erling Smørgrav 
14067b5038d7SDag-Erling Smørgrav 	if (!rr) {
14077b5038d7SDag-Erling Smørgrav 		return NULL;
14087b5038d7SDag-Erling Smørgrav 	}
14097b5038d7SDag-Erling Smørgrav 
14107b5038d7SDag-Erling Smørgrav 	new_rr = ldns_rr_new();
14117b5038d7SDag-Erling Smørgrav 	if (!new_rr) {
14127b5038d7SDag-Erling Smørgrav 		return NULL;
14137b5038d7SDag-Erling Smørgrav 	}
14147b5038d7SDag-Erling Smørgrav 	if (ldns_rr_owner(rr)) {
14157b5038d7SDag-Erling Smørgrav 		ldns_rr_set_owner(new_rr, ldns_rdf_clone(ldns_rr_owner(rr)));
14167b5038d7SDag-Erling Smørgrav   	}
14177b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(new_rr, ldns_rr_ttl(rr));
14187b5038d7SDag-Erling Smørgrav 	ldns_rr_set_type(new_rr, ldns_rr_get_type(rr));
14197b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(new_rr, ldns_rr_get_class(rr));
14207b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(new_rr, ldns_rr_is_question(rr));
14217b5038d7SDag-Erling Smørgrav 
14227b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
14237b5038d7SDag-Erling Smørgrav         	if (ldns_rr_rdf(rr,i)) {
14247b5038d7SDag-Erling Smørgrav         		ldns_rr_push_rdf(new_rr, ldns_rdf_clone(ldns_rr_rdf(rr, i)));
14257b5038d7SDag-Erling Smørgrav                 }
14267b5038d7SDag-Erling Smørgrav 	}
14277b5038d7SDag-Erling Smørgrav 
14287b5038d7SDag-Erling Smørgrav 	return new_rr;
14297b5038d7SDag-Erling Smørgrav }
14307b5038d7SDag-Erling Smørgrav 
14317b5038d7SDag-Erling Smørgrav ldns_rr_list *
ldns_rr_list_clone(const ldns_rr_list * rrlist)14327b5038d7SDag-Erling Smørgrav ldns_rr_list_clone(const ldns_rr_list *rrlist)
14337b5038d7SDag-Erling Smørgrav {
14347b5038d7SDag-Erling Smørgrav 	size_t i;
14357b5038d7SDag-Erling Smørgrav 	ldns_rr_list *new_list;
14367b5038d7SDag-Erling Smørgrav 	ldns_rr *r;
14377b5038d7SDag-Erling Smørgrav 
14387b5038d7SDag-Erling Smørgrav 	if (!rrlist) {
14397b5038d7SDag-Erling Smørgrav 		return NULL;
14407b5038d7SDag-Erling Smørgrav 	}
14417b5038d7SDag-Erling Smørgrav 
14427b5038d7SDag-Erling Smørgrav 	new_list = ldns_rr_list_new();
14437b5038d7SDag-Erling Smørgrav 	if (!new_list) {
14447b5038d7SDag-Erling Smørgrav 		return NULL;
14457b5038d7SDag-Erling Smørgrav 	}
14467b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rrlist); i++) {
14477b5038d7SDag-Erling Smørgrav 		r = ldns_rr_clone(
14487b5038d7SDag-Erling Smørgrav 			ldns_rr_list_rr(rrlist, i)
14497b5038d7SDag-Erling Smørgrav 		    );
14507b5038d7SDag-Erling Smørgrav 		if (!r) {
14517b5038d7SDag-Erling Smørgrav 			/* huh, failure in cloning */
14527b5038d7SDag-Erling Smørgrav 			ldns_rr_list_deep_free(new_list);
14537b5038d7SDag-Erling Smørgrav 			return NULL;
14547b5038d7SDag-Erling Smørgrav 		}
14557b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(new_list, r);
14567b5038d7SDag-Erling Smørgrav 	}
14577b5038d7SDag-Erling Smørgrav 	return new_list;
14587b5038d7SDag-Erling Smørgrav }
14597b5038d7SDag-Erling Smørgrav 
14607b5038d7SDag-Erling Smørgrav 
14617b5038d7SDag-Erling Smørgrav static int
qsort_schwartz_rr_compare(const void * a,const void * b)14627b5038d7SDag-Erling Smørgrav qsort_schwartz_rr_compare(const void *a, const void *b)
14637b5038d7SDag-Erling Smørgrav {
14647b5038d7SDag-Erling Smørgrav 	int result = 0;
14657b5038d7SDag-Erling Smørgrav 	ldns_rr *rr1, *rr2;
14667b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr1_buf, *rr2_buf;
14677b5038d7SDag-Erling Smørgrav 	struct ldns_schwartzian_compare_struct *sa = *(struct ldns_schwartzian_compare_struct **) a;
14687b5038d7SDag-Erling Smørgrav 	struct ldns_schwartzian_compare_struct *sb = *(struct ldns_schwartzian_compare_struct **) b;
14697b5038d7SDag-Erling Smørgrav 	/* if we are doing 2wire, we need to do lowercasing on the dname (and maybe on the rdata)
14707b5038d7SDag-Erling Smørgrav 	 * this must be done for comparison only, so we need to have a temp var for both buffers,
14717b5038d7SDag-Erling Smørgrav 	 * which is only used when the transformed object value isn't there yet
14727b5038d7SDag-Erling Smørgrav 	 */
14737b5038d7SDag-Erling Smørgrav 	ldns_rr *canonical_a, *canonical_b;
14747b5038d7SDag-Erling Smørgrav 
14757b5038d7SDag-Erling Smørgrav 	rr1 = (ldns_rr *) sa->original_object;
14767b5038d7SDag-Erling Smørgrav 	rr2 = (ldns_rr *) sb->original_object;
14777b5038d7SDag-Erling Smørgrav 
14787b5038d7SDag-Erling Smørgrav 	result = ldns_rr_compare_no_rdata(rr1, rr2);
14797b5038d7SDag-Erling Smørgrav 
14807b5038d7SDag-Erling Smørgrav 	if (result == 0) {
14817b5038d7SDag-Erling Smørgrav 		if (!sa->transformed_object) {
14827b5038d7SDag-Erling Smørgrav 			canonical_a = ldns_rr_clone(sa->original_object);
14837b5038d7SDag-Erling Smørgrav 			ldns_rr2canonical(canonical_a);
14847b5038d7SDag-Erling Smørgrav 			sa->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_a));
14857b5038d7SDag-Erling Smørgrav 			if (ldns_rr2buffer_wire(sa->transformed_object, canonical_a, LDNS_SECTION_ANY) != LDNS_STATUS_OK) {
14867b5038d7SDag-Erling Smørgrav 		                ldns_buffer_free((ldns_buffer *)sa->transformed_object);
14877b5038d7SDag-Erling Smørgrav                                 sa->transformed_object = NULL;
14887b5038d7SDag-Erling Smørgrav 				ldns_rr_free(canonical_a);
14897b5038d7SDag-Erling Smørgrav 				return 0;
14907b5038d7SDag-Erling Smørgrav 			}
14917b5038d7SDag-Erling Smørgrav 			ldns_rr_free(canonical_a);
14927b5038d7SDag-Erling Smørgrav 		}
14937b5038d7SDag-Erling Smørgrav 		if (!sb->transformed_object) {
14947b5038d7SDag-Erling Smørgrav 			canonical_b = ldns_rr_clone(sb->original_object);
14957b5038d7SDag-Erling Smørgrav 			ldns_rr2canonical(canonical_b);
14967b5038d7SDag-Erling Smørgrav 			sb->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_b));
14977b5038d7SDag-Erling Smørgrav 			if (ldns_rr2buffer_wire(sb->transformed_object, canonical_b, LDNS_SECTION_ANY) != LDNS_STATUS_OK) {
14987b5038d7SDag-Erling Smørgrav 		                ldns_buffer_free((ldns_buffer *)sa->transformed_object);
14997b5038d7SDag-Erling Smørgrav 		                ldns_buffer_free((ldns_buffer *)sb->transformed_object);
15007b5038d7SDag-Erling Smørgrav                                 sa->transformed_object = NULL;
15017b5038d7SDag-Erling Smørgrav                                 sb->transformed_object = NULL;
15027b5038d7SDag-Erling Smørgrav 				ldns_rr_free(canonical_b);
15037b5038d7SDag-Erling Smørgrav 				return 0;
15047b5038d7SDag-Erling Smørgrav 			}
15057b5038d7SDag-Erling Smørgrav 			ldns_rr_free(canonical_b);
15067b5038d7SDag-Erling Smørgrav 		}
15077b5038d7SDag-Erling Smørgrav 		rr1_buf = (ldns_buffer *) sa->transformed_object;
15087b5038d7SDag-Erling Smørgrav 		rr2_buf = (ldns_buffer *) sb->transformed_object;
15097b5038d7SDag-Erling Smørgrav 
15107b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_wire(rr1_buf, rr2_buf);
15117b5038d7SDag-Erling Smørgrav 	}
15127b5038d7SDag-Erling Smørgrav 
15137b5038d7SDag-Erling Smørgrav 	return result;
15147b5038d7SDag-Erling Smørgrav }
15157b5038d7SDag-Erling Smørgrav 
15167b5038d7SDag-Erling Smørgrav void
ldns_rr_list_sort(ldns_rr_list * unsorted)15177b5038d7SDag-Erling Smørgrav ldns_rr_list_sort(ldns_rr_list *unsorted)
15187b5038d7SDag-Erling Smørgrav {
15197b5038d7SDag-Erling Smørgrav 	struct ldns_schwartzian_compare_struct **sortables;
15207b5038d7SDag-Erling Smørgrav 	size_t item_count;
15217b5038d7SDag-Erling Smørgrav 	size_t i;
15227b5038d7SDag-Erling Smørgrav 
15237b5038d7SDag-Erling Smørgrav 	if (unsorted) {
15247b5038d7SDag-Erling Smørgrav 		item_count = ldns_rr_list_rr_count(unsorted);
15257b5038d7SDag-Erling Smørgrav 
15267b5038d7SDag-Erling Smørgrav 		sortables = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct *,
15277b5038d7SDag-Erling Smørgrav 					 item_count);
15287b5038d7SDag-Erling Smørgrav                 if(!sortables) return; /* no way to return error */
15297b5038d7SDag-Erling Smørgrav 		for (i = 0; i < item_count; i++) {
15307b5038d7SDag-Erling Smørgrav 			sortables[i] = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct, 1);
15317b5038d7SDag-Erling Smørgrav                         if(!sortables[i]) {
15327b5038d7SDag-Erling Smørgrav                                 /* free the allocated parts */
15337b5038d7SDag-Erling Smørgrav                                 while(i>0) {
15347b5038d7SDag-Erling Smørgrav                                         i--;
15357b5038d7SDag-Erling Smørgrav                                         LDNS_FREE(sortables[i]);
15367b5038d7SDag-Erling Smørgrav                                 }
15377b5038d7SDag-Erling Smørgrav                                 /* no way to return error */
15382787e39aSDag-Erling Smørgrav 				LDNS_FREE(sortables);
15397b5038d7SDag-Erling Smørgrav                                 return;
15407b5038d7SDag-Erling Smørgrav                         }
15417b5038d7SDag-Erling Smørgrav 			sortables[i]->original_object = ldns_rr_list_rr(unsorted, i);
15427b5038d7SDag-Erling Smørgrav 			sortables[i]->transformed_object = NULL;
15437b5038d7SDag-Erling Smørgrav 		}
15447b5038d7SDag-Erling Smørgrav 		qsort(sortables,
15457b5038d7SDag-Erling Smørgrav 		      item_count,
15467b5038d7SDag-Erling Smørgrav 		      sizeof(struct ldns_schwartzian_compare_struct *),
15477b5038d7SDag-Erling Smørgrav 		      qsort_schwartz_rr_compare);
15487b5038d7SDag-Erling Smørgrav 		for (i = 0; i < item_count; i++) {
15497b5038d7SDag-Erling Smørgrav 			unsorted->_rrs[i] = sortables[i]->original_object;
15507b5038d7SDag-Erling Smørgrav 			if (sortables[i]->transformed_object) {
15517b5038d7SDag-Erling Smørgrav 				ldns_buffer_free(sortables[i]->transformed_object);
15527b5038d7SDag-Erling Smørgrav 			}
15537b5038d7SDag-Erling Smørgrav 			LDNS_FREE(sortables[i]);
15547b5038d7SDag-Erling Smørgrav 		}
15557b5038d7SDag-Erling Smørgrav 		LDNS_FREE(sortables);
15567b5038d7SDag-Erling Smørgrav 	}
15577b5038d7SDag-Erling Smørgrav }
15587b5038d7SDag-Erling Smørgrav 
15597b5038d7SDag-Erling Smørgrav int
ldns_rr_compare_no_rdata(const ldns_rr * rr1,const ldns_rr * rr2)15607b5038d7SDag-Erling Smørgrav ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2)
15617b5038d7SDag-Erling Smørgrav {
15627b5038d7SDag-Erling Smørgrav 	size_t rr1_len;
15637b5038d7SDag-Erling Smørgrav 	size_t rr2_len;
15647b5038d7SDag-Erling Smørgrav         size_t offset;
15657b5038d7SDag-Erling Smørgrav 
15667b5038d7SDag-Erling Smørgrav 	assert(rr1 != NULL);
15677b5038d7SDag-Erling Smørgrav 	assert(rr2 != NULL);
15687b5038d7SDag-Erling Smørgrav 
15697b5038d7SDag-Erling Smørgrav 	rr1_len = ldns_rr_uncompressed_size(rr1);
15707b5038d7SDag-Erling Smørgrav 	rr2_len = ldns_rr_uncompressed_size(rr2);
15717b5038d7SDag-Erling Smørgrav 
15727b5038d7SDag-Erling Smørgrav 	if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) < 0) {
15737b5038d7SDag-Erling Smørgrav 		return -1;
15747b5038d7SDag-Erling Smørgrav 	} else if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) > 0) {
15757b5038d7SDag-Erling Smørgrav 		return 1;
15767b5038d7SDag-Erling Smørgrav 	}
15777b5038d7SDag-Erling Smørgrav 
15787b5038d7SDag-Erling Smørgrav         /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */
15797b5038d7SDag-Erling Smørgrav         if (ldns_rr_get_class(rr1) != ldns_rr_get_class(rr2)) {
15807b5038d7SDag-Erling Smørgrav             return ldns_rr_get_class(rr1) - ldns_rr_get_class(rr2);
15817b5038d7SDag-Erling Smørgrav         }
15827b5038d7SDag-Erling Smørgrav 
15837b5038d7SDag-Erling Smørgrav         /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */
15847b5038d7SDag-Erling Smørgrav         if (ldns_rr_get_type(rr1) != ldns_rr_get_type(rr2)) {
15857b5038d7SDag-Erling Smørgrav             return ldns_rr_get_type(rr1) - ldns_rr_get_type(rr2);
15867b5038d7SDag-Erling Smørgrav         }
15877b5038d7SDag-Erling Smørgrav 
15887b5038d7SDag-Erling Smørgrav         /* offset is the owername length + ttl + type + class + rdlen == start of wire format rdata */
15897b5038d7SDag-Erling Smørgrav         offset = ldns_rdf_size(ldns_rr_owner(rr1)) + 4 + 2 + 2 + 2;
15907b5038d7SDag-Erling Smørgrav         /* if either record doesn't have any RDATA... */
15917b5038d7SDag-Erling Smørgrav         if (offset > rr1_len || offset > rr2_len) {
15927b5038d7SDag-Erling Smørgrav             if (rr1_len == rr2_len) {
15937b5038d7SDag-Erling Smørgrav               return 0;
15947b5038d7SDag-Erling Smørgrav             }
15957b5038d7SDag-Erling Smørgrav             return ((int) rr2_len - (int) rr1_len);
15967b5038d7SDag-Erling Smørgrav         }
15977b5038d7SDag-Erling Smørgrav 
15987b5038d7SDag-Erling Smørgrav 	return 0;
15997b5038d7SDag-Erling Smørgrav }
16007b5038d7SDag-Erling Smørgrav 
ldns_rr_compare_wire(const ldns_buffer * rr1_buf,const ldns_buffer * rr2_buf)1601986ba33cSDag-Erling Smørgrav int ldns_rr_compare_wire(const ldns_buffer *rr1_buf, const ldns_buffer *rr2_buf)
16027b5038d7SDag-Erling Smørgrav {
16037b5038d7SDag-Erling Smørgrav         size_t rr1_len, rr2_len, min_len, i, offset;
16047b5038d7SDag-Erling Smørgrav 
16057b5038d7SDag-Erling Smørgrav         rr1_len = ldns_buffer_capacity(rr1_buf);
16067b5038d7SDag-Erling Smørgrav         rr2_len = ldns_buffer_capacity(rr2_buf);
16077b5038d7SDag-Erling Smørgrav 
16087b5038d7SDag-Erling Smørgrav         /* jump past dname (checked in earlier part)
16097b5038d7SDag-Erling Smørgrav          * and especially past TTL */
16107b5038d7SDag-Erling Smørgrav         offset = 0;
16117b5038d7SDag-Erling Smørgrav         while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
16127b5038d7SDag-Erling Smørgrav           offset += *ldns_buffer_at(rr1_buf, offset) + 1;
16137b5038d7SDag-Erling Smørgrav         }
16147b5038d7SDag-Erling Smørgrav         /* jump to rdata section (PAST the rdata length field, otherwise
16157b5038d7SDag-Erling Smørgrav            rrs with different lengths might be sorted erroneously */
16167b5038d7SDag-Erling Smørgrav         offset += 11;
16177b5038d7SDag-Erling Smørgrav 	   min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
16187b5038d7SDag-Erling Smørgrav         /* Compare RRs RDATA byte for byte. */
16197b5038d7SDag-Erling Smørgrav         for(i = offset; i < min_len; i++) {
16207b5038d7SDag-Erling Smørgrav                 if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
16217b5038d7SDag-Erling Smørgrav                         return -1;
16227b5038d7SDag-Erling Smørgrav                 } else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
16237b5038d7SDag-Erling Smørgrav                         return +1;
16247b5038d7SDag-Erling Smørgrav                 }
16257b5038d7SDag-Erling Smørgrav         }
16267b5038d7SDag-Erling Smørgrav 
16277b5038d7SDag-Erling Smørgrav         /* If both RDATAs are the same up to min_len, then the shorter one sorts first. */
16287b5038d7SDag-Erling Smørgrav         if (rr1_len < rr2_len) {
16297b5038d7SDag-Erling Smørgrav                 return -1;
16307b5038d7SDag-Erling Smørgrav         } else if (rr1_len > rr2_len) {
16317b5038d7SDag-Erling Smørgrav                 return +1;
16327b5038d7SDag-Erling Smørgrav 	}
16337b5038d7SDag-Erling Smørgrav         /* The RDATAs are equal. */
16347b5038d7SDag-Erling Smørgrav         return 0;
16357b5038d7SDag-Erling Smørgrav 
16367b5038d7SDag-Erling Smørgrav }
16377b5038d7SDag-Erling Smørgrav 
16387b5038d7SDag-Erling Smørgrav int
ldns_rr_compare(const ldns_rr * rr1,const ldns_rr * rr2)16397b5038d7SDag-Erling Smørgrav ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2)
16407b5038d7SDag-Erling Smørgrav {
16417b5038d7SDag-Erling Smørgrav 	int result;
16427b5038d7SDag-Erling Smørgrav 	size_t rr1_len, rr2_len;
16437b5038d7SDag-Erling Smørgrav 
16447b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr1_buf;
16457b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr2_buf;
16467b5038d7SDag-Erling Smørgrav 
16477b5038d7SDag-Erling Smørgrav 	result = ldns_rr_compare_no_rdata(rr1, rr2);
16487b5038d7SDag-Erling Smørgrav 	if (result == 0) {
16497b5038d7SDag-Erling Smørgrav 		rr1_len = ldns_rr_uncompressed_size(rr1);
16507b5038d7SDag-Erling Smørgrav 		rr2_len = ldns_rr_uncompressed_size(rr2);
16517b5038d7SDag-Erling Smørgrav 
16527b5038d7SDag-Erling Smørgrav 		rr1_buf = ldns_buffer_new(rr1_len);
16537b5038d7SDag-Erling Smørgrav 		rr2_buf = ldns_buffer_new(rr2_len);
16547b5038d7SDag-Erling Smørgrav 
16557b5038d7SDag-Erling Smørgrav 		if (ldns_rr2buffer_wire_canonical(rr1_buf,
16567b5038d7SDag-Erling Smørgrav 								    rr1,
16577b5038d7SDag-Erling Smørgrav 								    LDNS_SECTION_ANY)
16587b5038d7SDag-Erling Smørgrav 		    != LDNS_STATUS_OK) {
16597b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr1_buf);
16607b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr2_buf);
16617b5038d7SDag-Erling Smørgrav 			return 0;
16627b5038d7SDag-Erling Smørgrav 		}
16637b5038d7SDag-Erling Smørgrav 		if (ldns_rr2buffer_wire_canonical(rr2_buf,
16647b5038d7SDag-Erling Smørgrav 								    rr2,
16657b5038d7SDag-Erling Smørgrav 								    LDNS_SECTION_ANY)
16667b5038d7SDag-Erling Smørgrav 		    != LDNS_STATUS_OK) {
16677b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr1_buf);
16687b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr2_buf);
16697b5038d7SDag-Erling Smørgrav 			return 0;
16707b5038d7SDag-Erling Smørgrav 		}
16717b5038d7SDag-Erling Smørgrav 
16727b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_wire(rr1_buf, rr2_buf);
16737b5038d7SDag-Erling Smørgrav 
16747b5038d7SDag-Erling Smørgrav 		ldns_buffer_free(rr1_buf);
16757b5038d7SDag-Erling Smørgrav 		ldns_buffer_free(rr2_buf);
16767b5038d7SDag-Erling Smørgrav 	}
16777b5038d7SDag-Erling Smørgrav 
16787b5038d7SDag-Erling Smørgrav 	return result;
16797b5038d7SDag-Erling Smørgrav }
16807b5038d7SDag-Erling Smørgrav 
16817b5038d7SDag-Erling Smørgrav /* convert dnskey to a ds with the given algorithm,
16827b5038d7SDag-Erling Smørgrav  * then compare the result with the given ds */
16837b5038d7SDag-Erling Smørgrav static int
ldns_rr_compare_ds_dnskey(ldns_rr * ds,ldns_rr * dnskey)16847b5038d7SDag-Erling Smørgrav ldns_rr_compare_ds_dnskey(ldns_rr *ds,
16857b5038d7SDag-Erling Smørgrav                           ldns_rr *dnskey)
16867b5038d7SDag-Erling Smørgrav {
16877b5038d7SDag-Erling Smørgrav 	ldns_rr *ds_gen;
16887b5038d7SDag-Erling Smørgrav 	bool result = false;
16897b5038d7SDag-Erling Smørgrav 	ldns_hash algo;
16907b5038d7SDag-Erling Smørgrav 
16917b5038d7SDag-Erling Smørgrav 	if (!dnskey || !ds ||
16927b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(ds) != LDNS_RR_TYPE_DS ||
16937b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(dnskey) != LDNS_RR_TYPE_DNSKEY) {
16947b5038d7SDag-Erling Smørgrav 		return false;
16957b5038d7SDag-Erling Smørgrav 	}
16967b5038d7SDag-Erling Smørgrav 
16977b5038d7SDag-Erling Smørgrav 	if (ldns_rr_rdf(ds, 2) == NULL) {
16987b5038d7SDag-Erling Smørgrav 		return false;
16997b5038d7SDag-Erling Smørgrav 	}
17007b5038d7SDag-Erling Smørgrav 	algo = ldns_rdf2native_int8(ldns_rr_rdf(ds, 2));
17017b5038d7SDag-Erling Smørgrav 
17027b5038d7SDag-Erling Smørgrav 	ds_gen = ldns_key_rr2ds(dnskey, algo);
17037b5038d7SDag-Erling Smørgrav 	if (ds_gen) {
17047b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare(ds, ds_gen) == 0;
17057b5038d7SDag-Erling Smørgrav 		ldns_rr_free(ds_gen);
17067b5038d7SDag-Erling Smørgrav 	}
17077b5038d7SDag-Erling Smørgrav 	return result;
17087b5038d7SDag-Erling Smørgrav }
17097b5038d7SDag-Erling Smørgrav 
17107b5038d7SDag-Erling Smørgrav bool
ldns_rr_compare_ds(const ldns_rr * orr1,const ldns_rr * orr2)17117b5038d7SDag-Erling Smørgrav ldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2)
17127b5038d7SDag-Erling Smørgrav {
17137b5038d7SDag-Erling Smørgrav 	bool result;
17147b5038d7SDag-Erling Smørgrav 	ldns_rr *rr1 = ldns_rr_clone(orr1);
17157b5038d7SDag-Erling Smørgrav 	ldns_rr *rr2 = ldns_rr_clone(orr2);
17167b5038d7SDag-Erling Smørgrav 
17177b5038d7SDag-Erling Smørgrav 	/* set ttls to zero */
17187b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr1, 0);
17197b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr2, 0);
17207b5038d7SDag-Erling Smørgrav 
17217b5038d7SDag-Erling Smørgrav 	if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DS &&
17227b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DNSKEY) {
17237b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_ds_dnskey(rr1, rr2);
17247b5038d7SDag-Erling Smørgrav 	} else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DNSKEY &&
17257b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DS) {
17267b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_ds_dnskey(rr2, rr1);
17277b5038d7SDag-Erling Smørgrav 	} else {
17287b5038d7SDag-Erling Smørgrav 		result = (ldns_rr_compare(rr1, rr2) == 0);
17297b5038d7SDag-Erling Smørgrav 	}
17307b5038d7SDag-Erling Smørgrav 
17317b5038d7SDag-Erling Smørgrav 	ldns_rr_free(rr1);
17327b5038d7SDag-Erling Smørgrav 	ldns_rr_free(rr2);
17337b5038d7SDag-Erling Smørgrav 
17347b5038d7SDag-Erling Smørgrav 	return result;
17357b5038d7SDag-Erling Smørgrav }
17367b5038d7SDag-Erling Smørgrav 
17377b5038d7SDag-Erling Smørgrav int
ldns_rr_list_compare(const ldns_rr_list * rrl1,const ldns_rr_list * rrl2)17387b5038d7SDag-Erling Smørgrav ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2)
17397b5038d7SDag-Erling Smørgrav {
17407b5038d7SDag-Erling Smørgrav 	size_t i = 0;
17417b5038d7SDag-Erling Smørgrav 	int rr_cmp;
17427b5038d7SDag-Erling Smørgrav 
17437b5038d7SDag-Erling Smørgrav 	assert(rrl1 != NULL);
17447b5038d7SDag-Erling Smørgrav 	assert(rrl2 != NULL);
17457b5038d7SDag-Erling Smørgrav 
17467b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rrl1) && i < ldns_rr_list_rr_count(rrl2); i++) {
17477b5038d7SDag-Erling Smørgrav 		rr_cmp = ldns_rr_compare(ldns_rr_list_rr(rrl1, i), ldns_rr_list_rr(rrl2, i));
17487b5038d7SDag-Erling Smørgrav 		if (rr_cmp != 0) {
17497b5038d7SDag-Erling Smørgrav 			return rr_cmp;
17507b5038d7SDag-Erling Smørgrav 		}
17517b5038d7SDag-Erling Smørgrav 	}
17527b5038d7SDag-Erling Smørgrav 
17537b5038d7SDag-Erling Smørgrav 	if (i == ldns_rr_list_rr_count(rrl1) &&
17547b5038d7SDag-Erling Smørgrav 	    i != ldns_rr_list_rr_count(rrl2)) {
17557b5038d7SDag-Erling Smørgrav 		return 1;
17567b5038d7SDag-Erling Smørgrav 	} else if (i == ldns_rr_list_rr_count(rrl2) &&
17577b5038d7SDag-Erling Smørgrav 	           i != ldns_rr_list_rr_count(rrl1)) {
17587b5038d7SDag-Erling Smørgrav 		return -1;
17597b5038d7SDag-Erling Smørgrav 	} else {
17607b5038d7SDag-Erling Smørgrav 		return 0;
17617b5038d7SDag-Erling Smørgrav 	}
17627b5038d7SDag-Erling Smørgrav }
17637b5038d7SDag-Erling Smørgrav 
17647b5038d7SDag-Erling Smørgrav size_t
ldns_rr_uncompressed_size(const ldns_rr * r)17657b5038d7SDag-Erling Smørgrav ldns_rr_uncompressed_size(const ldns_rr *r)
17667b5038d7SDag-Erling Smørgrav {
17677b5038d7SDag-Erling Smørgrav 	size_t rrsize;
17687b5038d7SDag-Erling Smørgrav 	size_t i;
17697b5038d7SDag-Erling Smørgrav 
17707b5038d7SDag-Erling Smørgrav 	rrsize = 0;
17717b5038d7SDag-Erling Smørgrav 	/* add all the rdf sizes */
17727b5038d7SDag-Erling Smørgrav 	for(i = 0; i < ldns_rr_rd_count(r); i++) {
17737b5038d7SDag-Erling Smørgrav 		rrsize += ldns_rdf_size(ldns_rr_rdf(r, i));
17747b5038d7SDag-Erling Smørgrav 	}
17757b5038d7SDag-Erling Smørgrav 	/* ownername */
17767b5038d7SDag-Erling Smørgrav 	rrsize += ldns_rdf_size(ldns_rr_owner(r));
17777b5038d7SDag-Erling Smørgrav 	rrsize += LDNS_RR_OVERHEAD;
17787b5038d7SDag-Erling Smørgrav 	return rrsize;
17797b5038d7SDag-Erling Smørgrav }
17807b5038d7SDag-Erling Smørgrav 
17817b5038d7SDag-Erling Smørgrav void
ldns_rr2canonical(ldns_rr * rr)17827b5038d7SDag-Erling Smørgrav ldns_rr2canonical(ldns_rr *rr)
17837b5038d7SDag-Erling Smørgrav {
17847b5038d7SDag-Erling Smørgrav 	uint16_t i;
17857b5038d7SDag-Erling Smørgrav 
17867b5038d7SDag-Erling Smørgrav 	if (!rr) {
17877b5038d7SDag-Erling Smørgrav 	  return;
17887b5038d7SDag-Erling Smørgrav         }
17897b5038d7SDag-Erling Smørgrav 
17907b5038d7SDag-Erling Smørgrav         ldns_dname2canonical(ldns_rr_owner(rr));
17917b5038d7SDag-Erling Smørgrav 
17927b5038d7SDag-Erling Smørgrav 	/*
17937b5038d7SDag-Erling Smørgrav 	 * lowercase the rdata dnames if the rr type is one
17947b5038d7SDag-Erling Smørgrav 	 * of the list in chapter 7 of RFC3597
17957b5038d7SDag-Erling Smørgrav 	 * Also added RRSIG, because a "Signer's Name" should be canonicalized
17967b5038d7SDag-Erling Smørgrav 	 * too. See dnssec-bis-updates-16. We can add it to this list because
17977b5038d7SDag-Erling Smørgrav 	 * the "Signer's Name"  is the only dname type rdata field in a RRSIG.
17987b5038d7SDag-Erling Smørgrav 	 */
17997b5038d7SDag-Erling Smørgrav 	switch(ldns_rr_get_type(rr)) {
18007b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_NS:
18017b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MD:
18027b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MF:
18037b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_CNAME:
18047b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_SOA:
18057b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MB:
18067b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MG:
18077b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MR:
18087b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_PTR:
18097b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MINFO:
18107b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MX:
18117b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_RP:
18127b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_AFSDB:
18137b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_RT:
18147b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_SIG:
18157b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_PX:
18167b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_NXT:
18177b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_NAPTR:
18187b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_KX:
18197b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_SRV:
18207b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_DNAME:
18217b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_A6:
18227b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_RRSIG:
18237b5038d7SDag-Erling Smørgrav 			for (i = 0; i < ldns_rr_rd_count(rr); i++) {
18247b5038d7SDag-Erling Smørgrav 				ldns_dname2canonical(ldns_rr_rdf(rr, i));
18257b5038d7SDag-Erling Smørgrav 			}
18267b5038d7SDag-Erling Smørgrav 			return;
18277b5038d7SDag-Erling Smørgrav 		default:
18287b5038d7SDag-Erling Smørgrav 			/* do nothing */
18297b5038d7SDag-Erling Smørgrav 			return;
18307b5038d7SDag-Erling Smørgrav 	}
18317b5038d7SDag-Erling Smørgrav }
18327b5038d7SDag-Erling Smørgrav 
18337b5038d7SDag-Erling Smørgrav void
ldns_rr_list2canonical(const ldns_rr_list * rr_list)1834986ba33cSDag-Erling Smørgrav ldns_rr_list2canonical(const ldns_rr_list *rr_list)
18357b5038d7SDag-Erling Smørgrav {
18367b5038d7SDag-Erling Smørgrav 	size_t i;
18377b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) {
18387b5038d7SDag-Erling Smørgrav 		ldns_rr2canonical(ldns_rr_list_rr(rr_list, i));
18397b5038d7SDag-Erling Smørgrav 	}
18407b5038d7SDag-Erling Smørgrav }
18417b5038d7SDag-Erling Smørgrav 
18427b5038d7SDag-Erling Smørgrav uint8_t
ldns_rr_label_count(const ldns_rr * rr)1843986ba33cSDag-Erling Smørgrav ldns_rr_label_count(const ldns_rr *rr)
18447b5038d7SDag-Erling Smørgrav {
18457b5038d7SDag-Erling Smørgrav 	if (!rr) {
18467b5038d7SDag-Erling Smørgrav 		return 0;
18477b5038d7SDag-Erling Smørgrav 	}
18487b5038d7SDag-Erling Smørgrav 	return ldns_dname_label_count(
18497b5038d7SDag-Erling Smørgrav 			ldns_rr_owner(rr));
18507b5038d7SDag-Erling Smørgrav }
18517b5038d7SDag-Erling Smørgrav 
18527b5038d7SDag-Erling Smørgrav /** \cond */
18537b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN };
18547b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A };
18557b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ns_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18567b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_md_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18577b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mf_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18587b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_cname_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18597b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_soa_wireformat[] = {
18607b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_INT32,
18617b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD,
18627b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_PERIOD
18637b5038d7SDag-Erling Smørgrav };
18647b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mb_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18657b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mg_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18667b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mr_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18677b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_wks_wireformat[] = {
18687b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_A, LDNS_RDF_TYPE_WKS
18697b5038d7SDag-Erling Smørgrav };
18707b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ptr_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18717b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_hinfo_wireformat[] = {
18727b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR
18737b5038d7SDag-Erling Smørgrav };
18747b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_minfo_wireformat[] = {
18757b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
18767b5038d7SDag-Erling Smørgrav };
18777b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mx_wireformat[] = {
18787b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18797b5038d7SDag-Erling Smørgrav };
18807b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rp_wireformat[] = {
18817b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
18827b5038d7SDag-Erling Smørgrav };
18837b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_afsdb_wireformat[] = {
18847b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18857b5038d7SDag-Erling Smørgrav };
18867b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_x25_wireformat[] = { LDNS_RDF_TYPE_STR };
18877b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_isdn_wireformat[] = {
18887b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR
18897b5038d7SDag-Erling Smørgrav };
18907b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rt_wireformat[] = {
18917b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18927b5038d7SDag-Erling Smørgrav };
18937b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsap_wireformat[] = {
18947b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_NSAP
18957b5038d7SDag-Erling Smørgrav };
18967b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsap_ptr_wireformat[] = {
18977b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR
18987b5038d7SDag-Erling Smørgrav };
18997b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sig_wireformat[] = {
19007b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32,
19017b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16,
19027b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64
19037b5038d7SDag-Erling Smørgrav };
19047b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_key_wireformat[] = {
19057b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64
19067b5038d7SDag-Erling Smørgrav };
19077b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_px_wireformat[] = {
19087b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
19097b5038d7SDag-Erling Smørgrav };
19107b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_gpos_wireformat[] = {
191117d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR
19127b5038d7SDag-Erling Smørgrav };
19137b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA };
19147b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC };
19157b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nxt_wireformat[] = {
19167b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_UNKNOWN
19177b5038d7SDag-Erling Smørgrav };
19187b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_eid_wireformat[] = {
19197b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_HEX
19207b5038d7SDag-Erling Smørgrav };
19217b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nimloc_wireformat[] = {
19227b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_HEX
19237b5038d7SDag-Erling Smørgrav };
19247b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_srv_wireformat[] = {
19257b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
19267b5038d7SDag-Erling Smørgrav };
19277b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_atma_wireformat[] = {
19287b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ATMA
19297b5038d7SDag-Erling Smørgrav };
19307b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_naptr_wireformat[] = {
19317b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_DNAME
19327b5038d7SDag-Erling Smørgrav };
19337b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_kx_wireformat[] = {
19347b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
19357b5038d7SDag-Erling Smørgrav };
19367b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_cert_wireformat[] = {
19377b5038d7SDag-Erling Smørgrav 	 LDNS_RDF_TYPE_CERT_ALG, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_B64
19387b5038d7SDag-Erling Smørgrav };
19397b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_a6_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN };
19407b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME };
19417b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sink_wireformat[] = { LDNS_RDF_TYPE_INT8,
19427b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64
19437b5038d7SDag-Erling Smørgrav };
19447b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_apl_wireformat[] = {
19457b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_APL
19467b5038d7SDag-Erling Smørgrav };
19477b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ds_wireformat[] = {
19487b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX
19497b5038d7SDag-Erling Smørgrav };
19507b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sshfp_wireformat[] = {
19517b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX
19527b5038d7SDag-Erling Smørgrav };
19537b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ipseckey_wireformat[] = {
19547b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_IPSECKEY
19557b5038d7SDag-Erling Smørgrav };
19567b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rrsig_wireformat[] = {
19577b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32,
19587b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64
19597b5038d7SDag-Erling Smørgrav };
19607b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec_wireformat[] = {
19617b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_NSEC
19627b5038d7SDag-Erling Smørgrav };
19637b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dhcid_wireformat[] = {
19647b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_B64
19657b5038d7SDag-Erling Smørgrav };
19667b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_talink_wireformat[] = {
19677b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
19687b5038d7SDag-Erling Smørgrav };
1969986ba33cSDag-Erling Smørgrav #ifdef RRTYPE_OPENPGPKEY
1970986ba33cSDag-Erling Smørgrav static const ldns_rdf_type type_openpgpkey_wireformat[] = {
1971986ba33cSDag-Erling Smørgrav 	LDNS_RDF_TYPE_B64
1972986ba33cSDag-Erling Smørgrav };
1973986ba33cSDag-Erling Smørgrav #endif
1974986ba33cSDag-Erling Smørgrav static const ldns_rdf_type type_csync_wireformat[] = {
1975986ba33cSDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC
1976986ba33cSDag-Erling Smørgrav };
1977*5afab0e5SDag-Erling Smørgrav static const ldns_rdf_type type_zonemd_wireformat[] = {
1978*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT32,
1979*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX
1980*5afab0e5SDag-Erling Smørgrav };
1981*5afab0e5SDag-Erling Smørgrav #ifdef RRTYPE_SVCB_HTTPS
1982*5afab0e5SDag-Erling Smørgrav static const ldns_rdf_type type_svcb_wireformat[] = {
1983*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
1984*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME,
1985*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_SVCPARAMS
1986*5afab0e5SDag-Erling Smørgrav };
1987*5afab0e5SDag-Erling Smørgrav #endif
19887b5038d7SDag-Erling Smørgrav /* nsec3 is some vars, followed by same type of data of nsec */
19897b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec3_wireformat[] = {
19907b5038d7SDag-Erling Smørgrav /*	LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/
19917b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC3_SALT, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC
19927b5038d7SDag-Erling Smørgrav };
19937b5038d7SDag-Erling Smørgrav 
19947b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec3param_wireformat[] = {
19957b5038d7SDag-Erling Smørgrav /*	LDNS_RDF_TYPE_NSEC3_PARAMS_VARS*/
19967b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19977b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19987b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
19997b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_NSEC3_SALT
20007b5038d7SDag-Erling Smørgrav };
20017b5038d7SDag-Erling Smørgrav 
20027b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dnskey_wireformat[] = {
20037b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
20047b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
20057b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ALG,
20067b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_B64
20077b5038d7SDag-Erling Smørgrav };
200817d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_tkey_wireformat[] = {
200917d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME,
201017d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME,
201117d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME,
201217d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
201317d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
201417d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA,
201517d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA,
201617d15b25SDag-Erling Smørgrav };
20177b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_tsig_wireformat[] = {
20187b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME,
20197b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TSIGTIME,
20207b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
20217b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA,
20227b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
20237b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
20247b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA
20257b5038d7SDag-Erling Smørgrav };
20262787e39aSDag-Erling Smørgrav static const ldns_rdf_type type_tlsa_wireformat[] = {
2027986ba33cSDag-Erling Smørgrav 	LDNS_RDF_TYPE_CERTIFICATE_USAGE,
2028986ba33cSDag-Erling Smørgrav 	LDNS_RDF_TYPE_SELECTOR,
2029986ba33cSDag-Erling Smørgrav 	LDNS_RDF_TYPE_MATCHING_TYPE,
20302787e39aSDag-Erling Smørgrav 	LDNS_RDF_TYPE_HEX
20312787e39aSDag-Erling Smørgrav };
203217d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_hip_wireformat[] = {
203317d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_HIP
203417d15b25SDag-Erling Smørgrav };
203517d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_nid_wireformat[] = {
203617d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
203717d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ILNP64
203817d15b25SDag-Erling Smørgrav };
203917d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_l32_wireformat[] = {
204017d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
204117d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_A
204217d15b25SDag-Erling Smørgrav };
204317d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_l64_wireformat[] = {
204417d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
204517d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ILNP64
204617d15b25SDag-Erling Smørgrav };
204717d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_lp_wireformat[] = {
204817d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
204917d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME
205017d15b25SDag-Erling Smørgrav };
205117d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_eui48_wireformat[] = {
205217d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_EUI48
205317d15b25SDag-Erling Smørgrav };
205417d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_eui64_wireformat[] = {
205517d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_EUI64
205617d15b25SDag-Erling Smørgrav };
205717d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_uri_wireformat[] = {
205817d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
205917d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
206017d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_LONG_STR
206117d15b25SDag-Erling Smørgrav };
206217d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_caa_wireformat[] = {
206317d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
206417d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TAG,
206517d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_LONG_STR
206617d15b25SDag-Erling Smørgrav };
2067*5afab0e5SDag-Erling Smørgrav #ifdef RRTYPE_DOA
2068*5afab0e5SDag-Erling Smørgrav static const ldns_rdf_type type_doa_wireformat[] = {
2069*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT32,
2070*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT32,
2071*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
2072*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR,
2073*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_B64
2074*5afab0e5SDag-Erling Smørgrav };
2075*5afab0e5SDag-Erling Smørgrav #endif
2076*5afab0e5SDag-Erling Smørgrav #ifdef RRTYPE_AMTRELAY
2077*5afab0e5SDag-Erling Smørgrav static const ldns_rdf_type type_amtrelay_wireformat[] = {
2078*5afab0e5SDag-Erling Smørgrav 	LDNS_RDF_TYPE_AMTRELAY
2079*5afab0e5SDag-Erling Smørgrav };
2080*5afab0e5SDag-Erling Smørgrav #endif
2081*5afab0e5SDag-Erling Smørgrav 
2082*5afab0e5SDag-Erling Smørgrav 
20837b5038d7SDag-Erling Smørgrav /** \endcond */
20847b5038d7SDag-Erling Smørgrav 
20857b5038d7SDag-Erling Smørgrav /** \cond */
20867b5038d7SDag-Erling Smørgrav /* All RR's defined in 1035 are well known and can thus
20877b5038d7SDag-Erling Smørgrav  * be compressed. See RFC3597. These RR's are:
20887b5038d7SDag-Erling Smørgrav  * CNAME HINFO MB MD MF MG MINFO MR MX NULL NS PTR SOA TXT
20897b5038d7SDag-Erling Smørgrav  */
20907b5038d7SDag-Erling Smørgrav static ldns_rr_descriptor rdata_field_descriptors[] = {
20917b5038d7SDag-Erling Smørgrav 	/* 0 */
20927b5038d7SDag-Erling Smørgrav 	{ 0, NULL, 0, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20937b5038d7SDag-Erling Smørgrav 	/* 1 */
20947b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_A, "A", 1, 1, type_a_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20957b5038d7SDag-Erling Smørgrav 	/* 2 */
20967b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NS, "NS", 1, 1, type_ns_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20977b5038d7SDag-Erling Smørgrav 	/* 3 */
20987b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MD, "MD", 1, 1, type_md_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20997b5038d7SDag-Erling Smørgrav 	/* 4 */
21007b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MF, "MF", 1, 1, type_mf_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
21017b5038d7SDag-Erling Smørgrav 	/* 5 */
21027b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
21037b5038d7SDag-Erling Smørgrav 	/* 6 */
21047b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 },
21057b5038d7SDag-Erling Smørgrav 	/* 7 */
21067b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MB, "MB", 1, 1, type_mb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
21077b5038d7SDag-Erling Smørgrav 	/* 8 */
21087b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MG, "MG", 1, 1, type_mg_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
21097b5038d7SDag-Erling Smørgrav 	/* 9 */
21107b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MR, "MR", 1, 1, type_mr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
21117b5038d7SDag-Erling Smørgrav 	/* 10 */
21127b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NULL, "NULL", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21137b5038d7SDag-Erling Smørgrav 	/* 11 */
21147b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21157b5038d7SDag-Erling Smørgrav 	/* 12 */
21167b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
21177b5038d7SDag-Erling Smørgrav 	/* 13 */
21187b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21197b5038d7SDag-Erling Smørgrav 	/* 14 */
21207b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 },
21217b5038d7SDag-Erling Smørgrav 	/* 15 */
21227b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MX, "MX", 2, 2, type_mx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
21237b5038d7SDag-Erling Smørgrav 	/* 16 */
21247b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TXT, "TXT", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
21257b5038d7SDag-Erling Smørgrav 	/* 17 */
21267b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RP, "RP", 2, 2, type_rp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
21277b5038d7SDag-Erling Smørgrav 	/* 18 */
21287b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21297b5038d7SDag-Erling Smørgrav 	/* 19 */
21307b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_X25, "X25", 1, 1, type_x25_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21317b5038d7SDag-Erling Smørgrav 	/* 20 */
21327b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21337b5038d7SDag-Erling Smørgrav 	/* 21 */
21347b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RT, "RT", 2, 2, type_rt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21357b5038d7SDag-Erling Smørgrav 	/* 22 */
21367b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSAP, "NSAP", 1, 1, type_nsap_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21377b5038d7SDag-Erling Smørgrav 	/* 23 */
21387b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSAP_PTR, "NSAP-PTR", 1, 1, type_nsap_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21397b5038d7SDag-Erling Smørgrav 	/* 24 */
21407b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21417b5038d7SDag-Erling Smørgrav 	/* 25 */
21427b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_KEY, "KEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21437b5038d7SDag-Erling Smørgrav 	/* 26 */
21447b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_PX, "PX", 3, 3, type_px_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
21457b5038d7SDag-Erling Smørgrav 	/* 27 */
214617d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_GPOS, "GPOS", 3, 3, type_gpos_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21477b5038d7SDag-Erling Smørgrav 	/* 28 */
21487b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21497b5038d7SDag-Erling Smørgrav 	/* 29 */
21507b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21517b5038d7SDag-Erling Smørgrav 	/* 30 */
21527b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21537b5038d7SDag-Erling Smørgrav 	/* 31 */
21547b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_EID, "EID", 1, 1, type_eid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21557b5038d7SDag-Erling Smørgrav 	/* 32 */
21567b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NIMLOC, "NIMLOC", 1, 1, type_nimloc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21577b5038d7SDag-Erling Smørgrav 	/* 33 */
21587b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21597b5038d7SDag-Erling Smørgrav 	/* 34 */
21607b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_ATMA, "ATMA", 1, 1, type_atma_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21617b5038d7SDag-Erling Smørgrav 	/* 35 */
21627b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21637b5038d7SDag-Erling Smørgrav 	/* 36 */
21647b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_KX, "KX", 2, 2, type_kx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21657b5038d7SDag-Erling Smørgrav 	/* 37 */
21667b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21677b5038d7SDag-Erling Smørgrav 	/* 38 */
21687b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_A6, "A6", 1, 1, type_a6_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21697b5038d7SDag-Erling Smørgrav 	/* 39 */
21707b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21717b5038d7SDag-Erling Smørgrav 	/* 40 */
21727b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SINK, "SINK", 1, 1, type_sink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21737b5038d7SDag-Erling Smørgrav 	/* 41 */
21747b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21757b5038d7SDag-Erling Smørgrav 	/* 42 */
21767b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL, LDNS_RR_NO_COMPRESS, 0 },
21777b5038d7SDag-Erling Smørgrav 	/* 43 */
21787b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21797b5038d7SDag-Erling Smørgrav 	/* 44 */
21807b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21817b5038d7SDag-Erling Smørgrav 	/* 45 */
21827b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_IPSECKEY, "IPSECKEY", 1, 1, type_ipseckey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21837b5038d7SDag-Erling Smørgrav 	/* 46 */
21847b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21857b5038d7SDag-Erling Smørgrav 	/* 47 */
218617d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSEC, "NSEC", 1, 2, type_nsec_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21877b5038d7SDag-Erling Smørgrav 	/* 48 */
21887b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21897b5038d7SDag-Erling Smørgrav 	/* 49 */
21907b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DHCID, "DHCID", 1, 1, type_dhcid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21917b5038d7SDag-Erling Smørgrav 	/* 50 */
21927b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSEC3, "NSEC3", 5, 6, type_nsec3_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21937b5038d7SDag-Erling Smørgrav 	/* 51 */
21947b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21957b5038d7SDag-Erling Smørgrav 	/* 52 */
21962787e39aSDag-Erling Smørgrav 	{LDNS_RR_TYPE_TLSA, "TLSA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21972787e39aSDag-Erling Smørgrav 
2198986ba33cSDag-Erling Smørgrav 	{LDNS_RR_TYPE_SMIMEA, "SMIMEA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21997b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
220017d15b25SDag-Erling Smørgrav 
220117d15b25SDag-Erling Smørgrav 	/* 55
220217d15b25SDag-Erling Smørgrav 	 * Hip ends with 0 or more Rendezvous Servers represented as dname's.
220317d15b25SDag-Erling Smørgrav 	 * Hence the LDNS_RDF_TYPE_DNAME _variable field and the _maximum field
220417d15b25SDag-Erling Smørgrav 	 * set to 0.
220517d15b25SDag-Erling Smørgrav 	 */
220617d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_HIP, "HIP", 1, 1, type_hip_wireformat, LDNS_RDF_TYPE_DNAME, LDNS_RR_NO_COMPRESS, 0 },
220717d15b25SDag-Erling Smørgrav 
220817d15b25SDag-Erling Smørgrav #ifdef RRTYPE_NINFO
220917d15b25SDag-Erling Smørgrav 	/* 56 */
221017d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NINFO, "NINFO", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
221117d15b25SDag-Erling Smørgrav #else
22127b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE56", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
221317d15b25SDag-Erling Smørgrav #endif
221417d15b25SDag-Erling Smørgrav #ifdef RRTYPE_RKEY
221517d15b25SDag-Erling Smørgrav 	/* 57 */
221617d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RKEY, "RKEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
221717d15b25SDag-Erling Smørgrav #else
22187b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE57", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
221917d15b25SDag-Erling Smørgrav #endif
22207b5038d7SDag-Erling Smørgrav 	/* 58 */
22217b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TALINK, "TALINK", 2, 2, type_talink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
222217d15b25SDag-Erling Smørgrav 
222317d15b25SDag-Erling Smørgrav 	/* 59 */
222417d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CDS, "CDS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2225986ba33cSDag-Erling Smørgrav 	/* 60 */
2226986ba33cSDag-Erling Smørgrav 	{LDNS_RR_TYPE_CDNSKEY, "CDNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2227986ba33cSDag-Erling Smørgrav 
2228986ba33cSDag-Erling Smørgrav #ifdef RRTYPE_OPENPGPKEY
2229986ba33cSDag-Erling Smørgrav 	/* 61 */
2230986ba33cSDag-Erling Smørgrav 	{LDNS_RR_TYPE_OPENPGPKEY, "OPENPGPKEY", 1, 1, type_openpgpkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
223117d15b25SDag-Erling Smørgrav #else
2232986ba33cSDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE61", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
223317d15b25SDag-Erling Smørgrav #endif
2234*5afab0e5SDag-Erling Smørgrav 	/* 62 */
2235986ba33cSDag-Erling Smørgrav 	{LDNS_RR_TYPE_CSYNC, "CSYNC", 3, 3, type_csync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2236*5afab0e5SDag-Erling Smørgrav 	/* 63 */
2237*5afab0e5SDag-Erling Smørgrav 	{LDNS_RR_TYPE_ZONEMD, "ZONEMD", 4, 4, type_zonemd_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2238*5afab0e5SDag-Erling Smørgrav #ifdef RRTYPE_SVCB_HTTPS
2239*5afab0e5SDag-Erling Smørgrav 	/* 64 */
2240*5afab0e5SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SVCB, "SVCB", 2, 3, type_svcb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2241*5afab0e5SDag-Erling Smørgrav 	/* 65 */
2242*5afab0e5SDag-Erling Smørgrav 	{LDNS_RR_TYPE_HTTPS, "HTTPS", 2, 3, type_svcb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2243*5afab0e5SDag-Erling Smørgrav 
2244*5afab0e5SDag-Erling Smørgrav #else
22457b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22467b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2247*5afab0e5SDag-Erling Smørgrav #endif
22487b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22497b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22507b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22517b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE69", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22527b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE70", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22537b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE71", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22547b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE72", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22557b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE73", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22567b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE74", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22577b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE75", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22587b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE76", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22597b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE77", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22607b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE78", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22617b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE79", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22627b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE80", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22637b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE81", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22647b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE82", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22657b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE83", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22667b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE84", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22677b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE85", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22687b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE86", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22697b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE87", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22707b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE88", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22717b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE89", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22727b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE90", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22737b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE91", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22747b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE92", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22757b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE93", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22767b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE94", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22777b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE95", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22787b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE96", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22797b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE97", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22807b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE98", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
228117d15b25SDag-Erling Smørgrav 
228217d15b25SDag-Erling Smørgrav 	/* 99 */
22837b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SPF,  "SPF", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
228417d15b25SDag-Erling Smørgrav 
228517d15b25SDag-Erling Smørgrav 	/* UINFO  [IANA-Reserved] */
22867b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE100", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
228717d15b25SDag-Erling Smørgrav 	/* UID    [IANA-Reserved] */
22887b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE101", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
228917d15b25SDag-Erling Smørgrav 	/* GID    [IANA-Reserved] */
22907b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE102", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
229117d15b25SDag-Erling Smørgrav 	/* UNSPEC [IANA-Reserved] */
22927b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE103", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
229317d15b25SDag-Erling Smørgrav 
229417d15b25SDag-Erling Smørgrav 	/* 104 */
229517d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NID, "NID", 2, 2, type_nid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
229617d15b25SDag-Erling Smørgrav 	/* 105 */
229717d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_L32, "L32", 2, 2, type_l32_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
229817d15b25SDag-Erling Smørgrav 	/* 106 */
229917d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_L64, "L64", 2, 2, type_l64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
230017d15b25SDag-Erling Smørgrav 	/* 107 */
230117d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_LP, "LP", 2, 2, type_lp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
230217d15b25SDag-Erling Smørgrav 	/* 108 */
230317d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_EUI48, "EUI48", 1, 1, type_eui48_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
230417d15b25SDag-Erling Smørgrav 	/* 109 */
230517d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_EUI64, "EUI64", 1, 1, type_eui64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
230617d15b25SDag-Erling Smørgrav 
23077b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE110", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23087b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE111", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23097b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE112", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23107b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE113", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23117b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE114", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23127b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE115", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23137b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE116", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23147b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE117", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23157b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE118", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23167b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE119", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23177b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE120", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23187b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE121", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23197b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE122", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23207b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE123", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23217b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE124", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23227b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE125", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23237b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE126", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23247b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE127", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23257b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE128", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23267b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE129", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23277b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE130", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23287b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE131", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23297b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE132", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23307b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE133", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23317b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE134", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23327b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE135", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23337b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE136", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23347b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE137", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23357b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE138", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23367b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE139", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23377b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE140", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23387b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE141", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23397b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE142", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23407b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE143", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23417b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE144", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23427b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE145", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23437b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE146", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23447b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE147", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23457b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE148", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23467b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE149", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23477b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE150", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23487b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE151", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23497b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE152", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23507b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE153", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23517b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE154", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23527b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE155", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23537b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE156", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23547b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE157", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23557b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE158", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23567b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE159", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23577b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE160", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23587b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE161", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23597b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE162", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23607b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE163", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23617b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE164", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23627b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE165", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23637b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE166", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23647b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE167", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23657b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE168", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23667b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE169", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23677b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE170", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23687b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE171", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23697b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE172", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23707b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE173", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23717b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE174", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23727b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE175", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23737b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE176", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23747b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE177", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23757b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE178", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23767b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE179", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23777b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE180", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23787b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE181", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23797b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE182", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23807b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE183", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23817b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE184", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23827b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE185", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23837b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE186", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23847b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE187", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23857b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE188", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23867b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE189", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23877b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE190", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23887b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE191", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23897b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE192", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23907b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE193", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23917b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE194", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23927b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE195", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23937b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE196", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23947b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE197", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23957b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE198", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23967b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE199", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23977b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE200", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23987b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE201", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23997b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE202", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24007b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE203", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24017b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE204", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24027b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE205", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24037b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE206", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24047b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE207", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24057b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE208", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24067b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE209", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24077b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE210", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24087b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE211", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24097b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE212", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24107b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE213", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24117b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE214", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24127b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE215", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24137b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE216", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24147b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE217", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24157b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE218", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24167b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE219", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24177b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE220", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24187b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE221", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24197b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE222", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24207b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE223", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24217b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE224", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24227b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE225", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24237b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE226", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24247b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE227", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24257b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE228", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24267b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE229", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24277b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE230", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24287b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE231", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24297b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE232", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24307b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE233", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24317b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE234", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24327b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE235", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24337b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE236", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24347b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE237", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24357b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE238", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24367b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE239", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24377b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE240", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24387b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE241", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24397b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE242", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24407b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE243", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24417b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE244", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24427b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE245", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24437b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE246", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24447b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE247", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
24457b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE248", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
244617d15b25SDag-Erling Smørgrav 
244717d15b25SDag-Erling Smørgrav 	/* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one.
244817d15b25SDag-Erling Smørgrav 	 * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9.
24497b5038d7SDag-Erling Smørgrav 	 */
245017d15b25SDag-Erling Smørgrav 	/* 249 */
245117d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TKEY, "TKEY", 7, 7, type_tkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
245217d15b25SDag-Erling Smørgrav 	/* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one.
245317d15b25SDag-Erling Smørgrav 	 * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9.
245417d15b25SDag-Erling Smørgrav 	 */
245517d15b25SDag-Erling Smørgrav 	/* 250 */
245617d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TSIG, "TSIG", 7, 7, type_tsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
245717d15b25SDag-Erling Smørgrav 
245817d15b25SDag-Erling Smørgrav 	/* IXFR: A request for a transfer of an incremental zone transfer */
245917d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE251", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
246017d15b25SDag-Erling Smørgrav 	/* AXFR: A request for a transfer of an entire zone */
246117d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE252", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
246217d15b25SDag-Erling Smørgrav 	/* MAILB: A request for mailbox-related records (MB, MG or MR) */
246317d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE253", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
246417d15b25SDag-Erling Smørgrav 	/* MAILA: A request for mail agent RRs (Obsolete - see MX) */
246517d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE254", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
246617d15b25SDag-Erling Smørgrav 	/* ANY: A request for all (available) records */
246717d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE255", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
246817d15b25SDag-Erling Smørgrav 
246917d15b25SDag-Erling Smørgrav 	/* 256 */
247017d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_URI, "URI", 3, 3, type_uri_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
247117d15b25SDag-Erling Smørgrav 	/* 257 */
247217d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CAA, "CAA", 3, 3, type_caa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
247317d15b25SDag-Erling Smørgrav 
2474986ba33cSDag-Erling Smørgrav #ifdef RRTYPE_AVC
2475986ba33cSDag-Erling Smørgrav 	/* 258 */
2476986ba33cSDag-Erling Smørgrav 	{LDNS_RR_TYPE_AVC, "AVC", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2477986ba33cSDag-Erling Smørgrav #else
2478986ba33cSDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE258", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2479986ba33cSDag-Erling Smørgrav #endif
2480*5afab0e5SDag-Erling Smørgrav #ifdef RRTYPE_DOA
2481*5afab0e5SDag-Erling Smørgrav 	/* 259 */
2482*5afab0e5SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DOA, "DOA", 5, 5, type_doa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2483*5afab0e5SDag-Erling Smørgrav #else
2484*5afab0e5SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE259", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2485*5afab0e5SDag-Erling Smørgrav #endif
2486*5afab0e5SDag-Erling Smørgrav #ifdef RRTYPE_AMTRELAY
2487*5afab0e5SDag-Erling Smørgrav 	/* 260 */
2488*5afab0e5SDag-Erling Smørgrav 	{LDNS_RR_TYPE_AMTRELAY, "AMTRELAY", 1, 1, type_amtrelay_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2489*5afab0e5SDag-Erling Smørgrav #else
2490*5afab0e5SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE260", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2491*5afab0e5SDag-Erling Smørgrav #endif
2492986ba33cSDag-Erling Smørgrav 
24937b5038d7SDag-Erling Smørgrav /* split in array, no longer contiguous */
249417d15b25SDag-Erling Smørgrav 
249517d15b25SDag-Erling Smørgrav #ifdef RRTYPE_TA
249617d15b25SDag-Erling Smørgrav 	/* 32768 */
249717d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TA, "TA", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
249817d15b25SDag-Erling Smørgrav #else
249917d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE32768", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
250017d15b25SDag-Erling Smørgrav #endif
250117d15b25SDag-Erling Smørgrav 	/* 32769 */
25027b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DLV, "DLV", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }
25037b5038d7SDag-Erling Smørgrav };
25047b5038d7SDag-Erling Smørgrav /** \endcond */
25057b5038d7SDag-Erling Smørgrav 
25067b5038d7SDag-Erling Smørgrav /**
25077b5038d7SDag-Erling Smørgrav  * \def LDNS_RDATA_FIELD_DESCRIPTORS_COUNT
25087b5038d7SDag-Erling Smørgrav  * computes the number of rdata fields
25097b5038d7SDag-Erling Smørgrav  */
25107b5038d7SDag-Erling Smørgrav #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
25117b5038d7SDag-Erling Smørgrav 	(sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
25127b5038d7SDag-Erling Smørgrav 
251317d15b25SDag-Erling Smørgrav 
251417d15b25SDag-Erling Smørgrav /*---------------------------------------------------------------------------*
251517d15b25SDag-Erling Smørgrav  * The functions below return an bitmap RDF with the space required to set
251617d15b25SDag-Erling Smørgrav  * or unset all known RR types. Arguably these functions are better situated
2517*5afab0e5SDag-Erling Smørgrav  * in rdata.c, however for the space calculation it is necessary to walk
251817d15b25SDag-Erling Smørgrav  * through rdata_field_descriptors which is not easily possible from anywhere
251917d15b25SDag-Erling Smørgrav  * other than rr.c where it is declared static.
252017d15b25SDag-Erling Smørgrav  *
252117d15b25SDag-Erling Smørgrav  * Alternatively rr.c could have provided an iterator for rr_type or
252217d15b25SDag-Erling Smørgrav  * rdf_descriptors, but this seemed overkill for internal use only.
252317d15b25SDag-Erling Smørgrav  */
252417d15b25SDag-Erling Smørgrav static ldns_rr_descriptor* rdata_field_descriptors_end =
252517d15b25SDag-Erling Smørgrav 	&rdata_field_descriptors[LDNS_RDATA_FIELD_DESCRIPTORS_COUNT];
252617d15b25SDag-Erling Smørgrav 
252717d15b25SDag-Erling Smørgrav /* From RFC3845:
252817d15b25SDag-Erling Smørgrav  *
252917d15b25SDag-Erling Smørgrav  * 2.1.2.  The List of Type Bit Map(s) Field
253017d15b25SDag-Erling Smørgrav  *
253117d15b25SDag-Erling Smørgrav  *    The RR type space is split into 256 window blocks, each representing
253217d15b25SDag-Erling Smørgrav  *    the low-order 8 bits of the 16-bit RR type space.  Each block that
253317d15b25SDag-Erling Smørgrav  *    has at least one active RR type is encoded using a single octet
253417d15b25SDag-Erling Smørgrav  *    window number (from 0 to 255), a single octet bitmap length (from 1
253517d15b25SDag-Erling Smørgrav  *    to 32) indicating the number of octets used for the window block's
253617d15b25SDag-Erling Smørgrav  *    bitmap, and up to 32 octets (256 bits) of bitmap.
253717d15b25SDag-Erling Smørgrav  *
253817d15b25SDag-Erling Smørgrav  *    Window blocks are present in the NSEC RR RDATA in increasing
253917d15b25SDag-Erling Smørgrav  *    numerical order.
254017d15b25SDag-Erling Smørgrav  *
254117d15b25SDag-Erling Smørgrav  *    "|" denotes concatenation
254217d15b25SDag-Erling Smørgrav  *
254317d15b25SDag-Erling Smørgrav  *    Type Bit Map(s) Field = ( Window Block # | Bitmap Length | Bitmap ) +
254417d15b25SDag-Erling Smørgrav  *
254517d15b25SDag-Erling Smørgrav  *    <cut>
254617d15b25SDag-Erling Smørgrav  *
254717d15b25SDag-Erling Smørgrav  *    Blocks with no types present MUST NOT be included.  Trailing zero
254817d15b25SDag-Erling Smørgrav  *    octets in the bitmap MUST be omitted.  The length of each block's
254917d15b25SDag-Erling Smørgrav  *    bitmap is determined by the type code with the largest numerical
255017d15b25SDag-Erling Smørgrav  *    value within that block, among the set of RR types present at the
255117d15b25SDag-Erling Smørgrav  *    NSEC RR's owner name.  Trailing zero octets not specified MUST be
255217d15b25SDag-Erling Smørgrav  *    interpreted as zero octets.
255317d15b25SDag-Erling Smørgrav  */
255417d15b25SDag-Erling Smørgrav static ldns_status
ldns_rdf_bitmap_known_rr_types_set(ldns_rdf ** rdf,int value)255517d15b25SDag-Erling Smørgrav ldns_rdf_bitmap_known_rr_types_set(ldns_rdf** rdf, int value)
255617d15b25SDag-Erling Smørgrav {
255717d15b25SDag-Erling Smørgrav 	uint8_t  window;		/*  most significant octet of type */
255817d15b25SDag-Erling Smørgrav 	uint8_t  subtype;		/* least significant octet of type */
255917d15b25SDag-Erling Smørgrav 	uint16_t windows[256]		/* Max subtype per window */
256017d15b25SDag-Erling Smørgrav #ifndef S_SPLINT_S
256117d15b25SDag-Erling Smørgrav 	                      = { 0 }
256217d15b25SDag-Erling Smørgrav #endif
256317d15b25SDag-Erling Smørgrav 	                             ;
256417d15b25SDag-Erling Smørgrav 	ldns_rr_descriptor* d;	/* used to traverse rdata_field_descriptors */
256517d15b25SDag-Erling Smørgrav 	size_t i;		/* used to traverse windows array */
256617d15b25SDag-Erling Smørgrav 
256717d15b25SDag-Erling Smørgrav 	size_t sz;			/* size needed for type bitmap rdf */
256817d15b25SDag-Erling Smørgrav 	uint8_t* data = NULL;		/* rdf data */
256917d15b25SDag-Erling Smørgrav 	uint8_t* dptr;			/* used to itraverse rdf data */
257017d15b25SDag-Erling Smørgrav 
257117d15b25SDag-Erling Smørgrav 	assert(rdf != NULL);
257217d15b25SDag-Erling Smørgrav 
257317d15b25SDag-Erling Smørgrav 	/* Which windows need to be in the bitmap rdf?
257417d15b25SDag-Erling Smørgrav 	 */
257517d15b25SDag-Erling Smørgrav 	for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) {
257617d15b25SDag-Erling Smørgrav 		window  = d->_type >> 8;
257717d15b25SDag-Erling Smørgrav 		subtype = d->_type & 0xff;
257817d15b25SDag-Erling Smørgrav 		if (windows[window] < subtype) {
257917d15b25SDag-Erling Smørgrav 			windows[window] = subtype;
258017d15b25SDag-Erling Smørgrav 		}
258117d15b25SDag-Erling Smørgrav 	}
258217d15b25SDag-Erling Smørgrav 
258317d15b25SDag-Erling Smørgrav 	/* How much space do we need in the rdf for those windows?
258417d15b25SDag-Erling Smørgrav 	 */
258517d15b25SDag-Erling Smørgrav 	sz = 0;
258617d15b25SDag-Erling Smørgrav 	for (i = 0; i < 256; i++) {
258717d15b25SDag-Erling Smørgrav 		if (windows[i]) {
258817d15b25SDag-Erling Smørgrav 			sz += windows[i] / 8 + 3;
258917d15b25SDag-Erling Smørgrav 		}
259017d15b25SDag-Erling Smørgrav 	}
259117d15b25SDag-Erling Smørgrav 	if (sz > 0) {
259217d15b25SDag-Erling Smørgrav 		/* Format rdf data according RFC3845 Section 2.1.2 (see above)
259317d15b25SDag-Erling Smørgrav 		 */
259417d15b25SDag-Erling Smørgrav 		dptr = data = LDNS_XMALLOC(uint8_t, sz);
259517d15b25SDag-Erling Smørgrav 		if (!data) {
259617d15b25SDag-Erling Smørgrav 			return LDNS_STATUS_MEM_ERR;
259717d15b25SDag-Erling Smørgrav 		}
2598*5afab0e5SDag-Erling Smørgrav 		memset(data, value, sz);
259917d15b25SDag-Erling Smørgrav 		for (i = 0; i < 256; i++) {
260017d15b25SDag-Erling Smørgrav 			if (windows[i]) {
260117d15b25SDag-Erling Smørgrav 				*dptr++ = (uint8_t)i;
260217d15b25SDag-Erling Smørgrav 				*dptr++ = (uint8_t)(windows[i] / 8 + 1);
260317d15b25SDag-Erling Smørgrav 				dptr += dptr[-1];
260417d15b25SDag-Erling Smørgrav 			}
260517d15b25SDag-Erling Smørgrav 		}
260617d15b25SDag-Erling Smørgrav 	}
260717d15b25SDag-Erling Smørgrav 	/* Allocate and return rdf structure for the data
260817d15b25SDag-Erling Smørgrav 	 */
260917d15b25SDag-Erling Smørgrav 	*rdf = ldns_rdf_new(LDNS_RDF_TYPE_BITMAP, sz, data);
261017d15b25SDag-Erling Smørgrav 	if (!*rdf) {
261117d15b25SDag-Erling Smørgrav 		LDNS_FREE(data);
261217d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_MEM_ERR;
261317d15b25SDag-Erling Smørgrav 	}
261417d15b25SDag-Erling Smørgrav 	return LDNS_STATUS_OK;
261517d15b25SDag-Erling Smørgrav }
261617d15b25SDag-Erling Smørgrav 
261717d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf_bitmap_known_rr_types_space(ldns_rdf ** rdf)261817d15b25SDag-Erling Smørgrav ldns_rdf_bitmap_known_rr_types_space(ldns_rdf** rdf)
261917d15b25SDag-Erling Smørgrav {
262017d15b25SDag-Erling Smørgrav 	return ldns_rdf_bitmap_known_rr_types_set(rdf, 0);
262117d15b25SDag-Erling Smørgrav }
262217d15b25SDag-Erling Smørgrav 
262317d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf_bitmap_known_rr_types(ldns_rdf ** rdf)262417d15b25SDag-Erling Smørgrav ldns_rdf_bitmap_known_rr_types(ldns_rdf** rdf)
262517d15b25SDag-Erling Smørgrav {
262617d15b25SDag-Erling Smørgrav 	return ldns_rdf_bitmap_known_rr_types_set(rdf, 255);
262717d15b25SDag-Erling Smørgrav }
262817d15b25SDag-Erling Smørgrav /* End of RDF bitmap functions
262917d15b25SDag-Erling Smørgrav  *---------------------------------------------------------------------------*/
263017d15b25SDag-Erling Smørgrav 
263117d15b25SDag-Erling Smørgrav 
26327b5038d7SDag-Erling Smørgrav const ldns_rr_descriptor *
ldns_rr_descript(uint16_t type)26337b5038d7SDag-Erling Smørgrav ldns_rr_descript(uint16_t type)
26347b5038d7SDag-Erling Smørgrav {
26357b5038d7SDag-Erling Smørgrav 	size_t i;
263617d15b25SDag-Erling Smørgrav 	if (type < LDNS_RDATA_FIELD_DESCRIPTORS_COMMON) {
26377b5038d7SDag-Erling Smørgrav 		return &rdata_field_descriptors[type];
26387b5038d7SDag-Erling Smørgrav 	} else {
26397b5038d7SDag-Erling Smørgrav 		/* because not all array index equals type code */
26407b5038d7SDag-Erling Smørgrav 		for (i = LDNS_RDATA_FIELD_DESCRIPTORS_COMMON;
26417b5038d7SDag-Erling Smørgrav 		     i < LDNS_RDATA_FIELD_DESCRIPTORS_COUNT;
26427b5038d7SDag-Erling Smørgrav 		     i++) {
26437b5038d7SDag-Erling Smørgrav 		        if (rdata_field_descriptors[i]._type == type) {
26447b5038d7SDag-Erling Smørgrav 		     		return &rdata_field_descriptors[i];
26457b5038d7SDag-Erling Smørgrav 			}
26467b5038d7SDag-Erling Smørgrav 		}
26477b5038d7SDag-Erling Smørgrav                 return &rdata_field_descriptors[0];
26487b5038d7SDag-Erling Smørgrav 	}
26497b5038d7SDag-Erling Smørgrav }
26507b5038d7SDag-Erling Smørgrav 
26517b5038d7SDag-Erling Smørgrav size_t
ldns_rr_descriptor_minimum(const ldns_rr_descriptor * descriptor)26527b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor)
26537b5038d7SDag-Erling Smørgrav {
26547b5038d7SDag-Erling Smørgrav 	if (descriptor) {
26557b5038d7SDag-Erling Smørgrav 		return descriptor->_minimum;
26567b5038d7SDag-Erling Smørgrav 	} else {
26577b5038d7SDag-Erling Smørgrav 		return 0;
26587b5038d7SDag-Erling Smørgrav 	}
26597b5038d7SDag-Erling Smørgrav }
26607b5038d7SDag-Erling Smørgrav 
26617b5038d7SDag-Erling Smørgrav size_t
ldns_rr_descriptor_maximum(const ldns_rr_descriptor * descriptor)26627b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor)
26637b5038d7SDag-Erling Smørgrav {
26647b5038d7SDag-Erling Smørgrav 	if (descriptor) {
26657b5038d7SDag-Erling Smørgrav 		if (descriptor->_variable != LDNS_RDF_TYPE_NONE) {
26667b5038d7SDag-Erling Smørgrav 			/* Should really be SIZE_MAX... bad FreeBSD.  */
26677b5038d7SDag-Erling Smørgrav 			return UINT_MAX;
26687b5038d7SDag-Erling Smørgrav 		} else {
26697b5038d7SDag-Erling Smørgrav 			return descriptor->_maximum;
26707b5038d7SDag-Erling Smørgrav 		}
26717b5038d7SDag-Erling Smørgrav 	} else {
26727b5038d7SDag-Erling Smørgrav 		return 0;
26737b5038d7SDag-Erling Smørgrav 	}
26747b5038d7SDag-Erling Smørgrav }
26757b5038d7SDag-Erling Smørgrav 
26767b5038d7SDag-Erling Smørgrav ldns_rdf_type
ldns_rr_descriptor_field_type(const ldns_rr_descriptor * descriptor,size_t index)26777b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor,
26787b5038d7SDag-Erling Smørgrav                               size_t index)
26797b5038d7SDag-Erling Smørgrav {
26807b5038d7SDag-Erling Smørgrav 	assert(descriptor != NULL);
26817b5038d7SDag-Erling Smørgrav 	assert(index < descriptor->_maximum
26827b5038d7SDag-Erling Smørgrav 	       || descriptor->_variable != LDNS_RDF_TYPE_NONE);
26837b5038d7SDag-Erling Smørgrav 	if (index < descriptor->_maximum) {
26847b5038d7SDag-Erling Smørgrav 		return descriptor->_wireformat[index];
26857b5038d7SDag-Erling Smørgrav 	} else {
26867b5038d7SDag-Erling Smørgrav 		return descriptor->_variable;
26877b5038d7SDag-Erling Smørgrav 	}
26887b5038d7SDag-Erling Smørgrav }
26897b5038d7SDag-Erling Smørgrav 
26907b5038d7SDag-Erling Smørgrav ldns_rr_type
ldns_get_rr_type_by_name(const char * name)26917b5038d7SDag-Erling Smørgrav ldns_get_rr_type_by_name(const char *name)
26927b5038d7SDag-Erling Smørgrav {
26937b5038d7SDag-Erling Smørgrav 	unsigned int i;
26947b5038d7SDag-Erling Smørgrav 	const char *desc_name;
26957b5038d7SDag-Erling Smørgrav 	const ldns_rr_descriptor *desc;
26967b5038d7SDag-Erling Smørgrav 
26977b5038d7SDag-Erling Smørgrav 	/* TYPEXX representation */
26987b5038d7SDag-Erling Smørgrav 	if (strlen(name) > 4 && strncasecmp(name, "TYPE", 4) == 0) {
26997b5038d7SDag-Erling Smørgrav 		return atoi(name + 4);
27007b5038d7SDag-Erling Smørgrav 	}
27017b5038d7SDag-Erling Smørgrav 
27027b5038d7SDag-Erling Smørgrav 	/* Normal types */
27037b5038d7SDag-Erling Smørgrav 	for (i = 0; i < (unsigned int) LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; i++) {
27047b5038d7SDag-Erling Smørgrav 		desc = &rdata_field_descriptors[i];
27057b5038d7SDag-Erling Smørgrav 		desc_name = desc->_name;
27067b5038d7SDag-Erling Smørgrav 		if(desc_name &&
27077b5038d7SDag-Erling Smørgrav 		   strlen(name) == strlen(desc_name) &&
27087b5038d7SDag-Erling Smørgrav 		   strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
27097b5038d7SDag-Erling Smørgrav 			/* because not all array index equals type code */
27107b5038d7SDag-Erling Smørgrav 			return desc->_type;
27117b5038d7SDag-Erling Smørgrav 		}
27127b5038d7SDag-Erling Smørgrav 	}
27137b5038d7SDag-Erling Smørgrav 
27147b5038d7SDag-Erling Smørgrav 	/* special cases for query types */
27157b5038d7SDag-Erling Smørgrav 	if (strlen(name) == 4 && strncasecmp(name, "IXFR", 4) == 0) {
27167b5038d7SDag-Erling Smørgrav 		return 251;
27177b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 4 && strncasecmp(name, "AXFR", 4) == 0) {
27187b5038d7SDag-Erling Smørgrav 		return 252;
27197b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 5 && strncasecmp(name, "MAILB", 5) == 0) {
27207b5038d7SDag-Erling Smørgrav 		return 253;
27217b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 5 && strncasecmp(name, "MAILA", 5) == 0) {
27227b5038d7SDag-Erling Smørgrav 		return 254;
27237b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 3 && strncasecmp(name, "ANY", 3) == 0) {
27247b5038d7SDag-Erling Smørgrav 		return 255;
27257b5038d7SDag-Erling Smørgrav 	}
27267b5038d7SDag-Erling Smørgrav 
27277b5038d7SDag-Erling Smørgrav 	return 0;
27287b5038d7SDag-Erling Smørgrav }
27297b5038d7SDag-Erling Smørgrav 
27307b5038d7SDag-Erling Smørgrav ldns_rr_class
ldns_get_rr_class_by_name(const char * name)27317b5038d7SDag-Erling Smørgrav ldns_get_rr_class_by_name(const char *name)
27327b5038d7SDag-Erling Smørgrav {
27337b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt;
27347b5038d7SDag-Erling Smørgrav 
27357b5038d7SDag-Erling Smørgrav 	/* CLASSXX representation */
27367b5038d7SDag-Erling Smørgrav 	if (strlen(name) > 5 && strncasecmp(name, "CLASS", 5) == 0) {
27377b5038d7SDag-Erling Smørgrav 		return atoi(name + 5);
27387b5038d7SDag-Erling Smørgrav 	}
27397b5038d7SDag-Erling Smørgrav 
27407b5038d7SDag-Erling Smørgrav 	/* Normal types */
27417b5038d7SDag-Erling Smørgrav 	lt = ldns_lookup_by_name(ldns_rr_classes, name);
27427b5038d7SDag-Erling Smørgrav 
27437b5038d7SDag-Erling Smørgrav 	if (lt) {
27447b5038d7SDag-Erling Smørgrav 		return lt->id;
27457b5038d7SDag-Erling Smørgrav 	}
27467b5038d7SDag-Erling Smørgrav 	return 0;
27477b5038d7SDag-Erling Smørgrav }
27487b5038d7SDag-Erling Smørgrav 
27497b5038d7SDag-Erling Smørgrav 
27507b5038d7SDag-Erling Smørgrav ldns_rr_type
ldns_rdf2rr_type(const ldns_rdf * rd)27517b5038d7SDag-Erling Smørgrav ldns_rdf2rr_type(const ldns_rdf *rd)
27527b5038d7SDag-Erling Smørgrav {
27537b5038d7SDag-Erling Smørgrav         ldns_rr_type r;
27547b5038d7SDag-Erling Smørgrav 
27557b5038d7SDag-Erling Smørgrav         if (!rd) {
27567b5038d7SDag-Erling Smørgrav                 return 0;
27577b5038d7SDag-Erling Smørgrav         }
27587b5038d7SDag-Erling Smørgrav 
27597b5038d7SDag-Erling Smørgrav         if (ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_TYPE) {
27607b5038d7SDag-Erling Smørgrav                 return 0;
27617b5038d7SDag-Erling Smørgrav         }
27627b5038d7SDag-Erling Smørgrav 
27637b5038d7SDag-Erling Smørgrav         r = (ldns_rr_type) ldns_rdf2native_int16(rd);
27647b5038d7SDag-Erling Smørgrav         return r;
27657b5038d7SDag-Erling Smørgrav }
27667b5038d7SDag-Erling Smørgrav 
27677b5038d7SDag-Erling Smørgrav ldns_rr_type
ldns_rr_list_type(const ldns_rr_list * rr_list)27687b5038d7SDag-Erling Smørgrav ldns_rr_list_type(const ldns_rr_list *rr_list)
27697b5038d7SDag-Erling Smørgrav {
27707b5038d7SDag-Erling Smørgrav 	if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) {
27717b5038d7SDag-Erling Smørgrav 		return ldns_rr_get_type(ldns_rr_list_rr(rr_list, 0));
27727b5038d7SDag-Erling Smørgrav 	} else {
27737b5038d7SDag-Erling Smørgrav 		return 0;
27747b5038d7SDag-Erling Smørgrav 	}
27757b5038d7SDag-Erling Smørgrav }
27767b5038d7SDag-Erling Smørgrav 
27777b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_list_owner(const ldns_rr_list * rr_list)27787b5038d7SDag-Erling Smørgrav ldns_rr_list_owner(const ldns_rr_list *rr_list)
27797b5038d7SDag-Erling Smørgrav {
27807b5038d7SDag-Erling Smørgrav 	if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) {
27817b5038d7SDag-Erling Smørgrav 		return ldns_rr_owner(ldns_rr_list_rr(rr_list, 0));
27827b5038d7SDag-Erling Smørgrav 	} else {
27837b5038d7SDag-Erling Smørgrav 		return NULL;
27847b5038d7SDag-Erling Smørgrav 	}
27857b5038d7SDag-Erling Smørgrav }
2786