xref: /freebsd/contrib/ldns/rr.c (revision 17d15b251108ff09e632ed4812f7c66999a6b69b)
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>
137b5038d7SDag-Erling Smørgrav 
147b5038d7SDag-Erling Smørgrav #include <strings.h>
157b5038d7SDag-Erling Smørgrav #include <limits.h>
167b5038d7SDag-Erling Smørgrav 
177b5038d7SDag-Erling Smørgrav #include <errno.h>
187b5038d7SDag-Erling Smørgrav 
197b5038d7SDag-Erling Smørgrav #define LDNS_SYNTAX_DATALEN 16
207b5038d7SDag-Erling Smørgrav #define LDNS_TTL_DATALEN    21
217b5038d7SDag-Erling Smørgrav #define LDNS_RRLIST_INIT    8
227b5038d7SDag-Erling Smørgrav 
237b5038d7SDag-Erling Smørgrav ldns_rr *
247b5038d7SDag-Erling Smørgrav ldns_rr_new(void)
257b5038d7SDag-Erling Smørgrav {
267b5038d7SDag-Erling Smørgrav 	ldns_rr *rr;
277b5038d7SDag-Erling Smørgrav 	rr = LDNS_MALLOC(ldns_rr);
287b5038d7SDag-Erling Smørgrav         if (!rr) {
297b5038d7SDag-Erling Smørgrav                 return NULL;
307b5038d7SDag-Erling Smørgrav 	}
317b5038d7SDag-Erling Smørgrav 
327b5038d7SDag-Erling Smørgrav 	ldns_rr_set_owner(rr, NULL);
337b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(rr, false);
347b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, 0);
357b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields = NULL;
367b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(rr, LDNS_RR_CLASS_IN);
377b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL);
387b5038d7SDag-Erling Smørgrav         return rr;
397b5038d7SDag-Erling Smørgrav }
407b5038d7SDag-Erling Smørgrav 
417b5038d7SDag-Erling Smørgrav ldns_rr *
427b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_type(ldns_rr_type t)
437b5038d7SDag-Erling Smørgrav {
447b5038d7SDag-Erling Smørgrav 	ldns_rr *rr;
457b5038d7SDag-Erling Smørgrav 	const ldns_rr_descriptor *desc;
467b5038d7SDag-Erling Smørgrav 	size_t i;
477b5038d7SDag-Erling Smørgrav 
487b5038d7SDag-Erling Smørgrav 	rr = LDNS_MALLOC(ldns_rr);
497b5038d7SDag-Erling Smørgrav         if (!rr) {
507b5038d7SDag-Erling Smørgrav                 return NULL;
517b5038d7SDag-Erling Smørgrav 	}
527b5038d7SDag-Erling Smørgrav 
537b5038d7SDag-Erling Smørgrav 	desc = ldns_rr_descript(t);
547b5038d7SDag-Erling Smørgrav 
557b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields = LDNS_XMALLOC(ldns_rdf *, ldns_rr_descriptor_minimum(desc));
567b5038d7SDag-Erling Smørgrav         if(!rr->_rdata_fields) {
577b5038d7SDag-Erling Smørgrav                 LDNS_FREE(rr);
587b5038d7SDag-Erling Smørgrav                 return NULL;
597b5038d7SDag-Erling Smørgrav         }
607b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_descriptor_minimum(desc); i++) {
617b5038d7SDag-Erling Smørgrav 		rr->_rdata_fields[i] = NULL;
627b5038d7SDag-Erling Smørgrav 	}
637b5038d7SDag-Erling Smørgrav 
647b5038d7SDag-Erling Smørgrav 	ldns_rr_set_owner(rr, NULL);
657b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(rr, false);
667b5038d7SDag-Erling Smørgrav 	/* set the count to minimum */
677b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, ldns_rr_descriptor_minimum(desc));
687b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(rr, LDNS_RR_CLASS_IN);
697b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL);
707b5038d7SDag-Erling Smørgrav 	ldns_rr_set_type(rr, t);
717b5038d7SDag-Erling Smørgrav 	return rr;
727b5038d7SDag-Erling Smørgrav }
737b5038d7SDag-Erling Smørgrav 
747b5038d7SDag-Erling Smørgrav void
757b5038d7SDag-Erling Smørgrav ldns_rr_free(ldns_rr *rr)
767b5038d7SDag-Erling Smørgrav {
777b5038d7SDag-Erling Smørgrav 	size_t i;
787b5038d7SDag-Erling Smørgrav 	if (rr) {
797b5038d7SDag-Erling Smørgrav 		if (ldns_rr_owner(rr)) {
807b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(ldns_rr_owner(rr));
817b5038d7SDag-Erling Smørgrav 		}
827b5038d7SDag-Erling Smørgrav 		for (i = 0; i < ldns_rr_rd_count(rr); i++) {
837b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(ldns_rr_rdf(rr, i));
847b5038d7SDag-Erling Smørgrav 		}
857b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr->_rdata_fields);
867b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr);
877b5038d7SDag-Erling Smørgrav 	}
887b5038d7SDag-Erling Smørgrav }
897b5038d7SDag-Erling Smørgrav 
90*17d15b25SDag-Erling Smørgrav /* Syntactic sugar for ldns_rr_new_frm_str_internal */
91*17d15b25SDag-Erling Smørgrav INLINE bool
92*17d15b25SDag-Erling Smørgrav ldns_rdf_type_maybe_quoted(ldns_rdf_type rdf_type)
93*17d15b25SDag-Erling Smørgrav {
94*17d15b25SDag-Erling Smørgrav 	return  rdf_type == LDNS_RDF_TYPE_STR ||
95*17d15b25SDag-Erling Smørgrav 		rdf_type == LDNS_RDF_TYPE_LONG_STR;
96*17d15b25SDag-Erling Smørgrav }
97*17d15b25SDag-Erling Smørgrav 
987b5038d7SDag-Erling Smørgrav /*
997b5038d7SDag-Erling Smørgrav  * trailing spaces are allowed
1007b5038d7SDag-Erling Smørgrav  * leading spaces are not allowed
1017b5038d7SDag-Erling Smørgrav  * allow ttl to be optional
1027b5038d7SDag-Erling Smørgrav  * class is optional too
1037b5038d7SDag-Erling Smørgrav  * if ttl is missing, and default_ttl is 0, use DEF_TTL
1047b5038d7SDag-Erling Smørgrav  * allow ttl to be written as 1d3h
1057b5038d7SDag-Erling Smørgrav  * So the RR should look like. e.g.
1067b5038d7SDag-Erling Smørgrav  * miek.nl. 3600 IN MX 10 elektron.atoom.net
1077b5038d7SDag-Erling Smørgrav  * or
1087b5038d7SDag-Erling Smørgrav  * miek.nl. 1h IN MX 10 elektron.atoom.net
1097b5038d7SDag-Erling Smørgrav  * or
1107b5038d7SDag-Erling Smørgrav  * miek.nl. IN MX 10 elektron.atoom.net
1117b5038d7SDag-Erling Smørgrav  */
1127b5038d7SDag-Erling Smørgrav static ldns_status
1137b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
1147b5038d7SDag-Erling Smørgrav                              uint32_t default_ttl, ldns_rdf *origin,
1157b5038d7SDag-Erling Smørgrav 		             ldns_rdf **prev, bool question)
1167b5038d7SDag-Erling Smørgrav {
1177b5038d7SDag-Erling Smørgrav 	ldns_rr *new;
1187b5038d7SDag-Erling Smørgrav 	const ldns_rr_descriptor *desc;
1197b5038d7SDag-Erling Smørgrav 	ldns_rr_type rr_type;
1207b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr_buf = NULL;
1217b5038d7SDag-Erling Smørgrav 	ldns_buffer *rd_buf = NULL;
1227b5038d7SDag-Erling Smørgrav 	uint32_t ttl_val;
1237b5038d7SDag-Erling Smørgrav 	char  *owner = NULL;
1247b5038d7SDag-Erling Smørgrav 	char  *ttl = NULL;
1257b5038d7SDag-Erling Smørgrav 	ldns_rr_class clas_val;
1267b5038d7SDag-Erling Smørgrav 	char  *clas = NULL;
1277b5038d7SDag-Erling Smørgrav 	char  *type = NULL;
1287b5038d7SDag-Erling Smørgrav 	char  *rdata = NULL;
1297b5038d7SDag-Erling Smørgrav 	char  *rd = NULL;
130*17d15b25SDag-Erling Smørgrav 	char  *xtok = NULL; /* For RDF types with spaces (i.e. extra tokens) */
1317b5038d7SDag-Erling Smørgrav 	size_t rd_strlen;
1327b5038d7SDag-Erling Smørgrav 	const char *delimiters;
1337b5038d7SDag-Erling Smørgrav 	ssize_t c;
1347b5038d7SDag-Erling Smørgrav 	ldns_rdf *owner_dname;
1357b5038d7SDag-Erling Smørgrav         const char* endptr;
1367b5038d7SDag-Erling Smørgrav         int was_unknown_rr_format = 0;
1377b5038d7SDag-Erling Smørgrav 	ldns_status status = LDNS_STATUS_OK;
1387b5038d7SDag-Erling Smørgrav 
1397b5038d7SDag-Erling Smørgrav 	/* used for types with unknown number of rdatas */
1407b5038d7SDag-Erling Smørgrav 	bool done;
1417b5038d7SDag-Erling Smørgrav 	bool quoted;
1427b5038d7SDag-Erling Smørgrav 
1437b5038d7SDag-Erling Smørgrav 	ldns_rdf *r = NULL;
1447b5038d7SDag-Erling Smørgrav 	uint16_t r_cnt;
1457b5038d7SDag-Erling Smørgrav 	uint16_t r_min;
1467b5038d7SDag-Erling Smørgrav 	uint16_t r_max;
1477b5038d7SDag-Erling Smørgrav         size_t pre_data_pos;
1487b5038d7SDag-Erling Smørgrav 
149*17d15b25SDag-Erling Smørgrav 	uint16_t hex_data_size;
150*17d15b25SDag-Erling Smørgrav 	char *hex_data_str = NULL;
151*17d15b25SDag-Erling Smørgrav 	uint16_t cur_hex_data_size;
152*17d15b25SDag-Erling Smørgrav 	size_t hex_pos = 0;
153*17d15b25SDag-Erling Smørgrav 	uint8_t *hex_data = NULL;
154*17d15b25SDag-Erling Smørgrav 
1557b5038d7SDag-Erling Smørgrav 	new = ldns_rr_new();
1567b5038d7SDag-Erling Smørgrav 
1577b5038d7SDag-Erling Smørgrav 	owner = LDNS_XMALLOC(char, LDNS_MAX_DOMAINLEN + 1);
1587b5038d7SDag-Erling Smørgrav 	ttl = LDNS_XMALLOC(char, LDNS_TTL_DATALEN);
1597b5038d7SDag-Erling Smørgrav 	clas = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN);
1607b5038d7SDag-Erling Smørgrav 	rdata = LDNS_XMALLOC(char, LDNS_MAX_PACKETLEN + 1);
1617b5038d7SDag-Erling Smørgrav 	rr_buf = LDNS_MALLOC(ldns_buffer);
1627b5038d7SDag-Erling Smørgrav 	rd_buf = LDNS_MALLOC(ldns_buffer);
1637b5038d7SDag-Erling Smørgrav 	rd = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
164*17d15b25SDag-Erling Smørgrav 	xtok = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
165*17d15b25SDag-Erling Smørgrav 	if (rr_buf) {
166*17d15b25SDag-Erling Smørgrav 		rr_buf->_data = NULL;
167*17d15b25SDag-Erling Smørgrav 	}
168*17d15b25SDag-Erling Smørgrav 	if (rd_buf) {
169*17d15b25SDag-Erling Smørgrav 		rd_buf->_data = NULL;
170*17d15b25SDag-Erling Smørgrav 	}
171*17d15b25SDag-Erling Smørgrav 	if (!new || !owner || !ttl || !clas || !rdata ||
172*17d15b25SDag-Erling Smørgrav 			!rr_buf || !rd_buf || !rd || !xtok) {
173*17d15b25SDag-Erling Smørgrav 
174*17d15b25SDag-Erling Smørgrav 		goto memerror;
1757b5038d7SDag-Erling Smørgrav 	}
1767b5038d7SDag-Erling Smørgrav 
1777b5038d7SDag-Erling Smørgrav 	ldns_buffer_new_frm_data(rr_buf, (char*)str, strlen(str));
1787b5038d7SDag-Erling Smørgrav 
1797b5038d7SDag-Erling Smørgrav 	/* split the rr in its parts -1 signals trouble */
1807b5038d7SDag-Erling Smørgrav 	if (ldns_bget_token(rr_buf, owner, "\t\n ", LDNS_MAX_DOMAINLEN) == -1){
181*17d15b25SDag-Erling Smørgrav 
1827b5038d7SDag-Erling Smørgrav 		status = LDNS_STATUS_SYNTAX_ERR;
183*17d15b25SDag-Erling Smørgrav 		goto error;
1847b5038d7SDag-Erling Smørgrav 	}
1857b5038d7SDag-Erling Smørgrav 
1867b5038d7SDag-Erling Smørgrav 	if (ldns_bget_token(rr_buf, ttl, "\t\n ", LDNS_TTL_DATALEN) == -1) {
187*17d15b25SDag-Erling Smørgrav 
1887b5038d7SDag-Erling Smørgrav 		status = LDNS_STATUS_SYNTAX_TTL_ERR;
189*17d15b25SDag-Erling Smørgrav 		goto error;
1907b5038d7SDag-Erling Smørgrav 	}
1917b5038d7SDag-Erling Smørgrav 	ttl_val = (uint32_t) ldns_str2period(ttl, &endptr);
1927b5038d7SDag-Erling Smørgrav 
1937b5038d7SDag-Erling Smørgrav 	if (strlen(ttl) > 0 && !isdigit((int) ttl[0])) {
1947b5038d7SDag-Erling Smørgrav 		/* ah, it's not there or something */
1957b5038d7SDag-Erling Smørgrav 		if (default_ttl == 0) {
1967b5038d7SDag-Erling Smørgrav 			ttl_val = LDNS_DEFAULT_TTL;
1977b5038d7SDag-Erling Smørgrav 		} else {
1987b5038d7SDag-Erling Smørgrav 			ttl_val = default_ttl;
1997b5038d7SDag-Erling Smørgrav 		}
2007b5038d7SDag-Erling Smørgrav 		/* we not ASSUMING the TTL is missing and that
2017b5038d7SDag-Erling Smørgrav 		 * the rest of the RR is still there. That is
2027b5038d7SDag-Erling Smørgrav 		 * CLASS TYPE RDATA
2037b5038d7SDag-Erling Smørgrav 		 * so ttl value we read is actually the class
2047b5038d7SDag-Erling Smørgrav 		 */
2057b5038d7SDag-Erling Smørgrav 		clas_val = ldns_get_rr_class_by_name(ttl);
2067b5038d7SDag-Erling Smørgrav 		/* class can be left out too, assume IN, current
2077b5038d7SDag-Erling Smørgrav 		 * token must be type
2087b5038d7SDag-Erling Smørgrav 		 */
2097b5038d7SDag-Erling Smørgrav 		if (clas_val == 0) {
2107b5038d7SDag-Erling Smørgrav 			clas_val = LDNS_RR_CLASS_IN;
2117b5038d7SDag-Erling Smørgrav 			type = LDNS_XMALLOC(char, strlen(ttl) + 1);
2127b5038d7SDag-Erling Smørgrav 			if (!type) {
213*17d15b25SDag-Erling Smørgrav 				goto memerror;
2147b5038d7SDag-Erling Smørgrav 			}
2157b5038d7SDag-Erling Smørgrav 			strncpy(type, ttl, strlen(ttl) + 1);
2167b5038d7SDag-Erling Smørgrav 		}
2177b5038d7SDag-Erling Smørgrav 	} else {
218*17d15b25SDag-Erling Smørgrav 		if (-1 == ldns_bget_token(
219*17d15b25SDag-Erling Smørgrav 				rr_buf, clas, "\t\n ", LDNS_SYNTAX_DATALEN)) {
220*17d15b25SDag-Erling Smørgrav 
2217b5038d7SDag-Erling Smørgrav 			status = LDNS_STATUS_SYNTAX_CLASS_ERR;
222*17d15b25SDag-Erling Smørgrav 			goto error;
2237b5038d7SDag-Erling Smørgrav 		}
2247b5038d7SDag-Erling Smørgrav 		clas_val = ldns_get_rr_class_by_name(clas);
2257b5038d7SDag-Erling Smørgrav 		/* class can be left out too, assume IN, current
2267b5038d7SDag-Erling Smørgrav 		 * token must be type
2277b5038d7SDag-Erling Smørgrav 		 */
2287b5038d7SDag-Erling Smørgrav 		if (clas_val == 0) {
2297b5038d7SDag-Erling Smørgrav 			clas_val = LDNS_RR_CLASS_IN;
2307b5038d7SDag-Erling Smørgrav 			type = LDNS_XMALLOC(char, strlen(clas) + 1);
2317b5038d7SDag-Erling Smørgrav 			if (!type) {
232*17d15b25SDag-Erling Smørgrav 				goto memerror;
2337b5038d7SDag-Erling Smørgrav 			}
2347b5038d7SDag-Erling Smørgrav 			strncpy(type, clas, strlen(clas) + 1);
2357b5038d7SDag-Erling Smørgrav 		}
2367b5038d7SDag-Erling Smørgrav 	}
2377b5038d7SDag-Erling Smørgrav 	/* the rest should still be waiting for us */
2387b5038d7SDag-Erling Smørgrav 
2397b5038d7SDag-Erling Smørgrav 	if (!type) {
2407b5038d7SDag-Erling Smørgrav 		type = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN);
2417b5038d7SDag-Erling Smørgrav 		if (!type) {
242*17d15b25SDag-Erling Smørgrav 			goto memerror;
2437b5038d7SDag-Erling Smørgrav 		}
244*17d15b25SDag-Erling Smørgrav 		if (-1 == ldns_bget_token(
245*17d15b25SDag-Erling Smørgrav 				rr_buf, type, "\t\n ", LDNS_SYNTAX_DATALEN)) {
246*17d15b25SDag-Erling Smørgrav 
2477b5038d7SDag-Erling Smørgrav 			status = LDNS_STATUS_SYNTAX_TYPE_ERR;
248*17d15b25SDag-Erling Smørgrav 			goto error;
2497b5038d7SDag-Erling Smørgrav 		}
2507b5038d7SDag-Erling Smørgrav 	}
2517b5038d7SDag-Erling Smørgrav 
2527b5038d7SDag-Erling Smørgrav 	if (ldns_bget_token(rr_buf, rdata, "\0", LDNS_MAX_PACKETLEN) == -1) {
2537b5038d7SDag-Erling Smørgrav 		/* apparently we are done, and it's only a question RR
2547b5038d7SDag-Erling Smørgrav 		 * so do not set status and go to ldnserror here
2557b5038d7SDag-Erling Smørgrav 		 */
2567b5038d7SDag-Erling Smørgrav 	}
2577b5038d7SDag-Erling Smørgrav 	ldns_buffer_new_frm_data(rd_buf, rdata, strlen(rdata));
2587b5038d7SDag-Erling Smørgrav 
2597b5038d7SDag-Erling Smørgrav 	if (strlen(owner) <= 1 && strncmp(owner, "@", 1) == 0) {
2607b5038d7SDag-Erling Smørgrav 		if (origin) {
2617b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, ldns_rdf_clone(origin));
2627b5038d7SDag-Erling Smørgrav 		} else if (prev && *prev) {
2637b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, ldns_rdf_clone(*prev));
2647b5038d7SDag-Erling Smørgrav 		} else {
2657b5038d7SDag-Erling Smørgrav 			/* default to root */
2667b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, ldns_dname_new_frm_str("."));
2677b5038d7SDag-Erling Smørgrav 		}
2687b5038d7SDag-Erling Smørgrav 
2697b5038d7SDag-Erling Smørgrav 		/* @ also overrides prev */
2707b5038d7SDag-Erling Smørgrav 		if (prev) {
2717b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(*prev);
2727b5038d7SDag-Erling Smørgrav 			*prev = ldns_rdf_clone(ldns_rr_owner(new));
2737b5038d7SDag-Erling Smørgrav 			if (!*prev) {
274*17d15b25SDag-Erling Smørgrav 				goto memerror;
2757b5038d7SDag-Erling Smørgrav 			}
2767b5038d7SDag-Erling Smørgrav 		}
2777b5038d7SDag-Erling Smørgrav 	} else {
2787b5038d7SDag-Erling Smørgrav 		if (strlen(owner) == 0) {
2797b5038d7SDag-Erling Smørgrav 			/* no ownername was given, try prev, if that fails
2807b5038d7SDag-Erling Smørgrav 			 * origin, else default to root */
2817b5038d7SDag-Erling Smørgrav 			if (prev && *prev) {
2827b5038d7SDag-Erling Smørgrav 				ldns_rr_set_owner(new, ldns_rdf_clone(*prev));
2837b5038d7SDag-Erling Smørgrav 			} else if (origin) {
2847b5038d7SDag-Erling Smørgrav 				ldns_rr_set_owner(new, ldns_rdf_clone(origin));
2857b5038d7SDag-Erling Smørgrav 			} else {
286*17d15b25SDag-Erling Smørgrav 				ldns_rr_set_owner(new,
287*17d15b25SDag-Erling Smørgrav 						ldns_dname_new_frm_str("."));
2887b5038d7SDag-Erling Smørgrav 			}
2897b5038d7SDag-Erling Smørgrav 			if(!ldns_rr_owner(new)) {
290*17d15b25SDag-Erling Smørgrav 				goto memerror;
2917b5038d7SDag-Erling Smørgrav 			}
2927b5038d7SDag-Erling Smørgrav 		} else {
2937b5038d7SDag-Erling Smørgrav 			owner_dname = ldns_dname_new_frm_str(owner);
2947b5038d7SDag-Erling Smørgrav 			if (!owner_dname) {
2957b5038d7SDag-Erling Smørgrav 				status = LDNS_STATUS_SYNTAX_ERR;
296*17d15b25SDag-Erling Smørgrav 				goto error;
2977b5038d7SDag-Erling Smørgrav 			}
2987b5038d7SDag-Erling Smørgrav 
2997b5038d7SDag-Erling Smørgrav 			ldns_rr_set_owner(new, owner_dname);
3007b5038d7SDag-Erling Smørgrav 			if (!ldns_dname_str_absolute(owner) && origin) {
301*17d15b25SDag-Erling Smørgrav 				if(ldns_dname_cat(ldns_rr_owner(new), origin)
302*17d15b25SDag-Erling Smørgrav 						!= LDNS_STATUS_OK) {
303*17d15b25SDag-Erling Smørgrav 
3047b5038d7SDag-Erling Smørgrav 					status = LDNS_STATUS_SYNTAX_ERR;
305*17d15b25SDag-Erling Smørgrav 					goto error;
3067b5038d7SDag-Erling Smørgrav 				}
3077b5038d7SDag-Erling Smørgrav 			}
3087b5038d7SDag-Erling Smørgrav 			if (prev) {
3097b5038d7SDag-Erling Smørgrav 				ldns_rdf_deep_free(*prev);
3107b5038d7SDag-Erling Smørgrav 				*prev = ldns_rdf_clone(ldns_rr_owner(new));
3117b5038d7SDag-Erling Smørgrav 				if (!*prev) {
312*17d15b25SDag-Erling Smørgrav 					goto error;
3137b5038d7SDag-Erling Smørgrav 				}
3147b5038d7SDag-Erling Smørgrav 			}
3157b5038d7SDag-Erling Smørgrav 		}
3167b5038d7SDag-Erling Smørgrav 	}
3177b5038d7SDag-Erling Smørgrav 	LDNS_FREE(owner);
3187b5038d7SDag-Erling Smørgrav 
3197b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(new, question);
3207b5038d7SDag-Erling Smørgrav 
3217b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(new, ttl_val);
3227b5038d7SDag-Erling Smørgrav 	LDNS_FREE(ttl);
3237b5038d7SDag-Erling Smørgrav 
3247b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(new, clas_val);
3257b5038d7SDag-Erling Smørgrav 	LDNS_FREE(clas);
3267b5038d7SDag-Erling Smørgrav 
3277b5038d7SDag-Erling Smørgrav 	rr_type = ldns_get_rr_type_by_name(type);
3287b5038d7SDag-Erling Smørgrav 	LDNS_FREE(type);
3297b5038d7SDag-Erling Smørgrav 
3307b5038d7SDag-Erling Smørgrav 	desc = ldns_rr_descript((uint16_t)rr_type);
3317b5038d7SDag-Erling Smørgrav 	ldns_rr_set_type(new, rr_type);
3327b5038d7SDag-Erling Smørgrav 	if (desc) {
3337b5038d7SDag-Erling Smørgrav 		/* only the rdata remains */
3347b5038d7SDag-Erling Smørgrav 		r_max = ldns_rr_descriptor_maximum(desc);
3357b5038d7SDag-Erling Smørgrav 		r_min = ldns_rr_descriptor_minimum(desc);
3367b5038d7SDag-Erling Smørgrav 	} else {
3377b5038d7SDag-Erling Smørgrav 		r_min = 0;
3387b5038d7SDag-Erling Smørgrav 		r_max = 1;
3397b5038d7SDag-Erling Smørgrav 	}
3407b5038d7SDag-Erling Smørgrav 
341*17d15b25SDag-Erling Smørgrav 	for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
3427b5038d7SDag-Erling Smørgrav 		quoted = false;
343*17d15b25SDag-Erling Smørgrav 
344*17d15b25SDag-Erling Smørgrav 		switch (ldns_rr_descriptor_field_type(desc, r_cnt)) {
345*17d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_B64        :
346*17d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_HEX        : /* These rdf types may con- */
347*17d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_LOC        : /* tain whitespace, only if */
348*17d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_WKS        : /* it is the last rd field. */
349*17d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_IPSECKEY   :
350*17d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_NSEC       :	if (r_cnt == r_max - 1) {
3517b5038d7SDag-Erling Smørgrav 							delimiters = "\n\t";
352*17d15b25SDag-Erling Smørgrav 							break;
353*17d15b25SDag-Erling Smørgrav 						}
354*17d15b25SDag-Erling Smørgrav 		default                       :	delimiters = "\n\t ";
3557b5038d7SDag-Erling Smørgrav 		}
3567b5038d7SDag-Erling Smørgrav 
357*17d15b25SDag-Erling Smørgrav 		if (ldns_rdf_type_maybe_quoted(
358*17d15b25SDag-Erling Smørgrav 				ldns_rr_descriptor_field_type(
359*17d15b25SDag-Erling Smørgrav 				desc, r_cnt)) &&
3607b5038d7SDag-Erling Smørgrav 				ldns_buffer_remaining(rd_buf) > 0){
361*17d15b25SDag-Erling Smørgrav 
3627b5038d7SDag-Erling Smørgrav 			/* skip spaces */
3637b5038d7SDag-Erling Smørgrav 			while (*(ldns_buffer_current(rd_buf)) == ' ') {
3647b5038d7SDag-Erling Smørgrav 				ldns_buffer_skip(rd_buf, 1);
3657b5038d7SDag-Erling Smørgrav 			}
3667b5038d7SDag-Erling Smørgrav 
3677b5038d7SDag-Erling Smørgrav 			if (*(ldns_buffer_current(rd_buf)) == '\"') {
3687b5038d7SDag-Erling Smørgrav 				delimiters = "\"\0";
3697b5038d7SDag-Erling Smørgrav 				ldns_buffer_skip(rd_buf, 1);
3707b5038d7SDag-Erling Smørgrav 				quoted = true;
3717b5038d7SDag-Erling Smørgrav 			}
3727b5038d7SDag-Erling Smørgrav 		}
3737b5038d7SDag-Erling Smørgrav 
374*17d15b25SDag-Erling Smørgrav 		/* because number of fields can be variable, we can't rely on
375*17d15b25SDag-Erling Smørgrav 		 * _maximum() only
376*17d15b25SDag-Erling Smørgrav 		 */
377*17d15b25SDag-Erling Smørgrav 
3787b5038d7SDag-Erling Smørgrav 		/* skip spaces */
379*17d15b25SDag-Erling Smørgrav 		while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
380*17d15b25SDag-Erling Smørgrav 				&& *(ldns_buffer_current(rd_buf)) == ' '
381*17d15b25SDag-Erling Smørgrav 				&& !quoted) {
382*17d15b25SDag-Erling Smørgrav 
3837b5038d7SDag-Erling Smørgrav 			ldns_buffer_skip(rd_buf, 1);
3847b5038d7SDag-Erling Smørgrav 		}
3857b5038d7SDag-Erling Smørgrav 
3867b5038d7SDag-Erling Smørgrav 		pre_data_pos = ldns_buffer_position(rd_buf);
387*17d15b25SDag-Erling Smørgrav 		if (-1 == (c = ldns_bget_token(
388*17d15b25SDag-Erling Smørgrav 				rd_buf, rd, delimiters, LDNS_MAX_RDFLEN))) {
389*17d15b25SDag-Erling Smørgrav 
390*17d15b25SDag-Erling Smørgrav 			done = true;
391*17d15b25SDag-Erling Smørgrav 			break;
392*17d15b25SDag-Erling Smørgrav 		}
393*17d15b25SDag-Erling Smørgrav 		/* hmmz, rfc3597 specifies that any type can be represented
394*17d15b25SDag-Erling Smørgrav 		 * with \# method, which can contain spaces...
3957b5038d7SDag-Erling Smørgrav 		 * it does specify size though...
3967b5038d7SDag-Erling Smørgrav 		 */
3977b5038d7SDag-Erling Smørgrav 		rd_strlen = strlen(rd);
3987b5038d7SDag-Erling Smørgrav 
3997b5038d7SDag-Erling Smørgrav 		/* unknown RR data */
400*17d15b25SDag-Erling Smørgrav 		if (strncmp(rd, "\\#", 2) == 0 && !quoted &&
401*17d15b25SDag-Erling Smørgrav 				(rd_strlen == 2 || rd[2]==' ')) {
4027b5038d7SDag-Erling Smørgrav 
4037b5038d7SDag-Erling Smørgrav 			was_unknown_rr_format = 1;
404*17d15b25SDag-Erling Smørgrav 			/* go back to before \#
405*17d15b25SDag-Erling Smørgrav 			 * and skip it while setting delimiters better
406*17d15b25SDag-Erling Smørgrav 			 */
4077b5038d7SDag-Erling Smørgrav 			ldns_buffer_set_position(rd_buf, pre_data_pos);
4087b5038d7SDag-Erling Smørgrav 			delimiters = "\n\t ";
409*17d15b25SDag-Erling Smørgrav 			(void)ldns_bget_token(rd_buf, rd,
410*17d15b25SDag-Erling Smørgrav 					delimiters, LDNS_MAX_RDFLEN);
4117b5038d7SDag-Erling Smørgrav 			/* read rdata octet length */
412*17d15b25SDag-Erling Smørgrav 			c = ldns_bget_token(rd_buf, rd,
413*17d15b25SDag-Erling Smørgrav 					delimiters, LDNS_MAX_RDFLEN);
4147b5038d7SDag-Erling Smørgrav 			if (c == -1) {
4157b5038d7SDag-Erling Smørgrav 				/* something goes very wrong here */
416*17d15b25SDag-Erling Smørgrav 				status = LDNS_STATUS_SYNTAX_RDATA_ERR;
417*17d15b25SDag-Erling Smørgrav 				goto error;
4187b5038d7SDag-Erling Smørgrav 			}
4197b5038d7SDag-Erling Smørgrav 			hex_data_size = (uint16_t) atoi(rd);
420*17d15b25SDag-Erling Smørgrav 			/* copy hex chars into hex str (2 chars per byte) */
4217b5038d7SDag-Erling Smørgrav 			hex_data_str = LDNS_XMALLOC(char, 2*hex_data_size + 1);
4227b5038d7SDag-Erling Smørgrav 			if (!hex_data_str) {
4237b5038d7SDag-Erling Smørgrav 				/* malloc error */
424*17d15b25SDag-Erling Smørgrav 				goto memerror;
4257b5038d7SDag-Erling Smørgrav 			}
4267b5038d7SDag-Erling Smørgrav 			cur_hex_data_size = 0;
4277b5038d7SDag-Erling Smørgrav 			while(cur_hex_data_size < 2 * hex_data_size) {
428*17d15b25SDag-Erling Smørgrav 				c = ldns_bget_token(rd_buf, rd,
429*17d15b25SDag-Erling Smørgrav 						delimiters, LDNS_MAX_RDFLEN);
4307b5038d7SDag-Erling Smørgrav 				if (c != -1) {
4317b5038d7SDag-Erling Smørgrav 					rd_strlen = strlen(rd);
4327b5038d7SDag-Erling Smørgrav 				}
433*17d15b25SDag-Erling Smørgrav 				if (c == -1 ||
434*17d15b25SDag-Erling Smørgrav 				    (size_t)cur_hex_data_size + rd_strlen >
435*17d15b25SDag-Erling Smørgrav 				    2 * (size_t)hex_data_size) {
436*17d15b25SDag-Erling Smørgrav 
437*17d15b25SDag-Erling Smørgrav 					status = LDNS_STATUS_SYNTAX_RDATA_ERR;
438*17d15b25SDag-Erling Smørgrav 					goto error;
4397b5038d7SDag-Erling Smørgrav 				}
440*17d15b25SDag-Erling Smørgrav 				strncpy(hex_data_str + cur_hex_data_size, rd,
441*17d15b25SDag-Erling Smørgrav 						rd_strlen);
442*17d15b25SDag-Erling Smørgrav 
4437b5038d7SDag-Erling Smørgrav 				cur_hex_data_size += rd_strlen;
4447b5038d7SDag-Erling Smørgrav 			}
4457b5038d7SDag-Erling Smørgrav 			hex_data_str[cur_hex_data_size] = '\0';
4467b5038d7SDag-Erling Smørgrav 
4477b5038d7SDag-Erling Smørgrav 			/* correct the rdf type */
4487b5038d7SDag-Erling Smørgrav 			/* if *we* know the type, interpret it as wireformat */
4497b5038d7SDag-Erling Smørgrav 			if (desc) {
450*17d15b25SDag-Erling Smørgrav 				hex_pos = 0;
451*17d15b25SDag-Erling Smørgrav 				hex_data =
452*17d15b25SDag-Erling Smørgrav 					LDNS_XMALLOC(uint8_t, hex_data_size+2);
453*17d15b25SDag-Erling Smørgrav 
4547b5038d7SDag-Erling Smørgrav 				if (!hex_data) {
455*17d15b25SDag-Erling Smørgrav 					goto memerror;
4567b5038d7SDag-Erling Smørgrav 				}
4577b5038d7SDag-Erling Smørgrav 				ldns_write_uint16(hex_data, hex_data_size);
458*17d15b25SDag-Erling Smørgrav 				ldns_hexstring_to_data(
459*17d15b25SDag-Erling Smørgrav 						hex_data + 2, hex_data_str);
460*17d15b25SDag-Erling Smørgrav 				status = ldns_wire2rdf(new, hex_data,
4617b5038d7SDag-Erling Smørgrav 						hex_data_size + 2, &hex_pos);
462*17d15b25SDag-Erling Smørgrav 				if (status != LDNS_STATUS_OK) {
463*17d15b25SDag-Erling Smørgrav 					goto error;
4647b5038d7SDag-Erling Smørgrav 				}
4657b5038d7SDag-Erling Smørgrav 				LDNS_FREE(hex_data);
4667b5038d7SDag-Erling Smørgrav 			} else {
467*17d15b25SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_HEX,
468*17d15b25SDag-Erling Smørgrav 						hex_data_str);
4697b5038d7SDag-Erling Smørgrav 				if (!r) {
470*17d15b25SDag-Erling Smørgrav 					goto memerror;
4717b5038d7SDag-Erling Smørgrav 				}
4727b5038d7SDag-Erling Smørgrav 				ldns_rdf_set_type(r, LDNS_RDF_TYPE_UNKNOWN);
4737b5038d7SDag-Erling Smørgrav 				if (!ldns_rr_push_rdf(new, r)) {
474*17d15b25SDag-Erling Smørgrav 					goto memerror;
4757b5038d7SDag-Erling Smørgrav 				}
4767b5038d7SDag-Erling Smørgrav 			}
4777b5038d7SDag-Erling Smørgrav 			LDNS_FREE(hex_data_str);
478*17d15b25SDag-Erling Smørgrav 
4797b5038d7SDag-Erling Smørgrav 		} else {
4807b5038d7SDag-Erling Smørgrav 			/* Normal RR */
4817b5038d7SDag-Erling Smørgrav 			switch(ldns_rr_descriptor_field_type(desc, r_cnt)) {
482*17d15b25SDag-Erling Smørgrav 
4837b5038d7SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_HEX:
4847b5038d7SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_B64:
485*17d15b25SDag-Erling Smørgrav 				/* When this is the last rdata field, then the
486*17d15b25SDag-Erling Smørgrav 				 * rest should be read in (cause then these
487*17d15b25SDag-Erling Smørgrav 				 * rdf types may contain spaces).
488*17d15b25SDag-Erling Smørgrav 				 */
489*17d15b25SDag-Erling Smørgrav 				if (r_cnt == r_max - 1) {
490*17d15b25SDag-Erling Smørgrav 					c = ldns_bget_token(rd_buf, xtok,
491*17d15b25SDag-Erling Smørgrav 							"\n", LDNS_MAX_RDFLEN);
492*17d15b25SDag-Erling Smørgrav 					if (c != -1) {
493*17d15b25SDag-Erling Smørgrav 						(void) strncat(rd, xtok,
494*17d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
495*17d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
496*17d15b25SDag-Erling Smørgrav 					}
4977b5038d7SDag-Erling Smørgrav 				}
4987b5038d7SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
499*17d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
500*17d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
5017b5038d7SDag-Erling Smørgrav 				break;
502*17d15b25SDag-Erling Smørgrav 
503*17d15b25SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_HIP:
504*17d15b25SDag-Erling Smørgrav 				/*
505*17d15b25SDag-Erling Smørgrav 				 * In presentation format this RDATA type has
506*17d15b25SDag-Erling Smørgrav 				 * three tokens: An algorithm byte, then a
507*17d15b25SDag-Erling Smørgrav 				 * variable length HIT (in hexbytes) and then
508*17d15b25SDag-Erling Smørgrav 				 * a variable length Public Key (in base64).
509*17d15b25SDag-Erling Smørgrav 				 *
510*17d15b25SDag-Erling Smørgrav 				 * We have just read the algorithm, so we need
511*17d15b25SDag-Erling Smørgrav 				 * two more tokens: HIT and Public Key.
512*17d15b25SDag-Erling Smørgrav 				 */
513*17d15b25SDag-Erling Smørgrav 				do {
514*17d15b25SDag-Erling Smørgrav 					/* Read and append HIT */
515*17d15b25SDag-Erling Smørgrav 					if (ldns_bget_token(rd_buf,
516*17d15b25SDag-Erling Smørgrav 							xtok, delimiters,
517*17d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN) == -1)
518*17d15b25SDag-Erling Smørgrav 						break;
519*17d15b25SDag-Erling Smørgrav 
520*17d15b25SDag-Erling Smørgrav 					(void) strncat(rd, " ",
521*17d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
522*17d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
523*17d15b25SDag-Erling Smørgrav 					(void) strncat(rd, xtok,
524*17d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
525*17d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
526*17d15b25SDag-Erling Smørgrav 
527*17d15b25SDag-Erling Smørgrav 					/* Read and append Public Key*/
528*17d15b25SDag-Erling Smørgrav 					if (ldns_bget_token(rd_buf,
529*17d15b25SDag-Erling Smørgrav 							xtok, delimiters,
530*17d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN) == -1)
531*17d15b25SDag-Erling Smørgrav 						break;
532*17d15b25SDag-Erling Smørgrav 
533*17d15b25SDag-Erling Smørgrav 					(void) strncat(rd, " ",
534*17d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
535*17d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
536*17d15b25SDag-Erling Smørgrav 					(void) strncat(rd, xtok,
537*17d15b25SDag-Erling Smørgrav 							LDNS_MAX_RDFLEN -
538*17d15b25SDag-Erling Smørgrav 							strlen(rd) - 1);
539*17d15b25SDag-Erling Smørgrav 				} while (false);
540*17d15b25SDag-Erling Smørgrav 
541*17d15b25SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
542*17d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
543*17d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
544*17d15b25SDag-Erling Smørgrav 				break;
545*17d15b25SDag-Erling Smørgrav 
5467b5038d7SDag-Erling Smørgrav 			case LDNS_RDF_TYPE_DNAME:
5477b5038d7SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
548*17d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
549*17d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
5507b5038d7SDag-Erling Smørgrav 
551*17d15b25SDag-Erling Smørgrav 				/* check if the origin should be used
552*17d15b25SDag-Erling Smørgrav 				 * or concatenated
553*17d15b25SDag-Erling Smørgrav 				 */
554*17d15b25SDag-Erling Smørgrav 				if (r && ldns_rdf_size(r) > 1 &&
555*17d15b25SDag-Erling Smørgrav 						ldns_rdf_data(r)[0] == 1 &&
556*17d15b25SDag-Erling Smørgrav 						ldns_rdf_data(r)[1] == '@') {
557*17d15b25SDag-Erling Smørgrav 
5587b5038d7SDag-Erling Smørgrav 					ldns_rdf_deep_free(r);
559*17d15b25SDag-Erling Smørgrav 
560*17d15b25SDag-Erling Smørgrav 					r = origin ? ldns_rdf_clone(origin)
561*17d15b25SDag-Erling Smørgrav 
562*17d15b25SDag-Erling Smørgrav 					  : ( rr_type == LDNS_RR_TYPE_SOA ?
563*17d15b25SDag-Erling Smørgrav 
564*17d15b25SDag-Erling Smørgrav 					      ldns_rdf_clone(
565*17d15b25SDag-Erling Smørgrav 						      ldns_rr_owner(new))
566*17d15b25SDag-Erling Smørgrav 
567*17d15b25SDag-Erling Smørgrav 					    : ldns_rdf_new_frm_str(
568*17d15b25SDag-Erling Smørgrav 						    LDNS_RDF_TYPE_DNAME, ".")
569*17d15b25SDag-Erling Smørgrav 					    );
570*17d15b25SDag-Erling Smørgrav 
571*17d15b25SDag-Erling Smørgrav 				} else if (r && rd_strlen >= 1 && origin &&
572*17d15b25SDag-Erling Smørgrav 						!ldns_dname_str_absolute(rd)) {
573*17d15b25SDag-Erling Smørgrav 
574*17d15b25SDag-Erling Smørgrav 					status = ldns_dname_cat(r, origin);
575*17d15b25SDag-Erling Smørgrav 					if (status != LDNS_STATUS_OK) {
576*17d15b25SDag-Erling Smørgrav 						goto error;
5777b5038d7SDag-Erling Smørgrav 					}
5787b5038d7SDag-Erling Smørgrav 				}
5797b5038d7SDag-Erling Smørgrav 				break;
5807b5038d7SDag-Erling Smørgrav 			default:
5817b5038d7SDag-Erling Smørgrav 				r = ldns_rdf_new_frm_str(
582*17d15b25SDag-Erling Smørgrav 						ldns_rr_descriptor_field_type(
583*17d15b25SDag-Erling Smørgrav 							desc, r_cnt), rd);
5847b5038d7SDag-Erling Smørgrav 				break;
5857b5038d7SDag-Erling Smørgrav 			}
586*17d15b25SDag-Erling Smørgrav 			if (!r) {
587*17d15b25SDag-Erling Smørgrav 				status = LDNS_STATUS_SYNTAX_RDATA_ERR;
588*17d15b25SDag-Erling Smørgrav 				goto error;
5897b5038d7SDag-Erling Smørgrav 			}
590*17d15b25SDag-Erling Smørgrav 			ldns_rr_push_rdf(new, r);
5917b5038d7SDag-Erling Smørgrav 		}
5927b5038d7SDag-Erling Smørgrav 		if (quoted) {
5937b5038d7SDag-Erling Smørgrav 			if (ldns_buffer_available(rd_buf, 1)) {
5947b5038d7SDag-Erling Smørgrav 				ldns_buffer_skip(rd_buf, 1);
5957b5038d7SDag-Erling Smørgrav 			} else {
5967b5038d7SDag-Erling Smørgrav 				done = true;
5977b5038d7SDag-Erling Smørgrav 			}
5987b5038d7SDag-Erling Smørgrav 		}
599*17d15b25SDag-Erling Smørgrav 
600*17d15b25SDag-Erling Smørgrav 	} /* for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) */
6017b5038d7SDag-Erling Smørgrav 	LDNS_FREE(rd);
602*17d15b25SDag-Erling Smørgrav 	LDNS_FREE(xtok);
6037b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(rd_buf);
6047b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(rr_buf);
6057b5038d7SDag-Erling Smørgrav 	LDNS_FREE(rdata);
6067b5038d7SDag-Erling Smørgrav 
607*17d15b25SDag-Erling Smørgrav 	if (!question && desc && !was_unknown_rr_format &&
608*17d15b25SDag-Erling Smørgrav 			ldns_rr_rd_count(new) < r_min) {
609*17d15b25SDag-Erling Smørgrav 
6107b5038d7SDag-Erling Smørgrav 		ldns_rr_free(new);
6117b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
6127b5038d7SDag-Erling Smørgrav 	}
6137b5038d7SDag-Erling Smørgrav 
6147b5038d7SDag-Erling Smørgrav 	if (newrr) {
6157b5038d7SDag-Erling Smørgrav 		*newrr = new;
6162787e39aSDag-Erling Smørgrav 	} else {
6172787e39aSDag-Erling Smørgrav 		/* Maybe the caller just wanted to see if it would parse? */
6182787e39aSDag-Erling Smørgrav 		ldns_rr_free(new);
6197b5038d7SDag-Erling Smørgrav 	}
6207b5038d7SDag-Erling Smørgrav 	return LDNS_STATUS_OK;
6217b5038d7SDag-Erling Smørgrav 
622*17d15b25SDag-Erling Smørgrav memerror:
623*17d15b25SDag-Erling Smørgrav 	status = LDNS_STATUS_MEM_ERR;
624*17d15b25SDag-Erling Smørgrav error:
625*17d15b25SDag-Erling Smørgrav 	if (rd_buf && rd_buf->_data) {
626*17d15b25SDag-Erling Smørgrav 		ldns_buffer_free(rd_buf);
627*17d15b25SDag-Erling Smørgrav 	} else {
628*17d15b25SDag-Erling Smørgrav 		LDNS_FREE(rd_buf);
629*17d15b25SDag-Erling Smørgrav 	}
630*17d15b25SDag-Erling Smørgrav 	if (rr_buf && rr_buf->_data) {
631*17d15b25SDag-Erling Smørgrav 		ldns_buffer_free(rr_buf);
632*17d15b25SDag-Erling Smørgrav 	} else {
633*17d15b25SDag-Erling Smørgrav 		LDNS_FREE(rr_buf);
634*17d15b25SDag-Erling Smørgrav 	}
6357b5038d7SDag-Erling Smørgrav 	LDNS_FREE(type);
6367b5038d7SDag-Erling Smørgrav 	LDNS_FREE(owner);
6377b5038d7SDag-Erling Smørgrav 	LDNS_FREE(ttl);
6387b5038d7SDag-Erling Smørgrav 	LDNS_FREE(clas);
639*17d15b25SDag-Erling Smørgrav 	LDNS_FREE(hex_data);
640*17d15b25SDag-Erling Smørgrav 	LDNS_FREE(hex_data_str);
641*17d15b25SDag-Erling Smørgrav 	LDNS_FREE(xtok);
6427b5038d7SDag-Erling Smørgrav 	LDNS_FREE(rd);
643*17d15b25SDag-Erling Smørgrav 	LDNS_FREE(rdata);
6447b5038d7SDag-Erling Smørgrav 	ldns_rr_free(new);
6457b5038d7SDag-Erling Smørgrav 	return status;
6467b5038d7SDag-Erling Smørgrav }
6477b5038d7SDag-Erling Smørgrav 
6487b5038d7SDag-Erling Smørgrav ldns_status
6497b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_str(ldns_rr **newrr, const char *str,
6507b5038d7SDag-Erling Smørgrav                     uint32_t default_ttl, ldns_rdf *origin,
6517b5038d7SDag-Erling Smørgrav 		    ldns_rdf **prev)
6527b5038d7SDag-Erling Smørgrav {
6537b5038d7SDag-Erling Smørgrav 	return ldns_rr_new_frm_str_internal(newrr,
6547b5038d7SDag-Erling Smørgrav 	                                    str,
6557b5038d7SDag-Erling Smørgrav 	                                    default_ttl,
6567b5038d7SDag-Erling Smørgrav 	                                    origin,
6577b5038d7SDag-Erling Smørgrav 	                                    prev,
6587b5038d7SDag-Erling Smørgrav 	                                    false);
6597b5038d7SDag-Erling Smørgrav }
6607b5038d7SDag-Erling Smørgrav 
6617b5038d7SDag-Erling Smørgrav ldns_status
6627b5038d7SDag-Erling Smørgrav ldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str,
6637b5038d7SDag-Erling Smørgrav                              ldns_rdf *origin, ldns_rdf **prev)
6647b5038d7SDag-Erling Smørgrav {
6657b5038d7SDag-Erling Smørgrav 	return ldns_rr_new_frm_str_internal(newrr,
6667b5038d7SDag-Erling Smørgrav 	                                    str,
6677b5038d7SDag-Erling Smørgrav 	                                    0,
6687b5038d7SDag-Erling Smørgrav 	                                    origin,
6697b5038d7SDag-Erling Smørgrav 	                                    prev,
6707b5038d7SDag-Erling Smørgrav 	                                    true);
6717b5038d7SDag-Erling Smørgrav }
6727b5038d7SDag-Erling Smørgrav 
6737b5038d7SDag-Erling Smørgrav ldns_status
6747b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev)
6757b5038d7SDag-Erling Smørgrav {
6767b5038d7SDag-Erling Smørgrav 	return ldns_rr_new_frm_fp_l(newrr, fp, ttl, origin, prev, NULL);
6777b5038d7SDag-Erling Smørgrav }
6787b5038d7SDag-Erling Smørgrav 
6797b5038d7SDag-Erling Smørgrav ldns_status
6807b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr)
6817b5038d7SDag-Erling Smørgrav {
6827b5038d7SDag-Erling Smørgrav 	char *line;
6837b5038d7SDag-Erling Smørgrav 	const char *endptr;  /* unused */
6847b5038d7SDag-Erling Smørgrav 	ldns_rr *rr;
6857b5038d7SDag-Erling Smørgrav 	uint32_t ttl;
6867b5038d7SDag-Erling Smørgrav 	ldns_rdf *tmp;
6877b5038d7SDag-Erling Smørgrav 	ldns_status s;
6887b5038d7SDag-Erling Smørgrav 	ssize_t size;
6897b5038d7SDag-Erling Smørgrav 	int offset = 0;
6907b5038d7SDag-Erling Smørgrav 
6917b5038d7SDag-Erling Smørgrav 	if (default_ttl) {
6927b5038d7SDag-Erling Smørgrav 		ttl = *default_ttl;
6937b5038d7SDag-Erling Smørgrav 	} else {
6947b5038d7SDag-Erling Smørgrav 		ttl = 0;
6957b5038d7SDag-Erling Smørgrav 	}
6967b5038d7SDag-Erling Smørgrav 
6977b5038d7SDag-Erling Smørgrav 	line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1);
6987b5038d7SDag-Erling Smørgrav 	if (!line) {
6997b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_MEM_ERR;
7007b5038d7SDag-Erling Smørgrav 	}
7017b5038d7SDag-Erling Smørgrav 
7027b5038d7SDag-Erling Smørgrav 	/* read an entire line in from the file */
7037b5038d7SDag-Erling Smørgrav 	if ((size = ldns_fget_token_l(fp, line, LDNS_PARSE_SKIP_SPACE, LDNS_MAX_LINELEN, line_nr)) == -1) {
7047b5038d7SDag-Erling Smørgrav 		LDNS_FREE(line);
7057b5038d7SDag-Erling Smørgrav 		/* if last line was empty, we are now at feof, which is not
7067b5038d7SDag-Erling Smørgrav 		 * always a parse error (happens when for instance last line
7077b5038d7SDag-Erling Smørgrav 		 * was a comment)
7087b5038d7SDag-Erling Smørgrav 		 */
7097b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_SYNTAX_ERR;
7107b5038d7SDag-Erling Smørgrav 	}
7117b5038d7SDag-Erling Smørgrav 
7127b5038d7SDag-Erling Smørgrav 	/* we can have the situation, where we've read ok, but still got
7137b5038d7SDag-Erling Smørgrav 	 * no bytes to play with, in this case size is 0
7147b5038d7SDag-Erling Smørgrav 	 */
7157b5038d7SDag-Erling Smørgrav 	if (size == 0) {
7167b5038d7SDag-Erling Smørgrav 		LDNS_FREE(line);
7177b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_SYNTAX_EMPTY;
7187b5038d7SDag-Erling Smørgrav 	}
7197b5038d7SDag-Erling Smørgrav 
7207b5038d7SDag-Erling Smørgrav 	if (strncmp(line, "$ORIGIN", 7) == 0 && isspace(line[7])) {
7217b5038d7SDag-Erling Smørgrav 		if (*origin) {
7227b5038d7SDag-Erling Smørgrav 			ldns_rdf_deep_free(*origin);
7237b5038d7SDag-Erling Smørgrav 			*origin = NULL;
7247b5038d7SDag-Erling Smørgrav 		}
7257b5038d7SDag-Erling Smørgrav 		offset = 8;
7267b5038d7SDag-Erling Smørgrav 		while (isspace(line[offset])) {
7277b5038d7SDag-Erling Smørgrav 			offset++;
7287b5038d7SDag-Erling Smørgrav 		}
7297b5038d7SDag-Erling Smørgrav 		tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, line + offset);
7307b5038d7SDag-Erling Smørgrav 		if (!tmp) {
7317b5038d7SDag-Erling Smørgrav 			/* could not parse what next to $ORIGIN */
7327b5038d7SDag-Erling Smørgrav 			LDNS_FREE(line);
7337b5038d7SDag-Erling Smørgrav 			return LDNS_STATUS_SYNTAX_DNAME_ERR;
7347b5038d7SDag-Erling Smørgrav 		}
7357b5038d7SDag-Erling Smørgrav 		*origin = tmp;
7367b5038d7SDag-Erling Smørgrav 		s = LDNS_STATUS_SYNTAX_ORIGIN;
7377b5038d7SDag-Erling Smørgrav 	} else if (strncmp(line, "$TTL", 4) == 0 && isspace(line[4])) {
7387b5038d7SDag-Erling Smørgrav 		offset = 5;
7397b5038d7SDag-Erling Smørgrav 		while (isspace(line[offset])) {
7407b5038d7SDag-Erling Smørgrav 			offset++;
7417b5038d7SDag-Erling Smørgrav 		}
7427b5038d7SDag-Erling Smørgrav 		if (default_ttl) {
7437b5038d7SDag-Erling Smørgrav 			*default_ttl = ldns_str2period(line + offset, &endptr);
7447b5038d7SDag-Erling Smørgrav 		}
7457b5038d7SDag-Erling Smørgrav 		s = LDNS_STATUS_SYNTAX_TTL;
7467b5038d7SDag-Erling Smørgrav 	} else if (strncmp(line, "$INCLUDE", 8) == 0) {
7477b5038d7SDag-Erling Smørgrav 		s = LDNS_STATUS_SYNTAX_INCLUDE;
7487b5038d7SDag-Erling Smørgrav 	} else {
7497b5038d7SDag-Erling Smørgrav 		if (origin && *origin) {
7507b5038d7SDag-Erling Smørgrav 			s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, *origin, prev);
7517b5038d7SDag-Erling Smørgrav 		} else {
7527b5038d7SDag-Erling Smørgrav 			s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, NULL, prev);
7537b5038d7SDag-Erling Smørgrav 		}
7547b5038d7SDag-Erling Smørgrav 	}
7557b5038d7SDag-Erling Smørgrav 	LDNS_FREE(line);
7562787e39aSDag-Erling Smørgrav 	if (s == LDNS_STATUS_OK) {
7572787e39aSDag-Erling Smørgrav 		if (newrr) {
7587b5038d7SDag-Erling Smørgrav 			*newrr = rr;
7592787e39aSDag-Erling Smørgrav 		} else {
7602787e39aSDag-Erling Smørgrav 			/* Just testing if it would parse? */
7612787e39aSDag-Erling Smørgrav 			ldns_rr_free(rr);
7622787e39aSDag-Erling Smørgrav 		}
7637b5038d7SDag-Erling Smørgrav 	}
7647b5038d7SDag-Erling Smørgrav 	return s;
7657b5038d7SDag-Erling Smørgrav }
7667b5038d7SDag-Erling Smørgrav 
7677b5038d7SDag-Erling Smørgrav void
7687b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner)
7697b5038d7SDag-Erling Smørgrav {
7707b5038d7SDag-Erling Smørgrav 	rr->_owner = owner;
7717b5038d7SDag-Erling Smørgrav }
7727b5038d7SDag-Erling Smørgrav 
7737b5038d7SDag-Erling Smørgrav void
7747b5038d7SDag-Erling Smørgrav ldns_rr_set_question(ldns_rr *rr, bool question)
7757b5038d7SDag-Erling Smørgrav {
7767b5038d7SDag-Erling Smørgrav    rr->_rr_question = question;
7777b5038d7SDag-Erling Smørgrav }
7787b5038d7SDag-Erling Smørgrav 
7797b5038d7SDag-Erling Smørgrav void
7807b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl)
7817b5038d7SDag-Erling Smørgrav {
7827b5038d7SDag-Erling Smørgrav 	rr->_ttl = ttl;
7837b5038d7SDag-Erling Smørgrav }
7847b5038d7SDag-Erling Smørgrav 
7857b5038d7SDag-Erling Smørgrav void
7867b5038d7SDag-Erling Smørgrav ldns_rr_set_rd_count(ldns_rr *rr, size_t count)
7877b5038d7SDag-Erling Smørgrav {
7887b5038d7SDag-Erling Smørgrav 	rr->_rd_count = count;
7897b5038d7SDag-Erling Smørgrav }
7907b5038d7SDag-Erling Smørgrav 
7917b5038d7SDag-Erling Smørgrav void
7927b5038d7SDag-Erling Smørgrav ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type)
7937b5038d7SDag-Erling Smørgrav {
7947b5038d7SDag-Erling Smørgrav 	rr->_rr_type = rr_type;
7957b5038d7SDag-Erling Smørgrav }
7967b5038d7SDag-Erling Smørgrav 
7977b5038d7SDag-Erling Smørgrav void
7987b5038d7SDag-Erling Smørgrav ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class)
7997b5038d7SDag-Erling Smørgrav {
8007b5038d7SDag-Erling Smørgrav 	rr->_rr_class = rr_class;
8017b5038d7SDag-Erling Smørgrav }
8027b5038d7SDag-Erling Smørgrav 
8037b5038d7SDag-Erling Smørgrav ldns_rdf *
8047b5038d7SDag-Erling Smørgrav ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position)
8057b5038d7SDag-Erling Smørgrav {
8067b5038d7SDag-Erling Smørgrav 	size_t rd_count;
8077b5038d7SDag-Erling Smørgrav 	ldns_rdf *pop;
8087b5038d7SDag-Erling Smørgrav 
8097b5038d7SDag-Erling Smørgrav 	rd_count = ldns_rr_rd_count(rr);
8107b5038d7SDag-Erling Smørgrav 	if (position < rd_count) {
8117b5038d7SDag-Erling Smørgrav 		/* dicard the old one */
8127b5038d7SDag-Erling Smørgrav 		pop = rr->_rdata_fields[position];
8137b5038d7SDag-Erling Smørgrav 		rr->_rdata_fields[position] = (ldns_rdf*)f;
8147b5038d7SDag-Erling Smørgrav 		return pop;
8157b5038d7SDag-Erling Smørgrav 	} else {
8167b5038d7SDag-Erling Smørgrav 		return NULL;
8177b5038d7SDag-Erling Smørgrav 	}
8187b5038d7SDag-Erling Smørgrav }
8197b5038d7SDag-Erling Smørgrav 
8207b5038d7SDag-Erling Smørgrav bool
8217b5038d7SDag-Erling Smørgrav ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f)
8227b5038d7SDag-Erling Smørgrav {
8237b5038d7SDag-Erling Smørgrav 	size_t rd_count;
8247b5038d7SDag-Erling Smørgrav 	ldns_rdf **rdata_fields;
8257b5038d7SDag-Erling Smørgrav 
8267b5038d7SDag-Erling Smørgrav 	rd_count = ldns_rr_rd_count(rr);
8277b5038d7SDag-Erling Smørgrav 
8287b5038d7SDag-Erling Smørgrav 	/* grow the array */
8297b5038d7SDag-Erling Smørgrav 	rdata_fields = LDNS_XREALLOC(
8307b5038d7SDag-Erling Smørgrav 		rr->_rdata_fields, ldns_rdf *, rd_count + 1);
8317b5038d7SDag-Erling Smørgrav 	if (!rdata_fields) {
8327b5038d7SDag-Erling Smørgrav 		return false;
8337b5038d7SDag-Erling Smørgrav 	}
8347b5038d7SDag-Erling Smørgrav 
8357b5038d7SDag-Erling Smørgrav 	/* add the new member */
8367b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields = rdata_fields;
8377b5038d7SDag-Erling Smørgrav 	rr->_rdata_fields[rd_count] = (ldns_rdf*)f;
8387b5038d7SDag-Erling Smørgrav 
8397b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, rd_count + 1);
8407b5038d7SDag-Erling Smørgrav 	return true;
8417b5038d7SDag-Erling Smørgrav }
8427b5038d7SDag-Erling Smørgrav 
8437b5038d7SDag-Erling Smørgrav ldns_rdf *
8447b5038d7SDag-Erling Smørgrav ldns_rr_pop_rdf(ldns_rr *rr)
8457b5038d7SDag-Erling Smørgrav {
8467b5038d7SDag-Erling Smørgrav 	size_t rd_count;
8477b5038d7SDag-Erling Smørgrav 	ldns_rdf *pop;
8487b5038d7SDag-Erling Smørgrav 	ldns_rdf** newrd;
8497b5038d7SDag-Erling Smørgrav 
8507b5038d7SDag-Erling Smørgrav 	rd_count = ldns_rr_rd_count(rr);
8517b5038d7SDag-Erling Smørgrav 
8527b5038d7SDag-Erling Smørgrav 	if (rd_count == 0) {
8537b5038d7SDag-Erling Smørgrav 		return NULL;
8547b5038d7SDag-Erling Smørgrav 	}
8557b5038d7SDag-Erling Smørgrav 
8567b5038d7SDag-Erling Smørgrav 	pop = rr->_rdata_fields[rd_count - 1];
8577b5038d7SDag-Erling Smørgrav 
8587b5038d7SDag-Erling Smørgrav 	/* try to shrink the array */
8597b5038d7SDag-Erling Smørgrav 	if(rd_count > 1) {
8607b5038d7SDag-Erling Smørgrav 		newrd = LDNS_XREALLOC(
8617b5038d7SDag-Erling Smørgrav 			rr->_rdata_fields, ldns_rdf *, rd_count - 1);
8627b5038d7SDag-Erling Smørgrav 		if(newrd)
8637b5038d7SDag-Erling Smørgrav 			rr->_rdata_fields = newrd;
8647b5038d7SDag-Erling Smørgrav 	} else {
8657b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr->_rdata_fields);
8667b5038d7SDag-Erling Smørgrav 	}
8677b5038d7SDag-Erling Smørgrav 
8687b5038d7SDag-Erling Smørgrav 	ldns_rr_set_rd_count(rr, rd_count - 1);
8697b5038d7SDag-Erling Smørgrav 	return pop;
8707b5038d7SDag-Erling Smørgrav }
8717b5038d7SDag-Erling Smørgrav 
8727b5038d7SDag-Erling Smørgrav ldns_rdf *
8737b5038d7SDag-Erling Smørgrav ldns_rr_rdf(const ldns_rr *rr, size_t nr)
8747b5038d7SDag-Erling Smørgrav {
8757b5038d7SDag-Erling Smørgrav 	if (rr && nr < ldns_rr_rd_count(rr)) {
8767b5038d7SDag-Erling Smørgrav 		return rr->_rdata_fields[nr];
8777b5038d7SDag-Erling Smørgrav 	} else {
8787b5038d7SDag-Erling Smørgrav 		return NULL;
8797b5038d7SDag-Erling Smørgrav 	}
8807b5038d7SDag-Erling Smørgrav }
8817b5038d7SDag-Erling Smørgrav 
8827b5038d7SDag-Erling Smørgrav ldns_rdf *
8837b5038d7SDag-Erling Smørgrav ldns_rr_owner(const ldns_rr *rr)
8847b5038d7SDag-Erling Smørgrav {
8857b5038d7SDag-Erling Smørgrav 	return rr->_owner;
8867b5038d7SDag-Erling Smørgrav }
8877b5038d7SDag-Erling Smørgrav 
8887b5038d7SDag-Erling Smørgrav bool
8897b5038d7SDag-Erling Smørgrav ldns_rr_is_question(const ldns_rr *rr)
8907b5038d7SDag-Erling Smørgrav {
8917b5038d7SDag-Erling Smørgrav    return rr->_rr_question;
8927b5038d7SDag-Erling Smørgrav }
8937b5038d7SDag-Erling Smørgrav 
8947b5038d7SDag-Erling Smørgrav uint32_t
8957b5038d7SDag-Erling Smørgrav ldns_rr_ttl(const ldns_rr *rr)
8967b5038d7SDag-Erling Smørgrav {
8977b5038d7SDag-Erling Smørgrav 	return rr->_ttl;
8987b5038d7SDag-Erling Smørgrav }
8997b5038d7SDag-Erling Smørgrav 
9007b5038d7SDag-Erling Smørgrav size_t
9017b5038d7SDag-Erling Smørgrav ldns_rr_rd_count(const ldns_rr *rr)
9027b5038d7SDag-Erling Smørgrav {
9037b5038d7SDag-Erling Smørgrav 	return rr->_rd_count;
9047b5038d7SDag-Erling Smørgrav }
9057b5038d7SDag-Erling Smørgrav 
9067b5038d7SDag-Erling Smørgrav ldns_rr_type
9077b5038d7SDag-Erling Smørgrav ldns_rr_get_type(const ldns_rr *rr)
9087b5038d7SDag-Erling Smørgrav {
9097b5038d7SDag-Erling Smørgrav         return rr->_rr_type;
9107b5038d7SDag-Erling Smørgrav }
9117b5038d7SDag-Erling Smørgrav 
9127b5038d7SDag-Erling Smørgrav ldns_rr_class
9137b5038d7SDag-Erling Smørgrav ldns_rr_get_class(const ldns_rr *rr)
9147b5038d7SDag-Erling Smørgrav {
9157b5038d7SDag-Erling Smørgrav         return rr->_rr_class;
9167b5038d7SDag-Erling Smørgrav }
9177b5038d7SDag-Erling Smørgrav 
9187b5038d7SDag-Erling Smørgrav /* rr_lists */
9197b5038d7SDag-Erling Smørgrav 
9207b5038d7SDag-Erling Smørgrav size_t
9217b5038d7SDag-Erling Smørgrav ldns_rr_list_rr_count(const ldns_rr_list *rr_list)
9227b5038d7SDag-Erling Smørgrav {
9237b5038d7SDag-Erling Smørgrav 	if (rr_list) {
9247b5038d7SDag-Erling Smørgrav 		return rr_list->_rr_count;
9257b5038d7SDag-Erling Smørgrav 	} else {
9267b5038d7SDag-Erling Smørgrav 		return 0;
9277b5038d7SDag-Erling Smørgrav 	}
9287b5038d7SDag-Erling Smørgrav }
9297b5038d7SDag-Erling Smørgrav 
9307b5038d7SDag-Erling Smørgrav ldns_rr *
9317b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count)
9327b5038d7SDag-Erling Smørgrav {
9337b5038d7SDag-Erling Smørgrav 	ldns_rr *old;
9347b5038d7SDag-Erling Smørgrav 
9357b5038d7SDag-Erling Smørgrav 	if (count > ldns_rr_list_rr_count(rr_list)) {
9367b5038d7SDag-Erling Smørgrav 		return NULL;
9377b5038d7SDag-Erling Smørgrav 	}
9387b5038d7SDag-Erling Smørgrav 
9397b5038d7SDag-Erling Smørgrav 	old = ldns_rr_list_rr(rr_list, count);
9407b5038d7SDag-Erling Smørgrav 
9417b5038d7SDag-Erling Smørgrav 	/* overwrite old's pointer */
9427b5038d7SDag-Erling Smørgrav 	rr_list->_rrs[count] = (ldns_rr*)r;
9437b5038d7SDag-Erling Smørgrav 	return old;
9447b5038d7SDag-Erling Smørgrav }
9457b5038d7SDag-Erling Smørgrav 
9467b5038d7SDag-Erling Smørgrav void
9477b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count)
9487b5038d7SDag-Erling Smørgrav {
9497b5038d7SDag-Erling Smørgrav 	assert(count <= rr_list->_rr_capacity);
9507b5038d7SDag-Erling Smørgrav 	rr_list->_rr_count = count;
9517b5038d7SDag-Erling Smørgrav }
9527b5038d7SDag-Erling Smørgrav 
9537b5038d7SDag-Erling Smørgrav ldns_rr *
9547b5038d7SDag-Erling Smørgrav ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr)
9557b5038d7SDag-Erling Smørgrav {
9567b5038d7SDag-Erling Smørgrav 	if (nr < ldns_rr_list_rr_count(rr_list)) {
9577b5038d7SDag-Erling Smørgrav 		return rr_list->_rrs[nr];
9587b5038d7SDag-Erling Smørgrav 	} else {
9597b5038d7SDag-Erling Smørgrav 		return NULL;
9607b5038d7SDag-Erling Smørgrav 	}
9617b5038d7SDag-Erling Smørgrav }
9627b5038d7SDag-Erling Smørgrav 
9637b5038d7SDag-Erling Smørgrav ldns_rr_list *
9647b5038d7SDag-Erling Smørgrav ldns_rr_list_new(void)
9657b5038d7SDag-Erling Smørgrav {
9667b5038d7SDag-Erling Smørgrav 	ldns_rr_list *rr_list = LDNS_MALLOC(ldns_rr_list);
9677b5038d7SDag-Erling Smørgrav         if(!rr_list) return NULL;
9687b5038d7SDag-Erling Smørgrav 	rr_list->_rr_count = 0;
9697b5038d7SDag-Erling Smørgrav 	rr_list->_rr_capacity = 0;
9707b5038d7SDag-Erling Smørgrav 	rr_list->_rrs = NULL;
9717b5038d7SDag-Erling Smørgrav 	return rr_list;
9727b5038d7SDag-Erling Smørgrav }
9737b5038d7SDag-Erling Smørgrav 
9747b5038d7SDag-Erling Smørgrav void
9757b5038d7SDag-Erling Smørgrav ldns_rr_list_free(ldns_rr_list *rr_list)
9767b5038d7SDag-Erling Smørgrav {
9777b5038d7SDag-Erling Smørgrav 	if (rr_list) {
9787b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list->_rrs);
9797b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list);
9807b5038d7SDag-Erling Smørgrav 	}
9817b5038d7SDag-Erling Smørgrav }
9827b5038d7SDag-Erling Smørgrav 
9837b5038d7SDag-Erling Smørgrav void
9847b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(ldns_rr_list *rr_list)
9857b5038d7SDag-Erling Smørgrav {
9867b5038d7SDag-Erling Smørgrav 	size_t i;
9877b5038d7SDag-Erling Smørgrav 
9887b5038d7SDag-Erling Smørgrav 	if (rr_list) {
9897b5038d7SDag-Erling Smørgrav 		for (i=0; i < ldns_rr_list_rr_count(rr_list); i++) {
9907b5038d7SDag-Erling Smørgrav 			ldns_rr_free(ldns_rr_list_rr(rr_list, i));
9917b5038d7SDag-Erling Smørgrav 		}
9927b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list->_rrs);
9937b5038d7SDag-Erling Smørgrav 		LDNS_FREE(rr_list);
9947b5038d7SDag-Erling Smørgrav 	}
9957b5038d7SDag-Erling Smørgrav }
9967b5038d7SDag-Erling Smørgrav 
9977b5038d7SDag-Erling Smørgrav 
9987b5038d7SDag-Erling Smørgrav /* add right to left. So we modify *left! */
9997b5038d7SDag-Erling Smørgrav bool
10007b5038d7SDag-Erling Smørgrav ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right)
10017b5038d7SDag-Erling Smørgrav {
10027b5038d7SDag-Erling Smørgrav 	size_t r_rr_count;
10037b5038d7SDag-Erling Smørgrav 	size_t i;
10047b5038d7SDag-Erling Smørgrav 
10057b5038d7SDag-Erling Smørgrav 	if (!left) {
10067b5038d7SDag-Erling Smørgrav 		return false;
10077b5038d7SDag-Erling Smørgrav 	}
10087b5038d7SDag-Erling Smørgrav 
10097b5038d7SDag-Erling Smørgrav 	if (right) {
10107b5038d7SDag-Erling Smørgrav 		r_rr_count = ldns_rr_list_rr_count(right);
10117b5038d7SDag-Erling Smørgrav 	} else {
10127b5038d7SDag-Erling Smørgrav 		r_rr_count = 0;
10137b5038d7SDag-Erling Smørgrav 	}
10147b5038d7SDag-Erling Smørgrav 
10157b5038d7SDag-Erling Smørgrav 	/* push right to left */
10167b5038d7SDag-Erling Smørgrav 	for(i = 0; i < r_rr_count; i++) {
10177b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(left, ldns_rr_list_rr(right, i));
10187b5038d7SDag-Erling Smørgrav 	}
10197b5038d7SDag-Erling Smørgrav 	return true;
10207b5038d7SDag-Erling Smørgrav }
10217b5038d7SDag-Erling Smørgrav 
10227b5038d7SDag-Erling Smørgrav ldns_rr_list *
10237b5038d7SDag-Erling Smørgrav ldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right)
10247b5038d7SDag-Erling Smørgrav {
10257b5038d7SDag-Erling Smørgrav 	size_t l_rr_count;
10267b5038d7SDag-Erling Smørgrav 	size_t r_rr_count;
10277b5038d7SDag-Erling Smørgrav 	size_t i;
10287b5038d7SDag-Erling Smørgrav 	ldns_rr_list *cat;
10297b5038d7SDag-Erling Smørgrav 
10307b5038d7SDag-Erling Smørgrav 	if (left) {
10317b5038d7SDag-Erling Smørgrav 		l_rr_count = ldns_rr_list_rr_count(left);
10327b5038d7SDag-Erling Smørgrav 	} else {
10337b5038d7SDag-Erling Smørgrav 		return ldns_rr_list_clone(right);
10347b5038d7SDag-Erling Smørgrav 	}
10357b5038d7SDag-Erling Smørgrav 
10367b5038d7SDag-Erling Smørgrav 	if (right) {
10377b5038d7SDag-Erling Smørgrav 		r_rr_count = ldns_rr_list_rr_count(right);
10387b5038d7SDag-Erling Smørgrav 	} else {
10397b5038d7SDag-Erling Smørgrav 		r_rr_count = 0;
10407b5038d7SDag-Erling Smørgrav 	}
10417b5038d7SDag-Erling Smørgrav 
10427b5038d7SDag-Erling Smørgrav 	cat = ldns_rr_list_new();
10437b5038d7SDag-Erling Smørgrav 
10447b5038d7SDag-Erling Smørgrav 	if (!cat) {
10457b5038d7SDag-Erling Smørgrav 		return NULL;
10467b5038d7SDag-Erling Smørgrav 	}
10477b5038d7SDag-Erling Smørgrav 
10487b5038d7SDag-Erling Smørgrav 	/* left */
10497b5038d7SDag-Erling Smørgrav 	for(i = 0; i < l_rr_count; i++) {
10507b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(cat,
10517b5038d7SDag-Erling Smørgrav 				ldns_rr_clone(ldns_rr_list_rr(left, i)));
10527b5038d7SDag-Erling Smørgrav 	}
10537b5038d7SDag-Erling Smørgrav 	/* right */
10547b5038d7SDag-Erling Smørgrav 	for(i = 0; i < r_rr_count; i++) {
10557b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(cat,
10567b5038d7SDag-Erling Smørgrav 				ldns_rr_clone(ldns_rr_list_rr(right, i)));
10577b5038d7SDag-Erling Smørgrav 	}
10587b5038d7SDag-Erling Smørgrav 	return cat;
10597b5038d7SDag-Erling Smørgrav }
10607b5038d7SDag-Erling Smørgrav 
10617b5038d7SDag-Erling Smørgrav ldns_rr_list *
10627b5038d7SDag-Erling Smørgrav ldns_rr_list_subtype_by_rdf(ldns_rr_list *l, ldns_rdf *r, size_t pos)
10637b5038d7SDag-Erling Smørgrav {
10647b5038d7SDag-Erling Smørgrav 	size_t i;
10657b5038d7SDag-Erling Smørgrav 	ldns_rr_list *subtyped;
10667b5038d7SDag-Erling Smørgrav 	ldns_rdf *list_rdf;
10677b5038d7SDag-Erling Smørgrav 
10687b5038d7SDag-Erling Smørgrav 	subtyped = ldns_rr_list_new();
10697b5038d7SDag-Erling Smørgrav 
10707b5038d7SDag-Erling Smørgrav 	for(i = 0; i < ldns_rr_list_rr_count(l); i++) {
10717b5038d7SDag-Erling Smørgrav 		list_rdf = ldns_rr_rdf(
10727b5038d7SDag-Erling Smørgrav 			ldns_rr_list_rr(l, i),
10737b5038d7SDag-Erling Smørgrav 			pos);
10747b5038d7SDag-Erling Smørgrav 		if (!list_rdf) {
10757b5038d7SDag-Erling Smørgrav 			/* pos is too large or any other error */
10767b5038d7SDag-Erling Smørgrav 			ldns_rr_list_deep_free(subtyped);
10777b5038d7SDag-Erling Smørgrav 			return NULL;
10787b5038d7SDag-Erling Smørgrav 		}
10797b5038d7SDag-Erling Smørgrav 
10807b5038d7SDag-Erling Smørgrav 		if (ldns_rdf_compare(list_rdf, r) == 0) {
10817b5038d7SDag-Erling Smørgrav 			/* a match */
10827b5038d7SDag-Erling Smørgrav 			ldns_rr_list_push_rr(subtyped,
10837b5038d7SDag-Erling Smørgrav 					ldns_rr_clone(ldns_rr_list_rr(l, i)));
10847b5038d7SDag-Erling Smørgrav 		}
10857b5038d7SDag-Erling Smørgrav 	}
10867b5038d7SDag-Erling Smørgrav 
10877b5038d7SDag-Erling Smørgrav 	if (ldns_rr_list_rr_count(subtyped) > 0) {
10887b5038d7SDag-Erling Smørgrav 		return subtyped;
10897b5038d7SDag-Erling Smørgrav 	} else {
10907b5038d7SDag-Erling Smørgrav 		ldns_rr_list_free(subtyped);
10917b5038d7SDag-Erling Smørgrav 		return NULL;
10927b5038d7SDag-Erling Smørgrav 	}
10937b5038d7SDag-Erling Smørgrav }
10947b5038d7SDag-Erling Smørgrav 
10957b5038d7SDag-Erling Smørgrav bool
10967b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr)
10977b5038d7SDag-Erling Smørgrav {
10987b5038d7SDag-Erling Smørgrav 	size_t rr_count;
10997b5038d7SDag-Erling Smørgrav 	size_t cap;
11007b5038d7SDag-Erling Smørgrav 
11017b5038d7SDag-Erling Smørgrav 	rr_count = ldns_rr_list_rr_count(rr_list);
11027b5038d7SDag-Erling Smørgrav 	cap = rr_list->_rr_capacity;
11037b5038d7SDag-Erling Smørgrav 
11047b5038d7SDag-Erling Smørgrav 	/* grow the array */
11057b5038d7SDag-Erling Smørgrav 	if(rr_count+1 > cap) {
11067b5038d7SDag-Erling Smørgrav 		ldns_rr **rrs;
11077b5038d7SDag-Erling Smørgrav 
11087b5038d7SDag-Erling Smørgrav 		if(cap == 0)
11097b5038d7SDag-Erling Smørgrav 			cap = LDNS_RRLIST_INIT;  /* initial list size */
11107b5038d7SDag-Erling Smørgrav 		else	cap *= 2;
11117b5038d7SDag-Erling Smørgrav 		rrs = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap);
11127b5038d7SDag-Erling Smørgrav 		if (!rrs) {
11137b5038d7SDag-Erling Smørgrav 			return false;
11147b5038d7SDag-Erling Smørgrav 		}
11157b5038d7SDag-Erling Smørgrav 		rr_list->_rrs = rrs;
11167b5038d7SDag-Erling Smørgrav 		rr_list->_rr_capacity = cap;
11177b5038d7SDag-Erling Smørgrav 	}
11187b5038d7SDag-Erling Smørgrav 
11197b5038d7SDag-Erling Smørgrav 	/* add the new member */
11207b5038d7SDag-Erling Smørgrav 	rr_list->_rrs[rr_count] = (ldns_rr*)rr;
11217b5038d7SDag-Erling Smørgrav 
11227b5038d7SDag-Erling Smørgrav 	ldns_rr_list_set_rr_count(rr_list, rr_count + 1);
11237b5038d7SDag-Erling Smørgrav 	return true;
11247b5038d7SDag-Erling Smørgrav }
11257b5038d7SDag-Erling Smørgrav 
11267b5038d7SDag-Erling Smørgrav bool
11277b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list)
11287b5038d7SDag-Erling Smørgrav {
11297b5038d7SDag-Erling Smørgrav 	size_t i;
11307b5038d7SDag-Erling Smørgrav 
11317b5038d7SDag-Erling Smørgrav 	for(i = 0; i < ldns_rr_list_rr_count(push_list); i++) {
11327b5038d7SDag-Erling Smørgrav 		if (!ldns_rr_list_push_rr(rr_list,
11337b5038d7SDag-Erling Smørgrav 				ldns_rr_list_rr(push_list, i))) {
11347b5038d7SDag-Erling Smørgrav 			return false;
11357b5038d7SDag-Erling Smørgrav 		}
11367b5038d7SDag-Erling Smørgrav 	}
11377b5038d7SDag-Erling Smørgrav 	return true;
11387b5038d7SDag-Erling Smørgrav }
11397b5038d7SDag-Erling Smørgrav 
11407b5038d7SDag-Erling Smørgrav ldns_rr *
11417b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rr(ldns_rr_list *rr_list)
11427b5038d7SDag-Erling Smørgrav {
11437b5038d7SDag-Erling Smørgrav 	size_t rr_count;
11447b5038d7SDag-Erling Smørgrav 	size_t cap;
11457b5038d7SDag-Erling Smørgrav 	ldns_rr *pop;
11467b5038d7SDag-Erling Smørgrav 
11477b5038d7SDag-Erling Smørgrav 	rr_count = ldns_rr_list_rr_count(rr_list);
11487b5038d7SDag-Erling Smørgrav 
11497b5038d7SDag-Erling Smørgrav 	if (rr_count == 0) {
11507b5038d7SDag-Erling Smørgrav 		return NULL;
11517b5038d7SDag-Erling Smørgrav 	}
11527b5038d7SDag-Erling Smørgrav 
11537b5038d7SDag-Erling Smørgrav 	cap = rr_list->_rr_capacity;
11547b5038d7SDag-Erling Smørgrav 	pop = ldns_rr_list_rr(rr_list, rr_count - 1);
11557b5038d7SDag-Erling Smørgrav 
11567b5038d7SDag-Erling Smørgrav 	/* shrink the array */
11577b5038d7SDag-Erling Smørgrav 	if(cap > LDNS_RRLIST_INIT && rr_count-1 <= cap/2) {
11587b5038d7SDag-Erling Smørgrav                 ldns_rr** a;
11597b5038d7SDag-Erling Smørgrav 		cap /= 2;
11607b5038d7SDag-Erling Smørgrav                 a = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap);
11617b5038d7SDag-Erling Smørgrav                 if(a) {
11627b5038d7SDag-Erling Smørgrav 		        rr_list->_rrs = a;
11637b5038d7SDag-Erling Smørgrav 		        rr_list->_rr_capacity = cap;
11647b5038d7SDag-Erling Smørgrav                 }
11657b5038d7SDag-Erling Smørgrav 	}
11667b5038d7SDag-Erling Smørgrav 
11677b5038d7SDag-Erling Smørgrav 	ldns_rr_list_set_rr_count(rr_list, rr_count - 1);
11687b5038d7SDag-Erling Smørgrav 
11697b5038d7SDag-Erling Smørgrav 	return pop;
11707b5038d7SDag-Erling Smørgrav }
11717b5038d7SDag-Erling Smørgrav 
11727b5038d7SDag-Erling Smørgrav ldns_rr_list *
11737b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t howmany)
11747b5038d7SDag-Erling Smørgrav {
11757b5038d7SDag-Erling Smørgrav 	/* pop a number of rr's and put them in a rr_list */
11767b5038d7SDag-Erling Smørgrav 	ldns_rr_list *popped;
11777b5038d7SDag-Erling Smørgrav 	ldns_rr *p;
11787b5038d7SDag-Erling Smørgrav 	size_t i = howmany;
11797b5038d7SDag-Erling Smørgrav 
11807b5038d7SDag-Erling Smørgrav 	popped = ldns_rr_list_new();
11817b5038d7SDag-Erling Smørgrav 
11827b5038d7SDag-Erling Smørgrav 	if (!popped) {
11837b5038d7SDag-Erling Smørgrav 		return NULL;
11847b5038d7SDag-Erling Smørgrav 	}
11857b5038d7SDag-Erling Smørgrav 
11867b5038d7SDag-Erling Smørgrav 
11877b5038d7SDag-Erling Smørgrav 	while(i > 0 &&
11887b5038d7SDag-Erling Smørgrav 			(p = ldns_rr_list_pop_rr(rr_list)) != NULL) {
11897b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(popped, p);
11907b5038d7SDag-Erling Smørgrav 		i--;
11917b5038d7SDag-Erling Smørgrav 	}
11927b5038d7SDag-Erling Smørgrav 
11932787e39aSDag-Erling Smørgrav 	if (i == howmany) { /* so i <= 0 */
11942787e39aSDag-Erling Smørgrav 		ldns_rr_list_free(popped);
11957b5038d7SDag-Erling Smørgrav 		return NULL;
11967b5038d7SDag-Erling Smørgrav 	} else {
11977b5038d7SDag-Erling Smørgrav 		return popped;
11987b5038d7SDag-Erling Smørgrav 	}
11997b5038d7SDag-Erling Smørgrav }
12007b5038d7SDag-Erling Smørgrav 
12017b5038d7SDag-Erling Smørgrav 
12027b5038d7SDag-Erling Smørgrav bool
12037b5038d7SDag-Erling Smørgrav ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr)
12047b5038d7SDag-Erling Smørgrav {
12057b5038d7SDag-Erling Smørgrav 	size_t i;
12067b5038d7SDag-Erling Smørgrav 
12077b5038d7SDag-Erling Smørgrav 	if (!rr_list || !rr || ldns_rr_list_rr_count(rr_list) == 0) {
12087b5038d7SDag-Erling Smørgrav 		return false;
12097b5038d7SDag-Erling Smørgrav 	}
12107b5038d7SDag-Erling Smørgrav 
12117b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) {
12127b5038d7SDag-Erling Smørgrav 		if (rr == ldns_rr_list_rr(rr_list, i)) {
12137b5038d7SDag-Erling Smørgrav 			return true;
12147b5038d7SDag-Erling Smørgrav 		} else if (ldns_rr_compare(rr, ldns_rr_list_rr(rr_list, i)) == 0) {
12157b5038d7SDag-Erling Smørgrav 			return true;
12167b5038d7SDag-Erling Smørgrav 		}
12177b5038d7SDag-Erling Smørgrav 	}
12187b5038d7SDag-Erling Smørgrav 	return false;
12197b5038d7SDag-Erling Smørgrav }
12207b5038d7SDag-Erling Smørgrav 
12217b5038d7SDag-Erling Smørgrav bool
12227b5038d7SDag-Erling Smørgrav ldns_is_rrset(ldns_rr_list *rr_list)
12237b5038d7SDag-Erling Smørgrav {
12247b5038d7SDag-Erling Smørgrav 	ldns_rr_type t;
12257b5038d7SDag-Erling Smørgrav 	ldns_rr_class c;
12267b5038d7SDag-Erling Smørgrav 	ldns_rdf *o;
12277b5038d7SDag-Erling Smørgrav 	ldns_rr *tmp;
12287b5038d7SDag-Erling Smørgrav 	size_t i;
12297b5038d7SDag-Erling Smørgrav 
12307b5038d7SDag-Erling Smørgrav 	if (!rr_list || ldns_rr_list_rr_count(rr_list) == 0) {
12317b5038d7SDag-Erling Smørgrav 		return false;
12327b5038d7SDag-Erling Smørgrav 	}
12337b5038d7SDag-Erling Smørgrav 
12347b5038d7SDag-Erling Smørgrav 	tmp = ldns_rr_list_rr(rr_list, 0);
12357b5038d7SDag-Erling Smørgrav 
12367b5038d7SDag-Erling Smørgrav 	t = ldns_rr_get_type(tmp);
12377b5038d7SDag-Erling Smørgrav 	c = ldns_rr_get_class(tmp);
12387b5038d7SDag-Erling Smørgrav 	o = ldns_rr_owner(tmp);
12397b5038d7SDag-Erling Smørgrav 
12407b5038d7SDag-Erling Smørgrav 	/* compare these with the rest of the rr_list, start with 1 */
12417b5038d7SDag-Erling Smørgrav 	for (i = 1; i < ldns_rr_list_rr_count(rr_list); i++) {
12427b5038d7SDag-Erling Smørgrav 		tmp = ldns_rr_list_rr(rr_list, i);
12437b5038d7SDag-Erling Smørgrav 		if (t != ldns_rr_get_type(tmp)) {
12447b5038d7SDag-Erling Smørgrav 			return false;
12457b5038d7SDag-Erling Smørgrav 		}
12467b5038d7SDag-Erling Smørgrav 		if (c != ldns_rr_get_class(tmp)) {
12477b5038d7SDag-Erling Smørgrav 			return false;
12487b5038d7SDag-Erling Smørgrav 		}
12497b5038d7SDag-Erling Smørgrav 		if (ldns_rdf_compare(o, ldns_rr_owner(tmp)) != 0) {
12507b5038d7SDag-Erling Smørgrav 			return false;
12517b5038d7SDag-Erling Smørgrav 		}
12527b5038d7SDag-Erling Smørgrav 	}
12537b5038d7SDag-Erling Smørgrav 	return true;
12547b5038d7SDag-Erling Smørgrav }
12557b5038d7SDag-Erling Smørgrav 
12567b5038d7SDag-Erling Smørgrav bool
12577b5038d7SDag-Erling Smørgrav ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr)
12587b5038d7SDag-Erling Smørgrav {
12597b5038d7SDag-Erling Smørgrav 	size_t rr_count;
12607b5038d7SDag-Erling Smørgrav 	size_t i;
12617b5038d7SDag-Erling Smørgrav 	ldns_rr *last;
12627b5038d7SDag-Erling Smørgrav 
12637b5038d7SDag-Erling Smørgrav 	assert(rr != NULL);
12647b5038d7SDag-Erling Smørgrav 
12657b5038d7SDag-Erling Smørgrav 	rr_count = ldns_rr_list_rr_count(rr_list);
12667b5038d7SDag-Erling Smørgrav 
12677b5038d7SDag-Erling Smørgrav 	if (rr_count == 0) {
12687b5038d7SDag-Erling Smørgrav 		/* nothing there, so checking it is
12697b5038d7SDag-Erling Smørgrav 		 * not needed */
12707b5038d7SDag-Erling Smørgrav 		return ldns_rr_list_push_rr(rr_list, rr);
12717b5038d7SDag-Erling Smørgrav 	} else {
12727b5038d7SDag-Erling Smørgrav 		/* check with the final rr in the rr_list */
12737b5038d7SDag-Erling Smørgrav 		last = ldns_rr_list_rr(rr_list, rr_count - 1);
12747b5038d7SDag-Erling Smørgrav 
12757b5038d7SDag-Erling Smørgrav 		if (ldns_rr_get_class(last) != ldns_rr_get_class(rr)) {
12767b5038d7SDag-Erling Smørgrav 			return false;
12777b5038d7SDag-Erling Smørgrav 		}
12787b5038d7SDag-Erling Smørgrav 		if (ldns_rr_get_type(last) != ldns_rr_get_type(rr)) {
12797b5038d7SDag-Erling Smørgrav 			return false;
12807b5038d7SDag-Erling Smørgrav 		}
12817b5038d7SDag-Erling Smørgrav 		/* only check if not equal to RRSIG */
12827b5038d7SDag-Erling Smørgrav 		if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) {
12837b5038d7SDag-Erling Smørgrav 			if (ldns_rr_ttl(last) != ldns_rr_ttl(rr)) {
12847b5038d7SDag-Erling Smørgrav 				return false;
12857b5038d7SDag-Erling Smørgrav 			}
12867b5038d7SDag-Erling Smørgrav 		}
12877b5038d7SDag-Erling Smørgrav 		if (ldns_rdf_compare(ldns_rr_owner(last),
12887b5038d7SDag-Erling Smørgrav 					ldns_rr_owner(rr)) != 0) {
12897b5038d7SDag-Erling Smørgrav 			return false;
12907b5038d7SDag-Erling Smørgrav 		}
12917b5038d7SDag-Erling Smørgrav 		/* ok, still alive - check if the rr already
12927b5038d7SDag-Erling Smørgrav 		 * exists - if so, dont' add it */
12937b5038d7SDag-Erling Smørgrav 		for(i = 0; i < rr_count; i++) {
12947b5038d7SDag-Erling Smørgrav 			if(ldns_rr_compare(
12957b5038d7SDag-Erling Smørgrav 					ldns_rr_list_rr(rr_list, i), rr) == 0) {
12967b5038d7SDag-Erling Smørgrav 				return false;
12977b5038d7SDag-Erling Smørgrav 			}
12987b5038d7SDag-Erling Smørgrav 		}
12997b5038d7SDag-Erling Smørgrav 		/* it's safe, push it */
13007b5038d7SDag-Erling Smørgrav 		return ldns_rr_list_push_rr(rr_list, rr);
13017b5038d7SDag-Erling Smørgrav 	}
13027b5038d7SDag-Erling Smørgrav }
13037b5038d7SDag-Erling Smørgrav 
13047b5038d7SDag-Erling Smørgrav ldns_rr *
13057b5038d7SDag-Erling Smørgrav ldns_rr_set_pop_rr(ldns_rr_list *rr_list)
13067b5038d7SDag-Erling Smørgrav {
13077b5038d7SDag-Erling Smørgrav 	return ldns_rr_list_pop_rr(rr_list);
13087b5038d7SDag-Erling Smørgrav }
13097b5038d7SDag-Erling Smørgrav 
13107b5038d7SDag-Erling Smørgrav ldns_rr_list *
13117b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rrset(ldns_rr_list *rr_list)
13127b5038d7SDag-Erling Smørgrav {
13137b5038d7SDag-Erling Smørgrav 	ldns_rr_list *rrset;
13147b5038d7SDag-Erling Smørgrav 	ldns_rr *last_rr = NULL;
13157b5038d7SDag-Erling Smørgrav 	ldns_rr *next_rr;
13167b5038d7SDag-Erling Smørgrav 
13177b5038d7SDag-Erling Smørgrav 	if (!rr_list) {
13187b5038d7SDag-Erling Smørgrav 		return NULL;
13197b5038d7SDag-Erling Smørgrav 	}
13207b5038d7SDag-Erling Smørgrav 
13217b5038d7SDag-Erling Smørgrav 	rrset = ldns_rr_list_new();
13227b5038d7SDag-Erling Smørgrav 	if (!last_rr) {
13237b5038d7SDag-Erling Smørgrav 		last_rr = ldns_rr_list_pop_rr(rr_list);
13247b5038d7SDag-Erling Smørgrav 		if (!last_rr) {
13257b5038d7SDag-Erling Smørgrav 			ldns_rr_list_free(rrset);
13267b5038d7SDag-Erling Smørgrav 			return NULL;
13277b5038d7SDag-Erling Smørgrav 		} else {
13287b5038d7SDag-Erling Smørgrav 			ldns_rr_list_push_rr(rrset, last_rr);
13297b5038d7SDag-Erling Smørgrav 		}
13307b5038d7SDag-Erling Smørgrav 	}
13317b5038d7SDag-Erling Smørgrav 
13327b5038d7SDag-Erling Smørgrav 	if (ldns_rr_list_rr_count(rr_list) > 0) {
13337b5038d7SDag-Erling Smørgrav 		next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1);
13347b5038d7SDag-Erling Smørgrav 	} else {
13357b5038d7SDag-Erling Smørgrav 		next_rr = NULL;
13367b5038d7SDag-Erling Smørgrav 	}
13377b5038d7SDag-Erling Smørgrav 
13387b5038d7SDag-Erling Smørgrav 	while (next_rr) {
13397b5038d7SDag-Erling Smørgrav 		if (
13407b5038d7SDag-Erling Smørgrav 			ldns_rdf_compare(ldns_rr_owner(next_rr),
13417b5038d7SDag-Erling Smørgrav 					 ldns_rr_owner(last_rr)) == 0
13427b5038d7SDag-Erling Smørgrav 			&&
13437b5038d7SDag-Erling Smørgrav 			ldns_rr_get_type(next_rr) == ldns_rr_get_type(last_rr)
13447b5038d7SDag-Erling Smørgrav 			&&
13457b5038d7SDag-Erling Smørgrav 			ldns_rr_get_class(next_rr) == ldns_rr_get_class(last_rr)
13467b5038d7SDag-Erling Smørgrav 		   ) {
13477b5038d7SDag-Erling Smørgrav 			ldns_rr_list_push_rr(rrset, ldns_rr_list_pop_rr(rr_list));
13487b5038d7SDag-Erling Smørgrav 			if (ldns_rr_list_rr_count(rr_list) > 0) {
13497b5038d7SDag-Erling Smørgrav 				last_rr = next_rr;
13507b5038d7SDag-Erling Smørgrav 				next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1);
13517b5038d7SDag-Erling Smørgrav 			} else {
13527b5038d7SDag-Erling Smørgrav 				next_rr = NULL;
13537b5038d7SDag-Erling Smørgrav 			}
13547b5038d7SDag-Erling Smørgrav 		} else {
13557b5038d7SDag-Erling Smørgrav 			next_rr = NULL;
13567b5038d7SDag-Erling Smørgrav 		}
13577b5038d7SDag-Erling Smørgrav 	}
13587b5038d7SDag-Erling Smørgrav 
13597b5038d7SDag-Erling Smørgrav 	return rrset;
13607b5038d7SDag-Erling Smørgrav }
13617b5038d7SDag-Erling Smørgrav 
13627b5038d7SDag-Erling Smørgrav ldns_rr *
13637b5038d7SDag-Erling Smørgrav ldns_rr_clone(const ldns_rr *rr)
13647b5038d7SDag-Erling Smørgrav {
13657b5038d7SDag-Erling Smørgrav 	size_t i;
13667b5038d7SDag-Erling Smørgrav 	ldns_rr *new_rr;
13677b5038d7SDag-Erling Smørgrav 
13687b5038d7SDag-Erling Smørgrav 	if (!rr) {
13697b5038d7SDag-Erling Smørgrav 		return NULL;
13707b5038d7SDag-Erling Smørgrav 	}
13717b5038d7SDag-Erling Smørgrav 
13727b5038d7SDag-Erling Smørgrav 	new_rr = ldns_rr_new();
13737b5038d7SDag-Erling Smørgrav 	if (!new_rr) {
13747b5038d7SDag-Erling Smørgrav 		return NULL;
13757b5038d7SDag-Erling Smørgrav 	}
13767b5038d7SDag-Erling Smørgrav 	if (ldns_rr_owner(rr)) {
13777b5038d7SDag-Erling Smørgrav 		ldns_rr_set_owner(new_rr, ldns_rdf_clone(ldns_rr_owner(rr)));
13787b5038d7SDag-Erling Smørgrav   	}
13797b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(new_rr, ldns_rr_ttl(rr));
13807b5038d7SDag-Erling Smørgrav 	ldns_rr_set_type(new_rr, ldns_rr_get_type(rr));
13817b5038d7SDag-Erling Smørgrav 	ldns_rr_set_class(new_rr, ldns_rr_get_class(rr));
13827b5038d7SDag-Erling Smørgrav 	ldns_rr_set_question(new_rr, ldns_rr_is_question(rr));
13837b5038d7SDag-Erling Smørgrav 
13847b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
13857b5038d7SDag-Erling Smørgrav         	if (ldns_rr_rdf(rr,i)) {
13867b5038d7SDag-Erling Smørgrav         		ldns_rr_push_rdf(new_rr, ldns_rdf_clone(ldns_rr_rdf(rr, i)));
13877b5038d7SDag-Erling Smørgrav                 }
13887b5038d7SDag-Erling Smørgrav 	}
13897b5038d7SDag-Erling Smørgrav 
13907b5038d7SDag-Erling Smørgrav 	return new_rr;
13917b5038d7SDag-Erling Smørgrav }
13927b5038d7SDag-Erling Smørgrav 
13937b5038d7SDag-Erling Smørgrav ldns_rr_list *
13947b5038d7SDag-Erling Smørgrav ldns_rr_list_clone(const ldns_rr_list *rrlist)
13957b5038d7SDag-Erling Smørgrav {
13967b5038d7SDag-Erling Smørgrav 	size_t i;
13977b5038d7SDag-Erling Smørgrav 	ldns_rr_list *new_list;
13987b5038d7SDag-Erling Smørgrav 	ldns_rr *r;
13997b5038d7SDag-Erling Smørgrav 
14007b5038d7SDag-Erling Smørgrav 	if (!rrlist) {
14017b5038d7SDag-Erling Smørgrav 		return NULL;
14027b5038d7SDag-Erling Smørgrav 	}
14037b5038d7SDag-Erling Smørgrav 
14047b5038d7SDag-Erling Smørgrav 	new_list = ldns_rr_list_new();
14057b5038d7SDag-Erling Smørgrav 	if (!new_list) {
14067b5038d7SDag-Erling Smørgrav 		return NULL;
14077b5038d7SDag-Erling Smørgrav 	}
14087b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rrlist); i++) {
14097b5038d7SDag-Erling Smørgrav 		r = ldns_rr_clone(
14107b5038d7SDag-Erling Smørgrav 			ldns_rr_list_rr(rrlist, i)
14117b5038d7SDag-Erling Smørgrav 		    );
14127b5038d7SDag-Erling Smørgrav 		if (!r) {
14137b5038d7SDag-Erling Smørgrav 			/* huh, failure in cloning */
14147b5038d7SDag-Erling Smørgrav 			ldns_rr_list_deep_free(new_list);
14157b5038d7SDag-Erling Smørgrav 			return NULL;
14167b5038d7SDag-Erling Smørgrav 		}
14177b5038d7SDag-Erling Smørgrav 		ldns_rr_list_push_rr(new_list, r);
14187b5038d7SDag-Erling Smørgrav 	}
14197b5038d7SDag-Erling Smørgrav 	return new_list;
14207b5038d7SDag-Erling Smørgrav }
14217b5038d7SDag-Erling Smørgrav 
14227b5038d7SDag-Erling Smørgrav 
14237b5038d7SDag-Erling Smørgrav static int
14247b5038d7SDag-Erling Smørgrav qsort_schwartz_rr_compare(const void *a, const void *b)
14257b5038d7SDag-Erling Smørgrav {
14267b5038d7SDag-Erling Smørgrav 	int result = 0;
14277b5038d7SDag-Erling Smørgrav 	ldns_rr *rr1, *rr2;
14287b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr1_buf, *rr2_buf;
14297b5038d7SDag-Erling Smørgrav 	struct ldns_schwartzian_compare_struct *sa = *(struct ldns_schwartzian_compare_struct **) a;
14307b5038d7SDag-Erling Smørgrav 	struct ldns_schwartzian_compare_struct *sb = *(struct ldns_schwartzian_compare_struct **) b;
14317b5038d7SDag-Erling Smørgrav 	/* if we are doing 2wire, we need to do lowercasing on the dname (and maybe on the rdata)
14327b5038d7SDag-Erling Smørgrav 	 * this must be done for comparison only, so we need to have a temp var for both buffers,
14337b5038d7SDag-Erling Smørgrav 	 * which is only used when the transformed object value isn't there yet
14347b5038d7SDag-Erling Smørgrav 	 */
14357b5038d7SDag-Erling Smørgrav 	ldns_rr *canonical_a, *canonical_b;
14367b5038d7SDag-Erling Smørgrav 
14377b5038d7SDag-Erling Smørgrav 	rr1 = (ldns_rr *) sa->original_object;
14387b5038d7SDag-Erling Smørgrav 	rr2 = (ldns_rr *) sb->original_object;
14397b5038d7SDag-Erling Smørgrav 
14407b5038d7SDag-Erling Smørgrav 	result = ldns_rr_compare_no_rdata(rr1, rr2);
14417b5038d7SDag-Erling Smørgrav 
14427b5038d7SDag-Erling Smørgrav 	if (result == 0) {
14437b5038d7SDag-Erling Smørgrav 		if (!sa->transformed_object) {
14447b5038d7SDag-Erling Smørgrav 			canonical_a = ldns_rr_clone(sa->original_object);
14457b5038d7SDag-Erling Smørgrav 			ldns_rr2canonical(canonical_a);
14467b5038d7SDag-Erling Smørgrav 			sa->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_a));
14477b5038d7SDag-Erling Smørgrav 			if (ldns_rr2buffer_wire(sa->transformed_object, canonical_a, LDNS_SECTION_ANY) != LDNS_STATUS_OK) {
14487b5038d7SDag-Erling Smørgrav 		                ldns_buffer_free((ldns_buffer *)sa->transformed_object);
14497b5038d7SDag-Erling Smørgrav                                 sa->transformed_object = NULL;
14507b5038d7SDag-Erling Smørgrav 				ldns_rr_free(canonical_a);
14517b5038d7SDag-Erling Smørgrav 				return 0;
14527b5038d7SDag-Erling Smørgrav 			}
14537b5038d7SDag-Erling Smørgrav 			ldns_rr_free(canonical_a);
14547b5038d7SDag-Erling Smørgrav 		}
14557b5038d7SDag-Erling Smørgrav 		if (!sb->transformed_object) {
14567b5038d7SDag-Erling Smørgrav 			canonical_b = ldns_rr_clone(sb->original_object);
14577b5038d7SDag-Erling Smørgrav 			ldns_rr2canonical(canonical_b);
14587b5038d7SDag-Erling Smørgrav 			sb->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_b));
14597b5038d7SDag-Erling Smørgrav 			if (ldns_rr2buffer_wire(sb->transformed_object, canonical_b, LDNS_SECTION_ANY) != LDNS_STATUS_OK) {
14607b5038d7SDag-Erling Smørgrav 		                ldns_buffer_free((ldns_buffer *)sa->transformed_object);
14617b5038d7SDag-Erling Smørgrav 		                ldns_buffer_free((ldns_buffer *)sb->transformed_object);
14627b5038d7SDag-Erling Smørgrav                                 sa->transformed_object = NULL;
14637b5038d7SDag-Erling Smørgrav                                 sb->transformed_object = NULL;
14647b5038d7SDag-Erling Smørgrav 				ldns_rr_free(canonical_b);
14657b5038d7SDag-Erling Smørgrav 				return 0;
14667b5038d7SDag-Erling Smørgrav 			}
14677b5038d7SDag-Erling Smørgrav 			ldns_rr_free(canonical_b);
14687b5038d7SDag-Erling Smørgrav 		}
14697b5038d7SDag-Erling Smørgrav 		rr1_buf = (ldns_buffer *) sa->transformed_object;
14707b5038d7SDag-Erling Smørgrav 		rr2_buf = (ldns_buffer *) sb->transformed_object;
14717b5038d7SDag-Erling Smørgrav 
14727b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_wire(rr1_buf, rr2_buf);
14737b5038d7SDag-Erling Smørgrav 	}
14747b5038d7SDag-Erling Smørgrav 
14757b5038d7SDag-Erling Smørgrav 	return result;
14767b5038d7SDag-Erling Smørgrav }
14777b5038d7SDag-Erling Smørgrav 
14787b5038d7SDag-Erling Smørgrav void
14797b5038d7SDag-Erling Smørgrav ldns_rr_list_sort(ldns_rr_list *unsorted)
14807b5038d7SDag-Erling Smørgrav {
14817b5038d7SDag-Erling Smørgrav 	struct ldns_schwartzian_compare_struct **sortables;
14827b5038d7SDag-Erling Smørgrav 	size_t item_count;
14837b5038d7SDag-Erling Smørgrav 	size_t i;
14847b5038d7SDag-Erling Smørgrav 
14857b5038d7SDag-Erling Smørgrav 	if (unsorted) {
14867b5038d7SDag-Erling Smørgrav 		item_count = ldns_rr_list_rr_count(unsorted);
14877b5038d7SDag-Erling Smørgrav 
14887b5038d7SDag-Erling Smørgrav 		sortables = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct *,
14897b5038d7SDag-Erling Smørgrav 					 item_count);
14907b5038d7SDag-Erling Smørgrav                 if(!sortables) return; /* no way to return error */
14917b5038d7SDag-Erling Smørgrav 		for (i = 0; i < item_count; i++) {
14927b5038d7SDag-Erling Smørgrav 			sortables[i] = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct, 1);
14937b5038d7SDag-Erling Smørgrav                         if(!sortables[i]) {
14947b5038d7SDag-Erling Smørgrav                                 /* free the allocated parts */
14957b5038d7SDag-Erling Smørgrav                                 while(i>0) {
14967b5038d7SDag-Erling Smørgrav                                         i--;
14977b5038d7SDag-Erling Smørgrav                                         LDNS_FREE(sortables[i]);
14987b5038d7SDag-Erling Smørgrav                                 }
14997b5038d7SDag-Erling Smørgrav                                 /* no way to return error */
15002787e39aSDag-Erling Smørgrav 				LDNS_FREE(sortables);
15017b5038d7SDag-Erling Smørgrav                                 return;
15027b5038d7SDag-Erling Smørgrav                         }
15037b5038d7SDag-Erling Smørgrav 			sortables[i]->original_object = ldns_rr_list_rr(unsorted, i);
15047b5038d7SDag-Erling Smørgrav 			sortables[i]->transformed_object = NULL;
15057b5038d7SDag-Erling Smørgrav 		}
15067b5038d7SDag-Erling Smørgrav 		qsort(sortables,
15077b5038d7SDag-Erling Smørgrav 		      item_count,
15087b5038d7SDag-Erling Smørgrav 		      sizeof(struct ldns_schwartzian_compare_struct *),
15097b5038d7SDag-Erling Smørgrav 		      qsort_schwartz_rr_compare);
15107b5038d7SDag-Erling Smørgrav 		for (i = 0; i < item_count; i++) {
15117b5038d7SDag-Erling Smørgrav 			unsorted->_rrs[i] = sortables[i]->original_object;
15127b5038d7SDag-Erling Smørgrav 			if (sortables[i]->transformed_object) {
15137b5038d7SDag-Erling Smørgrav 				ldns_buffer_free(sortables[i]->transformed_object);
15147b5038d7SDag-Erling Smørgrav 			}
15157b5038d7SDag-Erling Smørgrav 			LDNS_FREE(sortables[i]);
15167b5038d7SDag-Erling Smørgrav 		}
15177b5038d7SDag-Erling Smørgrav 		LDNS_FREE(sortables);
15187b5038d7SDag-Erling Smørgrav 	}
15197b5038d7SDag-Erling Smørgrav }
15207b5038d7SDag-Erling Smørgrav 
15217b5038d7SDag-Erling Smørgrav int
15227b5038d7SDag-Erling Smørgrav ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2)
15237b5038d7SDag-Erling Smørgrav {
15247b5038d7SDag-Erling Smørgrav 	size_t rr1_len;
15257b5038d7SDag-Erling Smørgrav 	size_t rr2_len;
15267b5038d7SDag-Erling Smørgrav         size_t offset;
15277b5038d7SDag-Erling Smørgrav 
15287b5038d7SDag-Erling Smørgrav 	assert(rr1 != NULL);
15297b5038d7SDag-Erling Smørgrav 	assert(rr2 != NULL);
15307b5038d7SDag-Erling Smørgrav 
15317b5038d7SDag-Erling Smørgrav 	rr1_len = ldns_rr_uncompressed_size(rr1);
15327b5038d7SDag-Erling Smørgrav 	rr2_len = ldns_rr_uncompressed_size(rr2);
15337b5038d7SDag-Erling Smørgrav 
15347b5038d7SDag-Erling Smørgrav 	if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) < 0) {
15357b5038d7SDag-Erling Smørgrav 		return -1;
15367b5038d7SDag-Erling Smørgrav 	} else if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) > 0) {
15377b5038d7SDag-Erling Smørgrav 		return 1;
15387b5038d7SDag-Erling Smørgrav 	}
15397b5038d7SDag-Erling Smørgrav 
15407b5038d7SDag-Erling Smørgrav         /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */
15417b5038d7SDag-Erling Smørgrav         if (ldns_rr_get_class(rr1) != ldns_rr_get_class(rr2)) {
15427b5038d7SDag-Erling Smørgrav             return ldns_rr_get_class(rr1) - ldns_rr_get_class(rr2);
15437b5038d7SDag-Erling Smørgrav         }
15447b5038d7SDag-Erling Smørgrav 
15457b5038d7SDag-Erling Smørgrav         /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */
15467b5038d7SDag-Erling Smørgrav         if (ldns_rr_get_type(rr1) != ldns_rr_get_type(rr2)) {
15477b5038d7SDag-Erling Smørgrav             return ldns_rr_get_type(rr1) - ldns_rr_get_type(rr2);
15487b5038d7SDag-Erling Smørgrav         }
15497b5038d7SDag-Erling Smørgrav 
15507b5038d7SDag-Erling Smørgrav         /* offset is the owername length + ttl + type + class + rdlen == start of wire format rdata */
15517b5038d7SDag-Erling Smørgrav         offset = ldns_rdf_size(ldns_rr_owner(rr1)) + 4 + 2 + 2 + 2;
15527b5038d7SDag-Erling Smørgrav         /* if either record doesn't have any RDATA... */
15537b5038d7SDag-Erling Smørgrav         if (offset > rr1_len || offset > rr2_len) {
15547b5038d7SDag-Erling Smørgrav             if (rr1_len == rr2_len) {
15557b5038d7SDag-Erling Smørgrav               return 0;
15567b5038d7SDag-Erling Smørgrav             }
15577b5038d7SDag-Erling Smørgrav             return ((int) rr2_len - (int) rr1_len);
15587b5038d7SDag-Erling Smørgrav         }
15597b5038d7SDag-Erling Smørgrav 
15607b5038d7SDag-Erling Smørgrav 	return 0;
15617b5038d7SDag-Erling Smørgrav }
15627b5038d7SDag-Erling Smørgrav 
15637b5038d7SDag-Erling Smørgrav int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf)
15647b5038d7SDag-Erling Smørgrav {
15657b5038d7SDag-Erling Smørgrav         size_t rr1_len, rr2_len, min_len, i, offset;
15667b5038d7SDag-Erling Smørgrav 
15677b5038d7SDag-Erling Smørgrav         rr1_len = ldns_buffer_capacity(rr1_buf);
15687b5038d7SDag-Erling Smørgrav         rr2_len = ldns_buffer_capacity(rr2_buf);
15697b5038d7SDag-Erling Smørgrav 
15707b5038d7SDag-Erling Smørgrav         /* jump past dname (checked in earlier part)
15717b5038d7SDag-Erling Smørgrav          * and especially past TTL */
15727b5038d7SDag-Erling Smørgrav         offset = 0;
15737b5038d7SDag-Erling Smørgrav         while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
15747b5038d7SDag-Erling Smørgrav           offset += *ldns_buffer_at(rr1_buf, offset) + 1;
15757b5038d7SDag-Erling Smørgrav         }
15767b5038d7SDag-Erling Smørgrav         /* jump to rdata section (PAST the rdata length field, otherwise
15777b5038d7SDag-Erling Smørgrav            rrs with different lengths might be sorted erroneously */
15787b5038d7SDag-Erling Smørgrav         offset += 11;
15797b5038d7SDag-Erling Smørgrav 	   min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
15807b5038d7SDag-Erling Smørgrav         /* Compare RRs RDATA byte for byte. */
15817b5038d7SDag-Erling Smørgrav         for(i = offset; i < min_len; i++) {
15827b5038d7SDag-Erling Smørgrav                 if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
15837b5038d7SDag-Erling Smørgrav                         return -1;
15847b5038d7SDag-Erling Smørgrav                 } else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
15857b5038d7SDag-Erling Smørgrav                         return +1;
15867b5038d7SDag-Erling Smørgrav                 }
15877b5038d7SDag-Erling Smørgrav         }
15887b5038d7SDag-Erling Smørgrav 
15897b5038d7SDag-Erling Smørgrav         /* If both RDATAs are the same up to min_len, then the shorter one sorts first. */
15907b5038d7SDag-Erling Smørgrav         if (rr1_len < rr2_len) {
15917b5038d7SDag-Erling Smørgrav                 return -1;
15927b5038d7SDag-Erling Smørgrav         } else if (rr1_len > rr2_len) {
15937b5038d7SDag-Erling Smørgrav                 return +1;
15947b5038d7SDag-Erling Smørgrav 	}
15957b5038d7SDag-Erling Smørgrav         /* The RDATAs are equal. */
15967b5038d7SDag-Erling Smørgrav         return 0;
15977b5038d7SDag-Erling Smørgrav 
15987b5038d7SDag-Erling Smørgrav }
15997b5038d7SDag-Erling Smørgrav 
16007b5038d7SDag-Erling Smørgrav int
16017b5038d7SDag-Erling Smørgrav ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2)
16027b5038d7SDag-Erling Smørgrav {
16037b5038d7SDag-Erling Smørgrav 	int result;
16047b5038d7SDag-Erling Smørgrav 	size_t rr1_len, rr2_len;
16057b5038d7SDag-Erling Smørgrav 
16067b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr1_buf;
16077b5038d7SDag-Erling Smørgrav 	ldns_buffer *rr2_buf;
16087b5038d7SDag-Erling Smørgrav 
16097b5038d7SDag-Erling Smørgrav 	result = ldns_rr_compare_no_rdata(rr1, rr2);
16107b5038d7SDag-Erling Smørgrav 	if (result == 0) {
16117b5038d7SDag-Erling Smørgrav 		rr1_len = ldns_rr_uncompressed_size(rr1);
16127b5038d7SDag-Erling Smørgrav 		rr2_len = ldns_rr_uncompressed_size(rr2);
16137b5038d7SDag-Erling Smørgrav 
16147b5038d7SDag-Erling Smørgrav 		rr1_buf = ldns_buffer_new(rr1_len);
16157b5038d7SDag-Erling Smørgrav 		rr2_buf = ldns_buffer_new(rr2_len);
16167b5038d7SDag-Erling Smørgrav 
16177b5038d7SDag-Erling Smørgrav 		if (ldns_rr2buffer_wire_canonical(rr1_buf,
16187b5038d7SDag-Erling Smørgrav 								    rr1,
16197b5038d7SDag-Erling Smørgrav 								    LDNS_SECTION_ANY)
16207b5038d7SDag-Erling Smørgrav 		    != LDNS_STATUS_OK) {
16217b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr1_buf);
16227b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr2_buf);
16237b5038d7SDag-Erling Smørgrav 			return 0;
16247b5038d7SDag-Erling Smørgrav 		}
16257b5038d7SDag-Erling Smørgrav 		if (ldns_rr2buffer_wire_canonical(rr2_buf,
16267b5038d7SDag-Erling Smørgrav 								    rr2,
16277b5038d7SDag-Erling Smørgrav 								    LDNS_SECTION_ANY)
16287b5038d7SDag-Erling Smørgrav 		    != LDNS_STATUS_OK) {
16297b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr1_buf);
16307b5038d7SDag-Erling Smørgrav 			ldns_buffer_free(rr2_buf);
16317b5038d7SDag-Erling Smørgrav 			return 0;
16327b5038d7SDag-Erling Smørgrav 		}
16337b5038d7SDag-Erling Smørgrav 
16347b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_wire(rr1_buf, rr2_buf);
16357b5038d7SDag-Erling Smørgrav 
16367b5038d7SDag-Erling Smørgrav 		ldns_buffer_free(rr1_buf);
16377b5038d7SDag-Erling Smørgrav 		ldns_buffer_free(rr2_buf);
16387b5038d7SDag-Erling Smørgrav 	}
16397b5038d7SDag-Erling Smørgrav 
16407b5038d7SDag-Erling Smørgrav 	return result;
16417b5038d7SDag-Erling Smørgrav }
16427b5038d7SDag-Erling Smørgrav 
16437b5038d7SDag-Erling Smørgrav /* convert dnskey to a ds with the given algorithm,
16447b5038d7SDag-Erling Smørgrav  * then compare the result with the given ds */
16457b5038d7SDag-Erling Smørgrav static int
16467b5038d7SDag-Erling Smørgrav ldns_rr_compare_ds_dnskey(ldns_rr *ds,
16477b5038d7SDag-Erling Smørgrav                           ldns_rr *dnskey)
16487b5038d7SDag-Erling Smørgrav {
16497b5038d7SDag-Erling Smørgrav 	ldns_rr *ds_gen;
16507b5038d7SDag-Erling Smørgrav 	bool result = false;
16517b5038d7SDag-Erling Smørgrav 	ldns_hash algo;
16527b5038d7SDag-Erling Smørgrav 
16537b5038d7SDag-Erling Smørgrav 	if (!dnskey || !ds ||
16547b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(ds) != LDNS_RR_TYPE_DS ||
16557b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(dnskey) != LDNS_RR_TYPE_DNSKEY) {
16567b5038d7SDag-Erling Smørgrav 		return false;
16577b5038d7SDag-Erling Smørgrav 	}
16587b5038d7SDag-Erling Smørgrav 
16597b5038d7SDag-Erling Smørgrav 	if (ldns_rr_rdf(ds, 2) == NULL) {
16607b5038d7SDag-Erling Smørgrav 		return false;
16617b5038d7SDag-Erling Smørgrav 	}
16627b5038d7SDag-Erling Smørgrav 	algo = ldns_rdf2native_int8(ldns_rr_rdf(ds, 2));
16637b5038d7SDag-Erling Smørgrav 
16647b5038d7SDag-Erling Smørgrav 	ds_gen = ldns_key_rr2ds(dnskey, algo);
16657b5038d7SDag-Erling Smørgrav 	if (ds_gen) {
16667b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare(ds, ds_gen) == 0;
16677b5038d7SDag-Erling Smørgrav 		ldns_rr_free(ds_gen);
16687b5038d7SDag-Erling Smørgrav 	}
16697b5038d7SDag-Erling Smørgrav 	return result;
16707b5038d7SDag-Erling Smørgrav }
16717b5038d7SDag-Erling Smørgrav 
16727b5038d7SDag-Erling Smørgrav bool
16737b5038d7SDag-Erling Smørgrav ldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2)
16747b5038d7SDag-Erling Smørgrav {
16757b5038d7SDag-Erling Smørgrav 	bool result;
16767b5038d7SDag-Erling Smørgrav 	ldns_rr *rr1 = ldns_rr_clone(orr1);
16777b5038d7SDag-Erling Smørgrav 	ldns_rr *rr2 = ldns_rr_clone(orr2);
16787b5038d7SDag-Erling Smørgrav 
16797b5038d7SDag-Erling Smørgrav 	/* set ttls to zero */
16807b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr1, 0);
16817b5038d7SDag-Erling Smørgrav 	ldns_rr_set_ttl(rr2, 0);
16827b5038d7SDag-Erling Smørgrav 
16837b5038d7SDag-Erling Smørgrav 	if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DS &&
16847b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DNSKEY) {
16857b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_ds_dnskey(rr1, rr2);
16867b5038d7SDag-Erling Smørgrav 	} else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DNSKEY &&
16877b5038d7SDag-Erling Smørgrav 	    ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DS) {
16887b5038d7SDag-Erling Smørgrav 		result = ldns_rr_compare_ds_dnskey(rr2, rr1);
16897b5038d7SDag-Erling Smørgrav 	} else {
16907b5038d7SDag-Erling Smørgrav 		result = (ldns_rr_compare(rr1, rr2) == 0);
16917b5038d7SDag-Erling Smørgrav 	}
16927b5038d7SDag-Erling Smørgrav 
16937b5038d7SDag-Erling Smørgrav 	ldns_rr_free(rr1);
16947b5038d7SDag-Erling Smørgrav 	ldns_rr_free(rr2);
16957b5038d7SDag-Erling Smørgrav 
16967b5038d7SDag-Erling Smørgrav 	return result;
16977b5038d7SDag-Erling Smørgrav }
16987b5038d7SDag-Erling Smørgrav 
16997b5038d7SDag-Erling Smørgrav int
17007b5038d7SDag-Erling Smørgrav ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2)
17017b5038d7SDag-Erling Smørgrav {
17027b5038d7SDag-Erling Smørgrav 	size_t i = 0;
17037b5038d7SDag-Erling Smørgrav 	int rr_cmp;
17047b5038d7SDag-Erling Smørgrav 
17057b5038d7SDag-Erling Smørgrav 	assert(rrl1 != NULL);
17067b5038d7SDag-Erling Smørgrav 	assert(rrl2 != NULL);
17077b5038d7SDag-Erling Smørgrav 
17087b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rrl1) && i < ldns_rr_list_rr_count(rrl2); i++) {
17097b5038d7SDag-Erling Smørgrav 		rr_cmp = ldns_rr_compare(ldns_rr_list_rr(rrl1, i), ldns_rr_list_rr(rrl2, i));
17107b5038d7SDag-Erling Smørgrav 		if (rr_cmp != 0) {
17117b5038d7SDag-Erling Smørgrav 			return rr_cmp;
17127b5038d7SDag-Erling Smørgrav 		}
17137b5038d7SDag-Erling Smørgrav 	}
17147b5038d7SDag-Erling Smørgrav 
17157b5038d7SDag-Erling Smørgrav 	if (i == ldns_rr_list_rr_count(rrl1) &&
17167b5038d7SDag-Erling Smørgrav 	    i != ldns_rr_list_rr_count(rrl2)) {
17177b5038d7SDag-Erling Smørgrav 		return 1;
17187b5038d7SDag-Erling Smørgrav 	} else if (i == ldns_rr_list_rr_count(rrl2) &&
17197b5038d7SDag-Erling Smørgrav 	           i != ldns_rr_list_rr_count(rrl1)) {
17207b5038d7SDag-Erling Smørgrav 		return -1;
17217b5038d7SDag-Erling Smørgrav 	} else {
17227b5038d7SDag-Erling Smørgrav 		return 0;
17237b5038d7SDag-Erling Smørgrav 	}
17247b5038d7SDag-Erling Smørgrav }
17257b5038d7SDag-Erling Smørgrav 
17267b5038d7SDag-Erling Smørgrav size_t
17277b5038d7SDag-Erling Smørgrav ldns_rr_uncompressed_size(const ldns_rr *r)
17287b5038d7SDag-Erling Smørgrav {
17297b5038d7SDag-Erling Smørgrav 	size_t rrsize;
17307b5038d7SDag-Erling Smørgrav 	size_t i;
17317b5038d7SDag-Erling Smørgrav 
17327b5038d7SDag-Erling Smørgrav 	rrsize = 0;
17337b5038d7SDag-Erling Smørgrav 	/* add all the rdf sizes */
17347b5038d7SDag-Erling Smørgrav 	for(i = 0; i < ldns_rr_rd_count(r); i++) {
17357b5038d7SDag-Erling Smørgrav 		rrsize += ldns_rdf_size(ldns_rr_rdf(r, i));
17367b5038d7SDag-Erling Smørgrav 	}
17377b5038d7SDag-Erling Smørgrav 	/* ownername */
17387b5038d7SDag-Erling Smørgrav 	rrsize += ldns_rdf_size(ldns_rr_owner(r));
17397b5038d7SDag-Erling Smørgrav 	rrsize += LDNS_RR_OVERHEAD;
17407b5038d7SDag-Erling Smørgrav 	return rrsize;
17417b5038d7SDag-Erling Smørgrav }
17427b5038d7SDag-Erling Smørgrav 
17437b5038d7SDag-Erling Smørgrav void
17447b5038d7SDag-Erling Smørgrav ldns_rr2canonical(ldns_rr *rr)
17457b5038d7SDag-Erling Smørgrav {
17467b5038d7SDag-Erling Smørgrav 	uint16_t i;
17477b5038d7SDag-Erling Smørgrav 
17487b5038d7SDag-Erling Smørgrav 	if (!rr) {
17497b5038d7SDag-Erling Smørgrav 	  return;
17507b5038d7SDag-Erling Smørgrav         }
17517b5038d7SDag-Erling Smørgrav 
17527b5038d7SDag-Erling Smørgrav         ldns_dname2canonical(ldns_rr_owner(rr));
17537b5038d7SDag-Erling Smørgrav 
17547b5038d7SDag-Erling Smørgrav 	/*
17557b5038d7SDag-Erling Smørgrav 	 * lowercase the rdata dnames if the rr type is one
17567b5038d7SDag-Erling Smørgrav 	 * of the list in chapter 7 of RFC3597
17577b5038d7SDag-Erling Smørgrav 	 * Also added RRSIG, because a "Signer's Name" should be canonicalized
17587b5038d7SDag-Erling Smørgrav 	 * too. See dnssec-bis-updates-16. We can add it to this list because
17597b5038d7SDag-Erling Smørgrav 	 * the "Signer's Name"  is the only dname type rdata field in a RRSIG.
17607b5038d7SDag-Erling Smørgrav 	 */
17617b5038d7SDag-Erling Smørgrav 	switch(ldns_rr_get_type(rr)) {
17627b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_NS:
17637b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MD:
17647b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MF:
17657b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_CNAME:
17667b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_SOA:
17677b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MB:
17687b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MG:
17697b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MR:
17707b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_PTR:
17717b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MINFO:
17727b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_MX:
17737b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_RP:
17747b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_AFSDB:
17757b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_RT:
17767b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_SIG:
17777b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_PX:
17787b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_NXT:
17797b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_NAPTR:
17807b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_KX:
17817b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_SRV:
17827b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_DNAME:
17837b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_A6:
17847b5038d7SDag-Erling Smørgrav         	case LDNS_RR_TYPE_RRSIG:
17857b5038d7SDag-Erling Smørgrav 			for (i = 0; i < ldns_rr_rd_count(rr); i++) {
17867b5038d7SDag-Erling Smørgrav 				ldns_dname2canonical(ldns_rr_rdf(rr, i));
17877b5038d7SDag-Erling Smørgrav 			}
17887b5038d7SDag-Erling Smørgrav 			return;
17897b5038d7SDag-Erling Smørgrav 		default:
17907b5038d7SDag-Erling Smørgrav 			/* do nothing */
17917b5038d7SDag-Erling Smørgrav 			return;
17927b5038d7SDag-Erling Smørgrav 	}
17937b5038d7SDag-Erling Smørgrav }
17947b5038d7SDag-Erling Smørgrav 
17957b5038d7SDag-Erling Smørgrav void
17967b5038d7SDag-Erling Smørgrav ldns_rr_list2canonical(ldns_rr_list *rr_list)
17977b5038d7SDag-Erling Smørgrav {
17987b5038d7SDag-Erling Smørgrav 	size_t i;
17997b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) {
18007b5038d7SDag-Erling Smørgrav 		ldns_rr2canonical(ldns_rr_list_rr(rr_list, i));
18017b5038d7SDag-Erling Smørgrav 	}
18027b5038d7SDag-Erling Smørgrav }
18037b5038d7SDag-Erling Smørgrav 
18047b5038d7SDag-Erling Smørgrav uint8_t
18057b5038d7SDag-Erling Smørgrav ldns_rr_label_count(ldns_rr *rr)
18067b5038d7SDag-Erling Smørgrav {
18077b5038d7SDag-Erling Smørgrav 	if (!rr) {
18087b5038d7SDag-Erling Smørgrav 		return 0;
18097b5038d7SDag-Erling Smørgrav 	}
18107b5038d7SDag-Erling Smørgrav 	return ldns_dname_label_count(
18117b5038d7SDag-Erling Smørgrav 			ldns_rr_owner(rr));
18127b5038d7SDag-Erling Smørgrav }
18137b5038d7SDag-Erling Smørgrav 
18147b5038d7SDag-Erling Smørgrav /** \cond */
18157b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN };
18167b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A };
18177b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ns_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18187b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_md_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18197b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mf_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18207b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_cname_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18217b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_soa_wireformat[] = {
18227b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_INT32,
18237b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD,
18247b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_PERIOD
18257b5038d7SDag-Erling Smørgrav };
18267b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mb_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18277b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mg_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18287b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mr_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18297b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_wks_wireformat[] = {
18307b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_A, LDNS_RDF_TYPE_WKS
18317b5038d7SDag-Erling Smørgrav };
18327b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ptr_wireformat[] = { LDNS_RDF_TYPE_DNAME };
18337b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_hinfo_wireformat[] = {
18347b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR
18357b5038d7SDag-Erling Smørgrav };
18367b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_minfo_wireformat[] = {
18377b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
18387b5038d7SDag-Erling Smørgrav };
18397b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mx_wireformat[] = {
18407b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18417b5038d7SDag-Erling Smørgrav };
18427b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rp_wireformat[] = {
18437b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
18447b5038d7SDag-Erling Smørgrav };
18457b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_afsdb_wireformat[] = {
18467b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18477b5038d7SDag-Erling Smørgrav };
18487b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_x25_wireformat[] = { LDNS_RDF_TYPE_STR };
18497b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_isdn_wireformat[] = {
18507b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR
18517b5038d7SDag-Erling Smørgrav };
18527b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rt_wireformat[] = {
18537b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18547b5038d7SDag-Erling Smørgrav };
18557b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsap_wireformat[] = {
18567b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_NSAP
18577b5038d7SDag-Erling Smørgrav };
18587b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsap_ptr_wireformat[] = {
18597b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR
18607b5038d7SDag-Erling Smørgrav };
18617b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sig_wireformat[] = {
18627b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32,
18637b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16,
18647b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64
18657b5038d7SDag-Erling Smørgrav };
18667b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_key_wireformat[] = {
18677b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64
18687b5038d7SDag-Erling Smørgrav };
18697b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_px_wireformat[] = {
18707b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
18717b5038d7SDag-Erling Smørgrav };
18727b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_gpos_wireformat[] = {
1873*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR
18747b5038d7SDag-Erling Smørgrav };
18757b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA };
18767b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC };
18777b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nxt_wireformat[] = {
18787b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_UNKNOWN
18797b5038d7SDag-Erling Smørgrav };
18807b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_eid_wireformat[] = {
18817b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_HEX
18827b5038d7SDag-Erling Smørgrav };
18837b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nimloc_wireformat[] = {
18847b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_HEX
18857b5038d7SDag-Erling Smørgrav };
18867b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_srv_wireformat[] = {
18877b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18887b5038d7SDag-Erling Smørgrav };
18897b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_atma_wireformat[] = {
18907b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ATMA
18917b5038d7SDag-Erling Smørgrav };
18927b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_naptr_wireformat[] = {
18937b5038d7SDag-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
18947b5038d7SDag-Erling Smørgrav };
18957b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_kx_wireformat[] = {
18967b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
18977b5038d7SDag-Erling Smørgrav };
18987b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_cert_wireformat[] = {
18997b5038d7SDag-Erling Smørgrav 	 LDNS_RDF_TYPE_CERT_ALG, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_B64
19007b5038d7SDag-Erling Smørgrav };
19017b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_a6_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN };
19027b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME };
19037b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sink_wireformat[] = { LDNS_RDF_TYPE_INT8,
19047b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64
19057b5038d7SDag-Erling Smørgrav };
19067b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_apl_wireformat[] = {
19077b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_APL
19087b5038d7SDag-Erling Smørgrav };
19097b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ds_wireformat[] = {
19107b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX
19117b5038d7SDag-Erling Smørgrav };
19127b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sshfp_wireformat[] = {
19137b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX
19147b5038d7SDag-Erling Smørgrav };
19157b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ipseckey_wireformat[] = {
19167b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_IPSECKEY
19177b5038d7SDag-Erling Smørgrav };
19187b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rrsig_wireformat[] = {
19197b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32,
19207b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64
19217b5038d7SDag-Erling Smørgrav };
19227b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec_wireformat[] = {
19237b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_NSEC
19247b5038d7SDag-Erling Smørgrav };
19257b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dhcid_wireformat[] = {
19267b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_B64
19277b5038d7SDag-Erling Smørgrav };
19287b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_talink_wireformat[] = {
19297b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME
19307b5038d7SDag-Erling Smørgrav };
19317b5038d7SDag-Erling Smørgrav /* nsec3 is some vars, followed by same type of data of nsec */
19327b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec3_wireformat[] = {
19337b5038d7SDag-Erling Smørgrav /*	LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/
19347b5038d7SDag-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
19357b5038d7SDag-Erling Smørgrav };
19367b5038d7SDag-Erling Smørgrav 
19377b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec3param_wireformat[] = {
19387b5038d7SDag-Erling Smørgrav /*	LDNS_RDF_TYPE_NSEC3_PARAMS_VARS*/
19397b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19407b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19417b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
19427b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_NSEC3_SALT
19437b5038d7SDag-Erling Smørgrav };
19447b5038d7SDag-Erling Smørgrav 
19457b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dnskey_wireformat[] = {
19467b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
19477b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19487b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ALG,
19497b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_B64
19507b5038d7SDag-Erling Smørgrav };
1951*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_tkey_wireformat[] = {
1952*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME,
1953*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME,
1954*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TIME,
1955*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
1956*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
1957*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA,
1958*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA,
1959*17d15b25SDag-Erling Smørgrav };
19607b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_tsig_wireformat[] = {
19617b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME,
19627b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TSIGTIME,
19637b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
19647b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA,
19657b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
19667b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
19677b5038d7SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16_DATA
19687b5038d7SDag-Erling Smørgrav };
19692787e39aSDag-Erling Smørgrav static const ldns_rdf_type type_tlsa_wireformat[] = {
19702787e39aSDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19712787e39aSDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19722787e39aSDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
19732787e39aSDag-Erling Smørgrav 	LDNS_RDF_TYPE_HEX
19742787e39aSDag-Erling Smørgrav };
1975*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_hip_wireformat[] = {
1976*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_HIP
1977*17d15b25SDag-Erling Smørgrav };
1978*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_nid_wireformat[] = {
1979*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
1980*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ILNP64
1981*17d15b25SDag-Erling Smørgrav };
1982*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_l32_wireformat[] = {
1983*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
1984*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_A
1985*17d15b25SDag-Erling Smørgrav };
1986*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_l64_wireformat[] = {
1987*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
1988*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_ILNP64
1989*17d15b25SDag-Erling Smørgrav };
1990*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_lp_wireformat[] = {
1991*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
1992*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_DNAME
1993*17d15b25SDag-Erling Smørgrav };
1994*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_eui48_wireformat[] = {
1995*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_EUI48
1996*17d15b25SDag-Erling Smørgrav };
1997*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_eui64_wireformat[] = {
1998*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_EUI64
1999*17d15b25SDag-Erling Smørgrav };
2000*17d15b25SDag-Erling Smørgrav #ifdef RRTYPE_URI
2001*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_uri_wireformat[] = {
2002*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
2003*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT16,
2004*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_LONG_STR
2005*17d15b25SDag-Erling Smørgrav };
2006*17d15b25SDag-Erling Smørgrav #endif
2007*17d15b25SDag-Erling Smørgrav static const ldns_rdf_type type_caa_wireformat[] = {
2008*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_INT8,
2009*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_TAG,
2010*17d15b25SDag-Erling Smørgrav 	LDNS_RDF_TYPE_LONG_STR
2011*17d15b25SDag-Erling Smørgrav };
20127b5038d7SDag-Erling Smørgrav /** \endcond */
20137b5038d7SDag-Erling Smørgrav 
20147b5038d7SDag-Erling Smørgrav /** \cond */
20157b5038d7SDag-Erling Smørgrav /* All RR's defined in 1035 are well known and can thus
20167b5038d7SDag-Erling Smørgrav  * be compressed. See RFC3597. These RR's are:
20177b5038d7SDag-Erling Smørgrav  * CNAME HINFO MB MD MF MG MINFO MR MX NULL NS PTR SOA TXT
20187b5038d7SDag-Erling Smørgrav  */
20197b5038d7SDag-Erling Smørgrav static ldns_rr_descriptor rdata_field_descriptors[] = {
20207b5038d7SDag-Erling Smørgrav 	/* 0 */
20217b5038d7SDag-Erling Smørgrav 	{ 0, NULL, 0, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20227b5038d7SDag-Erling Smørgrav 	/* 1 */
20237b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_A, "A", 1, 1, type_a_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20247b5038d7SDag-Erling Smørgrav 	/* 2 */
20257b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NS, "NS", 1, 1, type_ns_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20267b5038d7SDag-Erling Smørgrav 	/* 3 */
20277b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MD, "MD", 1, 1, type_md_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20287b5038d7SDag-Erling Smørgrav 	/* 4 */
20297b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MF, "MF", 1, 1, type_mf_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20307b5038d7SDag-Erling Smørgrav 	/* 5 */
20317b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20327b5038d7SDag-Erling Smørgrav 	/* 6 */
20337b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 },
20347b5038d7SDag-Erling Smørgrav 	/* 7 */
20357b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MB, "MB", 1, 1, type_mb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20367b5038d7SDag-Erling Smørgrav 	/* 8 */
20377b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MG, "MG", 1, 1, type_mg_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20387b5038d7SDag-Erling Smørgrav 	/* 9 */
20397b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MR, "MR", 1, 1, type_mr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20407b5038d7SDag-Erling Smørgrav 	/* 10 */
20417b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NULL, "NULL", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20427b5038d7SDag-Erling Smørgrav 	/* 11 */
20437b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20447b5038d7SDag-Erling Smørgrav 	/* 12 */
20457b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20467b5038d7SDag-Erling Smørgrav 	/* 13 */
20477b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20487b5038d7SDag-Erling Smørgrav 	/* 14 */
20497b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 },
20507b5038d7SDag-Erling Smørgrav 	/* 15 */
20517b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_MX, "MX", 2, 2, type_mx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
20527b5038d7SDag-Erling Smørgrav 	/* 16 */
20537b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TXT, "TXT", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
20547b5038d7SDag-Erling Smørgrav 	/* 17 */
20557b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RP, "RP", 2, 2, type_rp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
20567b5038d7SDag-Erling Smørgrav 	/* 18 */
20577b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
20587b5038d7SDag-Erling Smørgrav 	/* 19 */
20597b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_X25, "X25", 1, 1, type_x25_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20607b5038d7SDag-Erling Smørgrav 	/* 20 */
20617b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20627b5038d7SDag-Erling Smørgrav 	/* 21 */
20637b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RT, "RT", 2, 2, type_rt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
20647b5038d7SDag-Erling Smørgrav 	/* 22 */
20657b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSAP, "NSAP", 1, 1, type_nsap_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20667b5038d7SDag-Erling Smørgrav 	/* 23 */
20677b5038d7SDag-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 },
20687b5038d7SDag-Erling Smørgrav 	/* 24 */
20697b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
20707b5038d7SDag-Erling Smørgrav 	/* 25 */
20717b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_KEY, "KEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20727b5038d7SDag-Erling Smørgrav 	/* 26 */
20737b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_PX, "PX", 3, 3, type_px_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
20747b5038d7SDag-Erling Smørgrav 	/* 27 */
2075*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_GPOS, "GPOS", 3, 3, type_gpos_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20767b5038d7SDag-Erling Smørgrav 	/* 28 */
20777b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20787b5038d7SDag-Erling Smørgrav 	/* 29 */
20797b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20807b5038d7SDag-Erling Smørgrav 	/* 30 */
20817b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
20827b5038d7SDag-Erling Smørgrav 	/* 31 */
20837b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_EID, "EID", 1, 1, type_eid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20847b5038d7SDag-Erling Smørgrav 	/* 32 */
20857b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NIMLOC, "NIMLOC", 1, 1, type_nimloc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20867b5038d7SDag-Erling Smørgrav 	/* 33 */
20877b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
20887b5038d7SDag-Erling Smørgrav 	/* 34 */
20897b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_ATMA, "ATMA", 1, 1, type_atma_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20907b5038d7SDag-Erling Smørgrav 	/* 35 */
20917b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
20927b5038d7SDag-Erling Smørgrav 	/* 36 */
20937b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_KX, "KX", 2, 2, type_kx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
20947b5038d7SDag-Erling Smørgrav 	/* 37 */
20957b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20967b5038d7SDag-Erling Smørgrav 	/* 38 */
20977b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_A6, "A6", 1, 1, type_a6_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
20987b5038d7SDag-Erling Smørgrav 	/* 39 */
20997b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21007b5038d7SDag-Erling Smørgrav 	/* 40 */
21017b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SINK, "SINK", 1, 1, type_sink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21027b5038d7SDag-Erling Smørgrav 	/* 41 */
21037b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21047b5038d7SDag-Erling Smørgrav 	/* 42 */
21057b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL, LDNS_RR_NO_COMPRESS, 0 },
21067b5038d7SDag-Erling Smørgrav 	/* 43 */
21077b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21087b5038d7SDag-Erling Smørgrav 	/* 44 */
21097b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21107b5038d7SDag-Erling Smørgrav 	/* 45 */
21117b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_IPSECKEY, "IPSECKEY", 1, 1, type_ipseckey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21127b5038d7SDag-Erling Smørgrav 	/* 46 */
21137b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21147b5038d7SDag-Erling Smørgrav 	/* 47 */
2115*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSEC, "NSEC", 1, 2, type_nsec_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
21167b5038d7SDag-Erling Smørgrav 	/* 48 */
21177b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21187b5038d7SDag-Erling Smørgrav 	/* 49 */
21197b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DHCID, "DHCID", 1, 1, type_dhcid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21207b5038d7SDag-Erling Smørgrav 	/* 50 */
21217b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSEC3, "NSEC3", 5, 6, type_nsec3_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21227b5038d7SDag-Erling Smørgrav 	/* 51 */
21237b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21247b5038d7SDag-Erling Smørgrav 	/* 52 */
21252787e39aSDag-Erling Smørgrav 	{LDNS_RR_TYPE_TLSA, "TLSA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21262787e39aSDag-Erling Smørgrav 
21277b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE53", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21287b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2129*17d15b25SDag-Erling Smørgrav 
2130*17d15b25SDag-Erling Smørgrav 	/* 55
2131*17d15b25SDag-Erling Smørgrav 	 * Hip ends with 0 or more Rendezvous Servers represented as dname's.
2132*17d15b25SDag-Erling Smørgrav 	 * Hence the LDNS_RDF_TYPE_DNAME _variable field and the _maximum field
2133*17d15b25SDag-Erling Smørgrav 	 * set to 0.
2134*17d15b25SDag-Erling Smørgrav 	 */
2135*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_HIP, "HIP", 1, 1, type_hip_wireformat, LDNS_RDF_TYPE_DNAME, LDNS_RR_NO_COMPRESS, 0 },
2136*17d15b25SDag-Erling Smørgrav 
2137*17d15b25SDag-Erling Smørgrav #ifdef RRTYPE_NINFO
2138*17d15b25SDag-Erling Smørgrav 	/* 56 */
2139*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NINFO, "NINFO", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2140*17d15b25SDag-Erling Smørgrav #else
21417b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE56", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2142*17d15b25SDag-Erling Smørgrav #endif
2143*17d15b25SDag-Erling Smørgrav #ifdef RRTYPE_RKEY
2144*17d15b25SDag-Erling Smørgrav 	/* 57 */
2145*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_RKEY, "RKEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2146*17d15b25SDag-Erling Smørgrav #else
21477b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE57", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2148*17d15b25SDag-Erling Smørgrav #endif
21497b5038d7SDag-Erling Smørgrav 	/* 58 */
21507b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TALINK, "TALINK", 2, 2, type_talink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
2151*17d15b25SDag-Erling Smørgrav 
2152*17d15b25SDag-Erling Smørgrav #ifdef RRTYPE_CDS
2153*17d15b25SDag-Erling Smørgrav 	/* 59 */
2154*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CDS, "CDS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2155*17d15b25SDag-Erling Smørgrav #else
21567b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE59", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2157*17d15b25SDag-Erling Smørgrav #endif
2158*17d15b25SDag-Erling Smørgrav 
21597b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE60", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21607b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE61", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21617b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE62", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21627b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE63", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21637b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21647b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21657b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21667b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21677b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21687b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE69", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21697b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE70", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21707b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE71", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21717b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE72", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21727b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE73", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21737b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE74", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21747b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE75", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21757b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE76", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21767b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE77", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21777b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE78", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21787b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE79", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21797b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE80", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21807b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE81", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21817b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE82", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21827b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE83", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21837b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE84", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21847b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE85", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21857b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE86", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21867b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE87", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21877b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE88", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21887b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE89", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21897b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE90", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21907b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE91", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21917b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE92", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21927b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE93", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21937b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE94", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21947b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE95", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21957b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE96", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21967b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE97", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
21977b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE98", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2198*17d15b25SDag-Erling Smørgrav 
2199*17d15b25SDag-Erling Smørgrav 	/* 99 */
22007b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_SPF,  "SPF", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2201*17d15b25SDag-Erling Smørgrav 
2202*17d15b25SDag-Erling Smørgrav 	/* UINFO  [IANA-Reserved] */
22037b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE100", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2204*17d15b25SDag-Erling Smørgrav 	/* UID    [IANA-Reserved] */
22057b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE101", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2206*17d15b25SDag-Erling Smørgrav 	/* GID    [IANA-Reserved] */
22077b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE102", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2208*17d15b25SDag-Erling Smørgrav 	/* UNSPEC [IANA-Reserved] */
22097b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE103", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2210*17d15b25SDag-Erling Smørgrav 
2211*17d15b25SDag-Erling Smørgrav 	/* 104 */
2212*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_NID, "NID", 2, 2, type_nid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2213*17d15b25SDag-Erling Smørgrav 	/* 105 */
2214*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_L32, "L32", 2, 2, type_l32_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2215*17d15b25SDag-Erling Smørgrav 	/* 106 */
2216*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_L64, "L64", 2, 2, type_l64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2217*17d15b25SDag-Erling Smørgrav 	/* 107 */
2218*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_LP, "LP", 2, 2, type_lp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2219*17d15b25SDag-Erling Smørgrav 	/* 108 */
2220*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_EUI48, "EUI48", 1, 1, type_eui48_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2221*17d15b25SDag-Erling Smørgrav 	/* 109 */
2222*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_EUI64, "EUI64", 1, 1, type_eui64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2223*17d15b25SDag-Erling Smørgrav 
22247b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE110", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22257b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE111", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22267b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE112", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22277b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE113", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22287b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE114", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22297b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE115", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22307b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE116", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22317b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE117", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22327b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE118", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22337b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE119", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22347b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE120", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22357b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE121", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22367b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE122", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22377b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE123", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22387b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE124", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22397b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE125", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22407b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE126", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22417b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE127", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22427b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE128", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22437b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE129", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22447b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE130", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22457b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE131", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22467b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE132", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22477b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE133", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22487b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE134", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22497b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE135", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22507b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE136", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22517b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE137", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22527b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE138", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22537b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE139", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22547b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE140", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22557b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE141", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22567b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE142", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22577b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE143", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22587b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE144", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22597b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE145", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22607b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE146", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22617b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE147", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22627b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE148", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22637b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE149", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22647b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE150", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22657b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE151", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22667b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE152", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22677b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE153", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22687b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE154", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22697b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE155", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22707b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE156", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22717b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE157", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22727b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE158", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22737b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE159", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22747b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE160", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22757b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE161", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22767b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE162", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22777b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE163", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22787b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE164", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22797b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE165", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22807b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE166", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22817b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE167", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22827b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE168", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22837b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE169", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22847b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE170", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22857b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE171", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22867b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE172", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22877b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE173", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22887b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE174", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22897b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE175", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22907b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE176", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22917b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE177", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22927b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE178", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22937b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE179", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22947b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE180", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22957b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE181", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22967b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE182", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22977b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE183", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22987b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE184", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
22997b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE185", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23007b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE186", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23017b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE187", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23027b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE188", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23037b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE189", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23047b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE190", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23057b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE191", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23067b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE192", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23077b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE193", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23087b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE194", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23097b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE195", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23107b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE196", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23117b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE197", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23127b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE198", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23137b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE199", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23147b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE200", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23157b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE201", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23167b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE202", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23177b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE203", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23187b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE204", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23197b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE205", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23207b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE206", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23217b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE207", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23227b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE208", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23237b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE209", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23247b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE210", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23257b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE211", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23267b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE212", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23277b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE213", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23287b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE214", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23297b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE215", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23307b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE216", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23317b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE217", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23327b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE218", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23337b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE219", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23347b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE220", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23357b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE221", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23367b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE222", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23377b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE223", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23387b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE224", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23397b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE225", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23407b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE226", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23417b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE227", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23427b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE228", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23437b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE229", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23447b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE230", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23457b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE231", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23467b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE232", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23477b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE233", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23487b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE234", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23497b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE235", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23507b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE236", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23517b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE237", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23527b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE238", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23537b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE239", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23547b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE240", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23557b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE241", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23567b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE242", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23577b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE243", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23587b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE244", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23597b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE245", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23607b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE246", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23617b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE247", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
23627b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE248", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2363*17d15b25SDag-Erling Smørgrav 
2364*17d15b25SDag-Erling Smørgrav 	/* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one.
2365*17d15b25SDag-Erling Smørgrav 	 * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9.
23667b5038d7SDag-Erling Smørgrav 	 */
2367*17d15b25SDag-Erling Smørgrav 	/* 249 */
2368*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TKEY, "TKEY", 7, 7, type_tkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2369*17d15b25SDag-Erling Smørgrav 	/* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one.
2370*17d15b25SDag-Erling Smørgrav 	 * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9.
2371*17d15b25SDag-Erling Smørgrav 	 */
2372*17d15b25SDag-Erling Smørgrav 	/* 250 */
2373*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TSIG, "TSIG", 7, 7, type_tsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2374*17d15b25SDag-Erling Smørgrav 
2375*17d15b25SDag-Erling Smørgrav 	/* IXFR: A request for a transfer of an incremental zone transfer */
2376*17d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE251", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2377*17d15b25SDag-Erling Smørgrav 	/* AXFR: A request for a transfer of an entire zone */
2378*17d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE252", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2379*17d15b25SDag-Erling Smørgrav 	/* MAILB: A request for mailbox-related records (MB, MG or MR) */
2380*17d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE253", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2381*17d15b25SDag-Erling Smørgrav 	/* MAILA: A request for mail agent RRs (Obsolete - see MX) */
2382*17d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE254", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2383*17d15b25SDag-Erling Smørgrav 	/* ANY: A request for all (available) records */
2384*17d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE255", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2385*17d15b25SDag-Erling Smørgrav 
2386*17d15b25SDag-Erling Smørgrav #ifdef RRTYPE_URI
2387*17d15b25SDag-Erling Smørgrav 	/* 256 */
2388*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_URI, "URI", 3, 3, type_uri_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2389*17d15b25SDag-Erling Smørgrav #else
2390*17d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE256", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2391*17d15b25SDag-Erling Smørgrav #endif
2392*17d15b25SDag-Erling Smørgrav 	/* 257 */
2393*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_CAA, "CAA", 3, 3, type_caa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2394*17d15b25SDag-Erling Smørgrav 
23957b5038d7SDag-Erling Smørgrav /* split in array, no longer contiguous */
2396*17d15b25SDag-Erling Smørgrav 
2397*17d15b25SDag-Erling Smørgrav #ifdef RRTYPE_TA
2398*17d15b25SDag-Erling Smørgrav 	/* 32768 */
2399*17d15b25SDag-Erling Smørgrav 	{LDNS_RR_TYPE_TA, "TA", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2400*17d15b25SDag-Erling Smørgrav #else
2401*17d15b25SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE32768", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2402*17d15b25SDag-Erling Smørgrav #endif
2403*17d15b25SDag-Erling Smørgrav 	/* 32769 */
24047b5038d7SDag-Erling Smørgrav 	{LDNS_RR_TYPE_DLV, "DLV", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }
24057b5038d7SDag-Erling Smørgrav };
24067b5038d7SDag-Erling Smørgrav /** \endcond */
24077b5038d7SDag-Erling Smørgrav 
24087b5038d7SDag-Erling Smørgrav /**
24097b5038d7SDag-Erling Smørgrav  * \def LDNS_RDATA_FIELD_DESCRIPTORS_COUNT
24107b5038d7SDag-Erling Smørgrav  * computes the number of rdata fields
24117b5038d7SDag-Erling Smørgrav  */
24127b5038d7SDag-Erling Smørgrav #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
24137b5038d7SDag-Erling Smørgrav 	(sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
24147b5038d7SDag-Erling Smørgrav 
2415*17d15b25SDag-Erling Smørgrav 
2416*17d15b25SDag-Erling Smørgrav /*---------------------------------------------------------------------------*
2417*17d15b25SDag-Erling Smørgrav  * The functions below return an bitmap RDF with the space required to set
2418*17d15b25SDag-Erling Smørgrav  * or unset all known RR types. Arguably these functions are better situated
2419*17d15b25SDag-Erling Smørgrav  * in rdata.c, however for the space calculation it is necesarry to walk
2420*17d15b25SDag-Erling Smørgrav  * through rdata_field_descriptors which is not easily possible from anywhere
2421*17d15b25SDag-Erling Smørgrav  * other than rr.c where it is declared static.
2422*17d15b25SDag-Erling Smørgrav  *
2423*17d15b25SDag-Erling Smørgrav  * Alternatively rr.c could have provided an iterator for rr_type or
2424*17d15b25SDag-Erling Smørgrav  * rdf_descriptors, but this seemed overkill for internal use only.
2425*17d15b25SDag-Erling Smørgrav  */
2426*17d15b25SDag-Erling Smørgrav static ldns_rr_descriptor* rdata_field_descriptors_end =
2427*17d15b25SDag-Erling Smørgrav 	&rdata_field_descriptors[LDNS_RDATA_FIELD_DESCRIPTORS_COUNT];
2428*17d15b25SDag-Erling Smørgrav 
2429*17d15b25SDag-Erling Smørgrav /* From RFC3845:
2430*17d15b25SDag-Erling Smørgrav  *
2431*17d15b25SDag-Erling Smørgrav  * 2.1.2.  The List of Type Bit Map(s) Field
2432*17d15b25SDag-Erling Smørgrav  *
2433*17d15b25SDag-Erling Smørgrav  *    The RR type space is split into 256 window blocks, each representing
2434*17d15b25SDag-Erling Smørgrav  *    the low-order 8 bits of the 16-bit RR type space.  Each block that
2435*17d15b25SDag-Erling Smørgrav  *    has at least one active RR type is encoded using a single octet
2436*17d15b25SDag-Erling Smørgrav  *    window number (from 0 to 255), a single octet bitmap length (from 1
2437*17d15b25SDag-Erling Smørgrav  *    to 32) indicating the number of octets used for the window block's
2438*17d15b25SDag-Erling Smørgrav  *    bitmap, and up to 32 octets (256 bits) of bitmap.
2439*17d15b25SDag-Erling Smørgrav  *
2440*17d15b25SDag-Erling Smørgrav  *    Window blocks are present in the NSEC RR RDATA in increasing
2441*17d15b25SDag-Erling Smørgrav  *    numerical order.
2442*17d15b25SDag-Erling Smørgrav  *
2443*17d15b25SDag-Erling Smørgrav  *    "|" denotes concatenation
2444*17d15b25SDag-Erling Smørgrav  *
2445*17d15b25SDag-Erling Smørgrav  *    Type Bit Map(s) Field = ( Window Block # | Bitmap Length | Bitmap ) +
2446*17d15b25SDag-Erling Smørgrav  *
2447*17d15b25SDag-Erling Smørgrav  *    <cut>
2448*17d15b25SDag-Erling Smørgrav  *
2449*17d15b25SDag-Erling Smørgrav  *    Blocks with no types present MUST NOT be included.  Trailing zero
2450*17d15b25SDag-Erling Smørgrav  *    octets in the bitmap MUST be omitted.  The length of each block's
2451*17d15b25SDag-Erling Smørgrav  *    bitmap is determined by the type code with the largest numerical
2452*17d15b25SDag-Erling Smørgrav  *    value within that block, among the set of RR types present at the
2453*17d15b25SDag-Erling Smørgrav  *    NSEC RR's owner name.  Trailing zero octets not specified MUST be
2454*17d15b25SDag-Erling Smørgrav  *    interpreted as zero octets.
2455*17d15b25SDag-Erling Smørgrav  */
2456*17d15b25SDag-Erling Smørgrav static ldns_status
2457*17d15b25SDag-Erling Smørgrav ldns_rdf_bitmap_known_rr_types_set(ldns_rdf** rdf, int value)
2458*17d15b25SDag-Erling Smørgrav {
2459*17d15b25SDag-Erling Smørgrav 	uint8_t  window;		/*  most significant octet of type */
2460*17d15b25SDag-Erling Smørgrav 	uint8_t  subtype;		/* least significant octet of type */
2461*17d15b25SDag-Erling Smørgrav 	uint16_t windows[256]		/* Max subtype per window */
2462*17d15b25SDag-Erling Smørgrav #ifndef S_SPLINT_S
2463*17d15b25SDag-Erling Smørgrav 	                      = { 0 }
2464*17d15b25SDag-Erling Smørgrav #endif
2465*17d15b25SDag-Erling Smørgrav 	                             ;
2466*17d15b25SDag-Erling Smørgrav 	ldns_rr_descriptor* d;	/* used to traverse rdata_field_descriptors */
2467*17d15b25SDag-Erling Smørgrav 	size_t i;		/* used to traverse windows array */
2468*17d15b25SDag-Erling Smørgrav 
2469*17d15b25SDag-Erling Smørgrav 	size_t sz;			/* size needed for type bitmap rdf */
2470*17d15b25SDag-Erling Smørgrav 	uint8_t* data = NULL;		/* rdf data */
2471*17d15b25SDag-Erling Smørgrav 	uint8_t* dptr;			/* used to itraverse rdf data */
2472*17d15b25SDag-Erling Smørgrav 
2473*17d15b25SDag-Erling Smørgrav 	assert(rdf != NULL);
2474*17d15b25SDag-Erling Smørgrav 
2475*17d15b25SDag-Erling Smørgrav 	/* Which windows need to be in the bitmap rdf?
2476*17d15b25SDag-Erling Smørgrav 	 */
2477*17d15b25SDag-Erling Smørgrav 	for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) {
2478*17d15b25SDag-Erling Smørgrav 		window  = d->_type >> 8;
2479*17d15b25SDag-Erling Smørgrav 		subtype = d->_type & 0xff;
2480*17d15b25SDag-Erling Smørgrav 		if (windows[window] < subtype) {
2481*17d15b25SDag-Erling Smørgrav 			windows[window] = subtype;
2482*17d15b25SDag-Erling Smørgrav 		}
2483*17d15b25SDag-Erling Smørgrav 	}
2484*17d15b25SDag-Erling Smørgrav 
2485*17d15b25SDag-Erling Smørgrav 	/* How much space do we need in the rdf for those windows?
2486*17d15b25SDag-Erling Smørgrav 	 */
2487*17d15b25SDag-Erling Smørgrav 	sz = 0;
2488*17d15b25SDag-Erling Smørgrav 	for (i = 0; i < 256; i++) {
2489*17d15b25SDag-Erling Smørgrav 		if (windows[i]) {
2490*17d15b25SDag-Erling Smørgrav 			sz += windows[i] / 8 + 3;
2491*17d15b25SDag-Erling Smørgrav 		}
2492*17d15b25SDag-Erling Smørgrav 	}
2493*17d15b25SDag-Erling Smørgrav 	if (sz > 0) {
2494*17d15b25SDag-Erling Smørgrav 		/* Format rdf data according RFC3845 Section 2.1.2 (see above)
2495*17d15b25SDag-Erling Smørgrav 		 */
2496*17d15b25SDag-Erling Smørgrav 		dptr = data = LDNS_XMALLOC(uint8_t, sz);
2497*17d15b25SDag-Erling Smørgrav 		memset(data, value, sz);
2498*17d15b25SDag-Erling Smørgrav 		if (!data) {
2499*17d15b25SDag-Erling Smørgrav 			return LDNS_STATUS_MEM_ERR;
2500*17d15b25SDag-Erling Smørgrav 		}
2501*17d15b25SDag-Erling Smørgrav 		for (i = 0; i < 256; i++) {
2502*17d15b25SDag-Erling Smørgrav 			if (windows[i]) {
2503*17d15b25SDag-Erling Smørgrav 				*dptr++ = (uint8_t)i;
2504*17d15b25SDag-Erling Smørgrav 				*dptr++ = (uint8_t)(windows[i] / 8 + 1);
2505*17d15b25SDag-Erling Smørgrav 				dptr += dptr[-1];
2506*17d15b25SDag-Erling Smørgrav 			}
2507*17d15b25SDag-Erling Smørgrav 		}
2508*17d15b25SDag-Erling Smørgrav 	}
2509*17d15b25SDag-Erling Smørgrav 	/* Allocate and return rdf structure for the data
2510*17d15b25SDag-Erling Smørgrav 	 */
2511*17d15b25SDag-Erling Smørgrav 	*rdf = ldns_rdf_new(LDNS_RDF_TYPE_BITMAP, sz, data);
2512*17d15b25SDag-Erling Smørgrav 	if (!*rdf) {
2513*17d15b25SDag-Erling Smørgrav 		LDNS_FREE(data);
2514*17d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_MEM_ERR;
2515*17d15b25SDag-Erling Smørgrav 	}
2516*17d15b25SDag-Erling Smørgrav 	return LDNS_STATUS_OK;
2517*17d15b25SDag-Erling Smørgrav }
2518*17d15b25SDag-Erling Smørgrav 
2519*17d15b25SDag-Erling Smørgrav ldns_status
2520*17d15b25SDag-Erling Smørgrav ldns_rdf_bitmap_known_rr_types_space(ldns_rdf** rdf)
2521*17d15b25SDag-Erling Smørgrav {
2522*17d15b25SDag-Erling Smørgrav 	return ldns_rdf_bitmap_known_rr_types_set(rdf, 0);
2523*17d15b25SDag-Erling Smørgrav }
2524*17d15b25SDag-Erling Smørgrav 
2525*17d15b25SDag-Erling Smørgrav ldns_status
2526*17d15b25SDag-Erling Smørgrav ldns_rdf_bitmap_known_rr_types(ldns_rdf** rdf)
2527*17d15b25SDag-Erling Smørgrav {
2528*17d15b25SDag-Erling Smørgrav 	return ldns_rdf_bitmap_known_rr_types_set(rdf, 255);
2529*17d15b25SDag-Erling Smørgrav }
2530*17d15b25SDag-Erling Smørgrav /* End of RDF bitmap functions
2531*17d15b25SDag-Erling Smørgrav  *---------------------------------------------------------------------------*/
2532*17d15b25SDag-Erling Smørgrav 
2533*17d15b25SDag-Erling Smørgrav 
25347b5038d7SDag-Erling Smørgrav const ldns_rr_descriptor *
25357b5038d7SDag-Erling Smørgrav ldns_rr_descript(uint16_t type)
25367b5038d7SDag-Erling Smørgrav {
25377b5038d7SDag-Erling Smørgrav 	size_t i;
2538*17d15b25SDag-Erling Smørgrav 	if (type < LDNS_RDATA_FIELD_DESCRIPTORS_COMMON) {
25397b5038d7SDag-Erling Smørgrav 		return &rdata_field_descriptors[type];
25407b5038d7SDag-Erling Smørgrav 	} else {
25417b5038d7SDag-Erling Smørgrav 		/* because not all array index equals type code */
25427b5038d7SDag-Erling Smørgrav 		for (i = LDNS_RDATA_FIELD_DESCRIPTORS_COMMON;
25437b5038d7SDag-Erling Smørgrav 		     i < LDNS_RDATA_FIELD_DESCRIPTORS_COUNT;
25447b5038d7SDag-Erling Smørgrav 		     i++) {
25457b5038d7SDag-Erling Smørgrav 		        if (rdata_field_descriptors[i]._type == type) {
25467b5038d7SDag-Erling Smørgrav 		     		return &rdata_field_descriptors[i];
25477b5038d7SDag-Erling Smørgrav 			}
25487b5038d7SDag-Erling Smørgrav 		}
25497b5038d7SDag-Erling Smørgrav                 return &rdata_field_descriptors[0];
25507b5038d7SDag-Erling Smørgrav 	}
25517b5038d7SDag-Erling Smørgrav }
25527b5038d7SDag-Erling Smørgrav 
25537b5038d7SDag-Erling Smørgrav size_t
25547b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor)
25557b5038d7SDag-Erling Smørgrav {
25567b5038d7SDag-Erling Smørgrav 	if (descriptor) {
25577b5038d7SDag-Erling Smørgrav 		return descriptor->_minimum;
25587b5038d7SDag-Erling Smørgrav 	} else {
25597b5038d7SDag-Erling Smørgrav 		return 0;
25607b5038d7SDag-Erling Smørgrav 	}
25617b5038d7SDag-Erling Smørgrav }
25627b5038d7SDag-Erling Smørgrav 
25637b5038d7SDag-Erling Smørgrav size_t
25647b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor)
25657b5038d7SDag-Erling Smørgrav {
25667b5038d7SDag-Erling Smørgrav 	if (descriptor) {
25677b5038d7SDag-Erling Smørgrav 		if (descriptor->_variable != LDNS_RDF_TYPE_NONE) {
25687b5038d7SDag-Erling Smørgrav 			/* Should really be SIZE_MAX... bad FreeBSD.  */
25697b5038d7SDag-Erling Smørgrav 			return UINT_MAX;
25707b5038d7SDag-Erling Smørgrav 		} else {
25717b5038d7SDag-Erling Smørgrav 			return descriptor->_maximum;
25727b5038d7SDag-Erling Smørgrav 		}
25737b5038d7SDag-Erling Smørgrav 	} else {
25747b5038d7SDag-Erling Smørgrav 		return 0;
25757b5038d7SDag-Erling Smørgrav 	}
25767b5038d7SDag-Erling Smørgrav }
25777b5038d7SDag-Erling Smørgrav 
25787b5038d7SDag-Erling Smørgrav ldns_rdf_type
25797b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor,
25807b5038d7SDag-Erling Smørgrav                               size_t index)
25817b5038d7SDag-Erling Smørgrav {
25827b5038d7SDag-Erling Smørgrav 	assert(descriptor != NULL);
25837b5038d7SDag-Erling Smørgrav 	assert(index < descriptor->_maximum
25847b5038d7SDag-Erling Smørgrav 	       || descriptor->_variable != LDNS_RDF_TYPE_NONE);
25857b5038d7SDag-Erling Smørgrav 	if (index < descriptor->_maximum) {
25867b5038d7SDag-Erling Smørgrav 		return descriptor->_wireformat[index];
25877b5038d7SDag-Erling Smørgrav 	} else {
25887b5038d7SDag-Erling Smørgrav 		return descriptor->_variable;
25897b5038d7SDag-Erling Smørgrav 	}
25907b5038d7SDag-Erling Smørgrav }
25917b5038d7SDag-Erling Smørgrav 
25927b5038d7SDag-Erling Smørgrav ldns_rr_type
25937b5038d7SDag-Erling Smørgrav ldns_get_rr_type_by_name(const char *name)
25947b5038d7SDag-Erling Smørgrav {
25957b5038d7SDag-Erling Smørgrav 	unsigned int i;
25967b5038d7SDag-Erling Smørgrav 	const char *desc_name;
25977b5038d7SDag-Erling Smørgrav 	const ldns_rr_descriptor *desc;
25987b5038d7SDag-Erling Smørgrav 
25997b5038d7SDag-Erling Smørgrav 	/* TYPEXX representation */
26007b5038d7SDag-Erling Smørgrav 	if (strlen(name) > 4 && strncasecmp(name, "TYPE", 4) == 0) {
26017b5038d7SDag-Erling Smørgrav 		return atoi(name + 4);
26027b5038d7SDag-Erling Smørgrav 	}
26037b5038d7SDag-Erling Smørgrav 
26047b5038d7SDag-Erling Smørgrav 	/* Normal types */
26057b5038d7SDag-Erling Smørgrav 	for (i = 0; i < (unsigned int) LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; i++) {
26067b5038d7SDag-Erling Smørgrav 		desc = &rdata_field_descriptors[i];
26077b5038d7SDag-Erling Smørgrav 		desc_name = desc->_name;
26087b5038d7SDag-Erling Smørgrav 		if(desc_name &&
26097b5038d7SDag-Erling Smørgrav 		   strlen(name) == strlen(desc_name) &&
26107b5038d7SDag-Erling Smørgrav 		   strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
26117b5038d7SDag-Erling Smørgrav 			/* because not all array index equals type code */
26127b5038d7SDag-Erling Smørgrav 			return desc->_type;
26137b5038d7SDag-Erling Smørgrav 		}
26147b5038d7SDag-Erling Smørgrav 	}
26157b5038d7SDag-Erling Smørgrav 
26167b5038d7SDag-Erling Smørgrav 	/* special cases for query types */
26177b5038d7SDag-Erling Smørgrav 	if (strlen(name) == 4 && strncasecmp(name, "IXFR", 4) == 0) {
26187b5038d7SDag-Erling Smørgrav 		return 251;
26197b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 4 && strncasecmp(name, "AXFR", 4) == 0) {
26207b5038d7SDag-Erling Smørgrav 		return 252;
26217b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 5 && strncasecmp(name, "MAILB", 5) == 0) {
26227b5038d7SDag-Erling Smørgrav 		return 253;
26237b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 5 && strncasecmp(name, "MAILA", 5) == 0) {
26247b5038d7SDag-Erling Smørgrav 		return 254;
26257b5038d7SDag-Erling Smørgrav 	} else if (strlen(name) == 3 && strncasecmp(name, "ANY", 3) == 0) {
26267b5038d7SDag-Erling Smørgrav 		return 255;
26277b5038d7SDag-Erling Smørgrav 	}
26287b5038d7SDag-Erling Smørgrav 
26297b5038d7SDag-Erling Smørgrav 	return 0;
26307b5038d7SDag-Erling Smørgrav }
26317b5038d7SDag-Erling Smørgrav 
26327b5038d7SDag-Erling Smørgrav ldns_rr_class
26337b5038d7SDag-Erling Smørgrav ldns_get_rr_class_by_name(const char *name)
26347b5038d7SDag-Erling Smørgrav {
26357b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt;
26367b5038d7SDag-Erling Smørgrav 
26377b5038d7SDag-Erling Smørgrav 	/* CLASSXX representation */
26387b5038d7SDag-Erling Smørgrav 	if (strlen(name) > 5 && strncasecmp(name, "CLASS", 5) == 0) {
26397b5038d7SDag-Erling Smørgrav 		return atoi(name + 5);
26407b5038d7SDag-Erling Smørgrav 	}
26417b5038d7SDag-Erling Smørgrav 
26427b5038d7SDag-Erling Smørgrav 	/* Normal types */
26437b5038d7SDag-Erling Smørgrav 	lt = ldns_lookup_by_name(ldns_rr_classes, name);
26447b5038d7SDag-Erling Smørgrav 
26457b5038d7SDag-Erling Smørgrav 	if (lt) {
26467b5038d7SDag-Erling Smørgrav 		return lt->id;
26477b5038d7SDag-Erling Smørgrav 	}
26487b5038d7SDag-Erling Smørgrav 	return 0;
26497b5038d7SDag-Erling Smørgrav }
26507b5038d7SDag-Erling Smørgrav 
26517b5038d7SDag-Erling Smørgrav 
26527b5038d7SDag-Erling Smørgrav ldns_rr_type
26537b5038d7SDag-Erling Smørgrav ldns_rdf2rr_type(const ldns_rdf *rd)
26547b5038d7SDag-Erling Smørgrav {
26557b5038d7SDag-Erling Smørgrav         ldns_rr_type r;
26567b5038d7SDag-Erling Smørgrav 
26577b5038d7SDag-Erling Smørgrav         if (!rd) {
26587b5038d7SDag-Erling Smørgrav                 return 0;
26597b5038d7SDag-Erling Smørgrav         }
26607b5038d7SDag-Erling Smørgrav 
26617b5038d7SDag-Erling Smørgrav         if (ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_TYPE) {
26627b5038d7SDag-Erling Smørgrav                 return 0;
26637b5038d7SDag-Erling Smørgrav         }
26647b5038d7SDag-Erling Smørgrav 
26657b5038d7SDag-Erling Smørgrav         r = (ldns_rr_type) ldns_rdf2native_int16(rd);
26667b5038d7SDag-Erling Smørgrav         return r;
26677b5038d7SDag-Erling Smørgrav }
26687b5038d7SDag-Erling Smørgrav 
26697b5038d7SDag-Erling Smørgrav ldns_rr_type
26707b5038d7SDag-Erling Smørgrav ldns_rr_list_type(const ldns_rr_list *rr_list)
26717b5038d7SDag-Erling Smørgrav {
26727b5038d7SDag-Erling Smørgrav 	if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) {
26737b5038d7SDag-Erling Smørgrav 		return ldns_rr_get_type(ldns_rr_list_rr(rr_list, 0));
26747b5038d7SDag-Erling Smørgrav 	} else {
26757b5038d7SDag-Erling Smørgrav 		return 0;
26767b5038d7SDag-Erling Smørgrav 	}
26777b5038d7SDag-Erling Smørgrav }
26787b5038d7SDag-Erling Smørgrav 
26797b5038d7SDag-Erling Smørgrav ldns_rdf *
26807b5038d7SDag-Erling Smørgrav ldns_rr_list_owner(const ldns_rr_list *rr_list)
26817b5038d7SDag-Erling Smørgrav {
26827b5038d7SDag-Erling Smørgrav 	if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) {
26837b5038d7SDag-Erling Smørgrav 		return ldns_rr_owner(ldns_rr_list_rr(rr_list, 0));
26847b5038d7SDag-Erling Smørgrav 	} else {
26857b5038d7SDag-Erling Smørgrav 		return NULL;
26867b5038d7SDag-Erling Smørgrav 	}
26877b5038d7SDag-Erling Smørgrav }
2688