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