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