rr.c revision 246827
1238104Sdes/* rr.c 2238104Sdes * 3238104Sdes * access functions for ldns_rr - 4238104Sdes * a Net::DNS like library for C 5238104Sdes * LibDNS Team @ NLnet Labs 6238104Sdes * 7238104Sdes * (c) NLnet Labs, 2004-2006 8238104Sdes * See the file LICENSE for the license 9238104Sdes */ 10238104Sdes#include <ldns/config.h> 11238104Sdes 12238104Sdes#include <ldns/ldns.h> 13238104Sdes 14238104Sdes#include <strings.h> 15238104Sdes#include <limits.h> 16238104Sdes 17238104Sdes#include <errno.h> 18238104Sdes 19238104Sdes#define LDNS_SYNTAX_DATALEN 16 20238104Sdes#define LDNS_TTL_DATALEN 21 21238104Sdes#define LDNS_RRLIST_INIT 8 22238104Sdes 23238104Sdesldns_rr * 24238104Sdesldns_rr_new(void) 25238104Sdes{ 26238104Sdes ldns_rr *rr; 27238104Sdes rr = LDNS_MALLOC(ldns_rr); 28238104Sdes if (!rr) { 29238104Sdes return NULL; 30238104Sdes } 31238104Sdes 32238104Sdes ldns_rr_set_owner(rr, NULL); 33238104Sdes ldns_rr_set_question(rr, false); 34238104Sdes ldns_rr_set_rd_count(rr, 0); 35238104Sdes rr->_rdata_fields = NULL; 36238104Sdes ldns_rr_set_class(rr, LDNS_RR_CLASS_IN); 37238104Sdes ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL); 38238104Sdes return rr; 39238104Sdes} 40238104Sdes 41238104Sdesldns_rr * 42238104Sdesldns_rr_new_frm_type(ldns_rr_type t) 43238104Sdes{ 44238104Sdes ldns_rr *rr; 45238104Sdes const ldns_rr_descriptor *desc; 46238104Sdes size_t i; 47238104Sdes 48238104Sdes rr = LDNS_MALLOC(ldns_rr); 49238104Sdes if (!rr) { 50238104Sdes return NULL; 51238104Sdes } 52238104Sdes 53238104Sdes desc = ldns_rr_descript(t); 54238104Sdes 55238104Sdes rr->_rdata_fields = LDNS_XMALLOC(ldns_rdf *, ldns_rr_descriptor_minimum(desc)); 56238104Sdes if(!rr->_rdata_fields) { 57238104Sdes LDNS_FREE(rr); 58238104Sdes return NULL; 59238104Sdes } 60238104Sdes for (i = 0; i < ldns_rr_descriptor_minimum(desc); i++) { 61238104Sdes rr->_rdata_fields[i] = NULL; 62238104Sdes } 63238104Sdes 64238104Sdes ldns_rr_set_owner(rr, NULL); 65238104Sdes ldns_rr_set_question(rr, false); 66238104Sdes /* set the count to minimum */ 67238104Sdes ldns_rr_set_rd_count(rr, ldns_rr_descriptor_minimum(desc)); 68238104Sdes ldns_rr_set_class(rr, LDNS_RR_CLASS_IN); 69238104Sdes ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL); 70238104Sdes ldns_rr_set_type(rr, t); 71238104Sdes return rr; 72238104Sdes} 73238104Sdes 74238104Sdesvoid 75238104Sdesldns_rr_free(ldns_rr *rr) 76238104Sdes{ 77238104Sdes size_t i; 78238104Sdes if (rr) { 79238104Sdes if (ldns_rr_owner(rr)) { 80238104Sdes ldns_rdf_deep_free(ldns_rr_owner(rr)); 81238104Sdes } 82238104Sdes for (i = 0; i < ldns_rr_rd_count(rr); i++) { 83238104Sdes ldns_rdf_deep_free(ldns_rr_rdf(rr, i)); 84238104Sdes } 85238104Sdes LDNS_FREE(rr->_rdata_fields); 86238104Sdes LDNS_FREE(rr); 87238104Sdes } 88238104Sdes} 89238104Sdes 90238104Sdes/* 91238104Sdes * trailing spaces are allowed 92238104Sdes * leading spaces are not allowed 93238104Sdes * allow ttl to be optional 94238104Sdes * class is optional too 95238104Sdes * if ttl is missing, and default_ttl is 0, use DEF_TTL 96238104Sdes * allow ttl to be written as 1d3h 97238104Sdes * So the RR should look like. e.g. 98238104Sdes * miek.nl. 3600 IN MX 10 elektron.atoom.net 99238104Sdes * or 100238104Sdes * miek.nl. 1h IN MX 10 elektron.atoom.net 101238104Sdes * or 102238104Sdes * miek.nl. IN MX 10 elektron.atoom.net 103238104Sdes */ 104238104Sdesstatic ldns_status 105238104Sdesldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str, 106238104Sdes uint32_t default_ttl, ldns_rdf *origin, 107238104Sdes ldns_rdf **prev, bool question) 108238104Sdes{ 109238104Sdes ldns_rr *new; 110238104Sdes const ldns_rr_descriptor *desc; 111238104Sdes ldns_rr_type rr_type; 112238104Sdes ldns_buffer *rr_buf = NULL; 113238104Sdes ldns_buffer *rd_buf = NULL; 114238104Sdes uint32_t ttl_val; 115238104Sdes char *owner = NULL; 116238104Sdes char *ttl = NULL; 117238104Sdes ldns_rr_class clas_val; 118238104Sdes char *clas = NULL; 119238104Sdes char *type = NULL; 120238104Sdes char *rdata = NULL; 121238104Sdes char *rd = NULL; 122238104Sdes char *b64 = NULL; 123238104Sdes size_t rd_strlen; 124238104Sdes const char *delimiters; 125238104Sdes ssize_t c; 126238104Sdes ldns_rdf *owner_dname; 127238104Sdes const char* endptr; 128238104Sdes int was_unknown_rr_format = 0; 129238104Sdes ldns_status status = LDNS_STATUS_OK; 130238104Sdes 131238104Sdes /* used for types with unknown number of rdatas */ 132238104Sdes bool done; 133238104Sdes bool quoted; 134238104Sdes 135238104Sdes ldns_rdf *r = NULL; 136238104Sdes uint16_t r_cnt; 137238104Sdes uint16_t r_min; 138238104Sdes uint16_t r_max; 139238104Sdes size_t pre_data_pos; 140238104Sdes 141238104Sdes new = ldns_rr_new(); 142238104Sdes 143238104Sdes owner = LDNS_XMALLOC(char, LDNS_MAX_DOMAINLEN + 1); 144238104Sdes ttl = LDNS_XMALLOC(char, LDNS_TTL_DATALEN); 145238104Sdes clas = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN); 146238104Sdes rdata = LDNS_XMALLOC(char, LDNS_MAX_PACKETLEN + 1); 147238104Sdes rr_buf = LDNS_MALLOC(ldns_buffer); 148238104Sdes rd_buf = LDNS_MALLOC(ldns_buffer); 149238104Sdes rd = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); 150238104Sdes b64 = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); 151238104Sdes if (!new || !owner || !ttl || !clas || !rdata || !rr_buf || !rd_buf || !rd || !b64 ) { 152238104Sdes status = LDNS_STATUS_MEM_ERR; 153238104Sdes LDNS_FREE(rr_buf); 154238104Sdes goto ldnserror; 155238104Sdes } 156238104Sdes 157238104Sdes ldns_buffer_new_frm_data(rr_buf, (char*)str, strlen(str)); 158238104Sdes 159238104Sdes /* split the rr in its parts -1 signals trouble */ 160238104Sdes if (ldns_bget_token(rr_buf, owner, "\t\n ", LDNS_MAX_DOMAINLEN) == -1) { 161238104Sdes status = LDNS_STATUS_SYNTAX_ERR; 162238104Sdes ldns_buffer_free(rr_buf); 163238104Sdes goto ldnserror; 164238104Sdes } 165238104Sdes 166238104Sdes if (ldns_bget_token(rr_buf, ttl, "\t\n ", LDNS_TTL_DATALEN) == -1) { 167238104Sdes status = LDNS_STATUS_SYNTAX_TTL_ERR; 168238104Sdes ldns_buffer_free(rr_buf); 169238104Sdes goto ldnserror; 170238104Sdes } 171238104Sdes ttl_val = (uint32_t) ldns_str2period(ttl, &endptr); 172238104Sdes 173238104Sdes if (strlen(ttl) > 0 && !isdigit((int) ttl[0])) { 174238104Sdes /* ah, it's not there or something */ 175238104Sdes if (default_ttl == 0) { 176238104Sdes ttl_val = LDNS_DEFAULT_TTL; 177238104Sdes } else { 178238104Sdes ttl_val = default_ttl; 179238104Sdes } 180238104Sdes /* we not ASSUMING the TTL is missing and that 181238104Sdes * the rest of the RR is still there. That is 182238104Sdes * CLASS TYPE RDATA 183238104Sdes * so ttl value we read is actually the class 184238104Sdes */ 185238104Sdes clas_val = ldns_get_rr_class_by_name(ttl); 186238104Sdes /* class can be left out too, assume IN, current 187238104Sdes * token must be type 188238104Sdes */ 189238104Sdes if (clas_val == 0) { 190238104Sdes clas_val = LDNS_RR_CLASS_IN; 191238104Sdes type = LDNS_XMALLOC(char, strlen(ttl) + 1); 192238104Sdes if(!type) { 193238104Sdes status = LDNS_STATUS_MEM_ERR; 194238104Sdes ldns_buffer_free(rr_buf); 195238104Sdes goto ldnserror; 196238104Sdes } 197238104Sdes strncpy(type, ttl, strlen(ttl) + 1); 198238104Sdes } 199238104Sdes } else { 200238104Sdes if (ldns_bget_token(rr_buf, clas, "\t\n ", LDNS_SYNTAX_DATALEN) == -1) { 201238104Sdes status = LDNS_STATUS_SYNTAX_CLASS_ERR; 202238104Sdes ldns_buffer_free(rr_buf); 203238104Sdes goto ldnserror; 204238104Sdes } 205238104Sdes clas_val = ldns_get_rr_class_by_name(clas); 206238104Sdes /* class can be left out too, assume IN, current 207238104Sdes * token must be type 208238104Sdes */ 209238104Sdes if (clas_val == 0) { 210238104Sdes clas_val = LDNS_RR_CLASS_IN; 211238104Sdes type = LDNS_XMALLOC(char, strlen(clas) + 1); 212238104Sdes if(!type) { 213238104Sdes status = LDNS_STATUS_MEM_ERR; 214238104Sdes ldns_buffer_free(rr_buf); 215238104Sdes goto ldnserror; 216238104Sdes } 217238104Sdes strncpy(type, clas, strlen(clas) + 1); 218238104Sdes } 219238104Sdes } 220238104Sdes /* the rest should still be waiting for us */ 221238104Sdes 222238104Sdes if (!type) { 223238104Sdes type = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN); 224238104Sdes if(!type) { 225238104Sdes status = LDNS_STATUS_MEM_ERR; 226238104Sdes ldns_buffer_free(rr_buf); 227238104Sdes goto ldnserror; 228238104Sdes } 229238104Sdes if (ldns_bget_token(rr_buf, type, "\t\n ", LDNS_SYNTAX_DATALEN) == -1) { 230238104Sdes status = LDNS_STATUS_SYNTAX_TYPE_ERR; 231238104Sdes ldns_buffer_free(rr_buf); 232238104Sdes goto ldnserror; 233238104Sdes } 234238104Sdes } 235238104Sdes 236238104Sdes if (ldns_bget_token(rr_buf, rdata, "\0", LDNS_MAX_PACKETLEN) == -1) { 237238104Sdes /* apparently we are done, and it's only a question RR 238238104Sdes * so do not set status and go to ldnserror here 239238104Sdes */ 240238104Sdes } 241238104Sdes 242238104Sdes ldns_buffer_new_frm_data(rd_buf, rdata, strlen(rdata)); 243238104Sdes 244238104Sdes if (strlen(owner) <= 1 && strncmp(owner, "@", 1) == 0) { 245238104Sdes if (origin) { 246238104Sdes ldns_rr_set_owner(new, ldns_rdf_clone(origin)); 247238104Sdes } else if (prev && *prev) { 248238104Sdes ldns_rr_set_owner(new, ldns_rdf_clone(*prev)); 249238104Sdes } else { 250238104Sdes /* default to root */ 251238104Sdes ldns_rr_set_owner(new, ldns_dname_new_frm_str(".")); 252238104Sdes } 253238104Sdes 254238104Sdes /* @ also overrides prev */ 255238104Sdes if (prev) { 256238104Sdes ldns_rdf_deep_free(*prev); 257238104Sdes *prev = ldns_rdf_clone(ldns_rr_owner(new)); 258238104Sdes if (!*prev) { 259238104Sdes status = LDNS_STATUS_MEM_ERR; 260238104Sdes ldns_buffer_free(rr_buf); 261238104Sdes goto ldnserror; 262238104Sdes } 263238104Sdes } 264238104Sdes } else { 265238104Sdes if (strlen(owner) == 0) { 266238104Sdes /* no ownername was given, try prev, if that fails 267238104Sdes * origin, else default to root */ 268238104Sdes if (prev && *prev) { 269238104Sdes ldns_rr_set_owner(new, ldns_rdf_clone(*prev)); 270238104Sdes } else if (origin) { 271238104Sdes ldns_rr_set_owner(new, ldns_rdf_clone(origin)); 272238104Sdes } else { 273238104Sdes ldns_rr_set_owner(new, ldns_dname_new_frm_str(".")); 274238104Sdes } 275238104Sdes if(!ldns_rr_owner(new)) { 276238104Sdes status = LDNS_STATUS_MEM_ERR; 277238104Sdes ldns_buffer_free(rr_buf); 278238104Sdes goto ldnserror; 279238104Sdes } 280238104Sdes } else { 281238104Sdes owner_dname = ldns_dname_new_frm_str(owner); 282238104Sdes if (!owner_dname) { 283238104Sdes status = LDNS_STATUS_SYNTAX_ERR; 284238104Sdes ldns_buffer_free(rr_buf); 285238104Sdes goto ldnserror; 286238104Sdes } 287238104Sdes 288238104Sdes ldns_rr_set_owner(new, owner_dname); 289238104Sdes if (!ldns_dname_str_absolute(owner) && origin) { 290238104Sdes if(ldns_dname_cat(ldns_rr_owner(new), 291238104Sdes origin) != LDNS_STATUS_OK) { 292238104Sdes status = LDNS_STATUS_SYNTAX_ERR; 293238104Sdes ldns_buffer_free(rr_buf); 294238104Sdes goto ldnserror; 295238104Sdes } 296238104Sdes } 297238104Sdes if (prev) { 298238104Sdes ldns_rdf_deep_free(*prev); 299238104Sdes *prev = ldns_rdf_clone(ldns_rr_owner(new)); 300238104Sdes if(!*prev) { 301238104Sdes status = LDNS_STATUS_MEM_ERR; 302238104Sdes ldns_buffer_free(rr_buf); 303238104Sdes goto ldnserror; 304238104Sdes } 305238104Sdes } 306238104Sdes } 307238104Sdes } 308238104Sdes LDNS_FREE(owner); 309238104Sdes owner = NULL; 310238104Sdes 311238104Sdes ldns_rr_set_question(new, question); 312238104Sdes 313238104Sdes ldns_rr_set_ttl(new, ttl_val); 314238104Sdes LDNS_FREE(ttl); 315238104Sdes ttl = NULL; 316238104Sdes 317238104Sdes ldns_rr_set_class(new, clas_val); 318238104Sdes LDNS_FREE(clas); 319238104Sdes clas = NULL; 320238104Sdes 321238104Sdes rr_type = ldns_get_rr_type_by_name(type); 322238104Sdes LDNS_FREE(type); 323238104Sdes type = NULL; 324238104Sdes 325238104Sdes desc = ldns_rr_descript((uint16_t)rr_type); 326238104Sdes ldns_rr_set_type(new, rr_type); 327238104Sdes if (desc) { 328238104Sdes /* only the rdata remains */ 329238104Sdes r_max = ldns_rr_descriptor_maximum(desc); 330238104Sdes r_min = ldns_rr_descriptor_minimum(desc); 331238104Sdes } else { 332238104Sdes r_min = 0; 333238104Sdes r_max = 1; 334238104Sdes } 335238104Sdes 336238104Sdes /* depending on the rr_type we need to extract 337238104Sdes * the rdata differently, e.g. NSEC/NSEC3 */ 338238104Sdes switch(rr_type) { 339238104Sdes default: 340238104Sdes done = false; 341238104Sdes 342238104Sdes for (r_cnt = 0; !done && r_cnt < r_max; r_cnt++) { 343238104Sdes quoted = false; 344238104Sdes /* if type = B64, the field may contain spaces */ 345238104Sdes if (ldns_rr_descriptor_field_type(desc, 346238104Sdes r_cnt) == LDNS_RDF_TYPE_B64 || 347238104Sdes ldns_rr_descriptor_field_type(desc, 348238104Sdes r_cnt) == LDNS_RDF_TYPE_HEX || 349238104Sdes ldns_rr_descriptor_field_type(desc, 350238104Sdes r_cnt) == LDNS_RDF_TYPE_LOC || 351238104Sdes ldns_rr_descriptor_field_type(desc, 352238104Sdes r_cnt) == LDNS_RDF_TYPE_WKS || 353238104Sdes ldns_rr_descriptor_field_type(desc, 354238104Sdes r_cnt) == LDNS_RDF_TYPE_IPSECKEY || 355238104Sdes ldns_rr_descriptor_field_type(desc, 356238104Sdes r_cnt) == LDNS_RDF_TYPE_NSEC) { 357238104Sdes delimiters = "\n\t"; 358238104Sdes } else { 359238104Sdes delimiters = "\n\t "; 360238104Sdes } 361238104Sdes 362238104Sdes if (ldns_rr_descriptor_field_type(desc, 363238104Sdes r_cnt) == LDNS_RDF_TYPE_STR && 364238104Sdes ldns_buffer_remaining(rd_buf) > 0) { 365238104Sdes /* skip spaces */ 366238104Sdes while (*(ldns_buffer_current(rd_buf)) == ' ') { 367238104Sdes ldns_buffer_skip(rd_buf, 1); 368238104Sdes } 369238104Sdes 370238104Sdes if (*(ldns_buffer_current(rd_buf)) == '\"') { 371238104Sdes delimiters = "\"\0"; 372238104Sdes ldns_buffer_skip(rd_buf, 1); 373238104Sdes quoted = true; 374238104Sdes } 375238104Sdes } 376238104Sdes 377238104Sdes /* because number of fields can be variable, we can't 378238104Sdes rely on _maximum() only */ 379238104Sdes /* skip spaces */ 380238104Sdes while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf) && 381238104Sdes *(ldns_buffer_current(rd_buf)) == ' ' && !quoted 382238104Sdes ) { 383238104Sdes ldns_buffer_skip(rd_buf, 1); 384238104Sdes } 385238104Sdes 386238104Sdes pre_data_pos = ldns_buffer_position(rd_buf); 387238104Sdes if ((c = ldns_bget_token(rd_buf, rd, delimiters, 388238104Sdes LDNS_MAX_RDFLEN)) != -1) { 389238104Sdes /* hmmz, rfc3597 specifies that any type can be represented with 390238104Sdes * \# method, which can contain spaces... 391238104Sdes * it does specify size though... 392238104Sdes */ 393238104Sdes rd_strlen = strlen(rd); 394238104Sdes 395238104Sdes /* unknown RR data */ 396238104Sdes if (strncmp(rd, "\\#", 2) == 0 && !quoted && (rd_strlen == 2 || rd[2]==' ')) { 397238104Sdes uint16_t hex_data_size; 398238104Sdes char *hex_data_str; 399238104Sdes uint16_t cur_hex_data_size; 400238104Sdes 401238104Sdes was_unknown_rr_format = 1; 402238104Sdes /* go back to before \# and skip it while setting delimiters better */ 403238104Sdes ldns_buffer_set_position(rd_buf, pre_data_pos); 404238104Sdes delimiters = "\n\t "; 405238104Sdes (void)ldns_bget_token(rd_buf, rd, delimiters, LDNS_MAX_RDFLEN); 406238104Sdes /* read rdata octet length */ 407238104Sdes c = ldns_bget_token(rd_buf, rd, delimiters, LDNS_MAX_RDFLEN); 408238104Sdes if (c == -1) { 409238104Sdes /* something goes very wrong here */ 410238104Sdes LDNS_FREE(rd); 411238104Sdes LDNS_FREE(b64); 412238104Sdes ldns_buffer_free(rd_buf); 413238104Sdes ldns_buffer_free(rr_buf); 414238104Sdes LDNS_FREE(rdata); 415238104Sdes ldns_rr_free(new); 416238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 417238104Sdes } 418238104Sdes hex_data_size = (uint16_t) atoi(rd); 419238104Sdes /* copy the hex chars into hex str (which is 2 chars per byte) */ 420238104Sdes hex_data_str = LDNS_XMALLOC(char, 2 * hex_data_size + 1); 421238104Sdes if (!hex_data_str) { 422238104Sdes /* malloc error */ 423238104Sdes LDNS_FREE(rd); 424238104Sdes LDNS_FREE(b64); 425238104Sdes ldns_buffer_free(rd_buf); 426238104Sdes ldns_buffer_free(rr_buf); 427238104Sdes LDNS_FREE(rdata); 428238104Sdes ldns_rr_free(new); 429238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 430238104Sdes } 431238104Sdes cur_hex_data_size = 0; 432238104Sdes while(cur_hex_data_size < 2 * hex_data_size) { 433238104Sdes c = ldns_bget_token(rd_buf, rd, delimiters, LDNS_MAX_RDFLEN); 434238104Sdes if (c != -1) { 435238104Sdes rd_strlen = strlen(rd); 436238104Sdes } 437238104Sdes if (c == -1 || (size_t)cur_hex_data_size + rd_strlen > 2 * (size_t)hex_data_size) { 438238104Sdes LDNS_FREE(hex_data_str); 439238104Sdes LDNS_FREE(rd); 440238104Sdes LDNS_FREE(b64); 441238104Sdes ldns_buffer_free(rd_buf); 442238104Sdes ldns_buffer_free(rr_buf); 443238104Sdes LDNS_FREE(rdata); 444238104Sdes ldns_rr_free(new); 445238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 446238104Sdes } 447238104Sdes strncpy(hex_data_str + cur_hex_data_size, rd, rd_strlen); 448238104Sdes cur_hex_data_size += rd_strlen; 449238104Sdes } 450238104Sdes hex_data_str[cur_hex_data_size] = '\0'; 451238104Sdes 452238104Sdes /* correct the rdf type */ 453238104Sdes /* if *we* know the type, interpret it as wireformat */ 454238104Sdes if (desc) { 455238104Sdes size_t hex_pos = 0; 456238104Sdes uint8_t *hex_data = LDNS_XMALLOC(uint8_t, hex_data_size + 2); 457238104Sdes ldns_status s; 458238104Sdes if(!hex_data) { 459238104Sdes LDNS_FREE(hex_data_str); 460238104Sdes LDNS_FREE(rd); 461238104Sdes LDNS_FREE(b64); 462238104Sdes ldns_buffer_free(rd_buf); 463238104Sdes ldns_buffer_free(rr_buf); 464238104Sdes LDNS_FREE(rdata); 465238104Sdes ldns_rr_free(new); 466238104Sdes return LDNS_STATUS_MEM_ERR; 467238104Sdes } 468238104Sdes ldns_write_uint16(hex_data, hex_data_size); 469238104Sdes ldns_hexstring_to_data(hex_data + 2, hex_data_str); 470238104Sdes s = ldns_wire2rdf(new, hex_data, 471238104Sdes hex_data_size+2, &hex_pos); 472238104Sdes if(s != LDNS_STATUS_OK) { 473238104Sdes LDNS_FREE(hex_data_str); 474238104Sdes LDNS_FREE(rd); 475238104Sdes LDNS_FREE(b64); 476238104Sdes ldns_buffer_free(rd_buf); 477238104Sdes ldns_buffer_free(rr_buf); 478238104Sdes LDNS_FREE(rdata); 479238104Sdes ldns_rr_free(new); 480238104Sdes return s; 481238104Sdes } 482238104Sdes LDNS_FREE(hex_data); 483238104Sdes } else { 484238104Sdes r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_HEX, hex_data_str); 485238104Sdes if(!r) { 486238104Sdes LDNS_FREE(hex_data_str); 487238104Sdes LDNS_FREE(rd); 488238104Sdes LDNS_FREE(b64); 489238104Sdes ldns_buffer_free(rd_buf); 490238104Sdes ldns_buffer_free(rr_buf); 491238104Sdes LDNS_FREE(rdata); 492238104Sdes ldns_rr_free(new); 493238104Sdes return LDNS_STATUS_MEM_ERR; 494238104Sdes } 495238104Sdes ldns_rdf_set_type(r, LDNS_RDF_TYPE_UNKNOWN); 496238104Sdes if(!ldns_rr_push_rdf(new, r)) { 497238104Sdes LDNS_FREE(hex_data_str); 498238104Sdes LDNS_FREE(rd); 499238104Sdes LDNS_FREE(b64); 500238104Sdes ldns_buffer_free(rd_buf); 501238104Sdes ldns_buffer_free(rr_buf); 502238104Sdes LDNS_FREE(rdata); 503238104Sdes ldns_rr_free(new); 504238104Sdes return LDNS_STATUS_MEM_ERR; 505238104Sdes } 506238104Sdes } 507238104Sdes LDNS_FREE(hex_data_str); 508238104Sdes } else { 509238104Sdes /* Normal RR */ 510238104Sdes switch(ldns_rr_descriptor_field_type(desc, r_cnt)) { 511238104Sdes case LDNS_RDF_TYPE_HEX: 512238104Sdes case LDNS_RDF_TYPE_B64: 513238104Sdes /* can have spaces, and will always be the last 514238104Sdes * record of the rrdata. Read in the rest */ 515238104Sdes if ((c = ldns_bget_token(rd_buf, 516238104Sdes b64, 517238104Sdes "\n", 518238104Sdes LDNS_MAX_RDFLEN)) 519238104Sdes != -1) { 520238104Sdes rd = strncat(rd, 521238104Sdes b64, 522238104Sdes LDNS_MAX_RDFLEN 523238104Sdes - strlen(rd) - 1); 524238104Sdes } 525238104Sdes r = ldns_rdf_new_frm_str( 526238104Sdes ldns_rr_descriptor_field_type(desc, r_cnt), 527238104Sdes rd); 528238104Sdes break; 529238104Sdes case LDNS_RDF_TYPE_DNAME: 530238104Sdes r = ldns_rdf_new_frm_str( 531238104Sdes ldns_rr_descriptor_field_type(desc, r_cnt), 532238104Sdes rd); 533238104Sdes 534238104Sdes /* check if the origin should be used or concatenated */ 535238104Sdes if (r && ldns_rdf_size(r) > 1 && ldns_rdf_data(r)[0] == 1 536238104Sdes && ldns_rdf_data(r)[1] == '@') { 537238104Sdes ldns_rdf_deep_free(r); 538238104Sdes if (origin) { 539238104Sdes r = ldns_rdf_clone(origin); 540238104Sdes } else { 541238104Sdes /* if this is the SOA, use its own owner name */ 542238104Sdes if (rr_type == LDNS_RR_TYPE_SOA) { 543238104Sdes r = ldns_rdf_clone(ldns_rr_owner(new)); 544238104Sdes } else { 545238104Sdes r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, "."); 546238104Sdes } 547238104Sdes } 548238104Sdes } else if (r && rd_strlen >= 1 && !ldns_dname_str_absolute(rd) && origin) { 549238104Sdes if (ldns_dname_cat(r, origin) != LDNS_STATUS_OK) { 550238104Sdes LDNS_FREE(rd); 551238104Sdes LDNS_FREE(b64); 552238104Sdes ldns_buffer_free(rd_buf); 553238104Sdes ldns_buffer_free(rr_buf); 554238104Sdes LDNS_FREE(rdata); 555238104Sdes ldns_rr_free(new); 556238104Sdes return LDNS_STATUS_ERR; 557238104Sdes } 558238104Sdes } 559238104Sdes break; 560238104Sdes default: 561238104Sdes r = ldns_rdf_new_frm_str( 562238104Sdes ldns_rr_descriptor_field_type(desc, r_cnt), 563238104Sdes rd); 564238104Sdes break; 565238104Sdes } 566238104Sdes if (r) { 567238104Sdes ldns_rr_push_rdf(new, r); 568238104Sdes } else { 569238104Sdes LDNS_FREE(rd); 570238104Sdes LDNS_FREE(b64); 571238104Sdes ldns_buffer_free(rd_buf); 572238104Sdes ldns_buffer_free(rr_buf); 573238104Sdes LDNS_FREE(rdata); 574238104Sdes ldns_rr_free(new); 575238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 576238104Sdes } 577238104Sdes } 578238104Sdes if (quoted) { 579238104Sdes if (ldns_buffer_available(rd_buf, 1)) { 580238104Sdes ldns_buffer_skip(rd_buf, 1); 581238104Sdes } else { 582238104Sdes done = true; 583238104Sdes } 584238104Sdes } 585238104Sdes } else { 586238104Sdes done = true; 587238104Sdes } 588238104Sdes } 589238104Sdes } 590238104Sdes LDNS_FREE(rd); 591238104Sdes LDNS_FREE(b64); 592238104Sdes ldns_buffer_free(rd_buf); 593238104Sdes ldns_buffer_free(rr_buf); 594238104Sdes LDNS_FREE(rdata); 595238104Sdes 596238104Sdes if (!question && desc && !was_unknown_rr_format && ldns_rr_rd_count(new) < r_min) { 597238104Sdes ldns_rr_free(new); 598238104Sdes return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR; 599238104Sdes } 600238104Sdes 601238104Sdes if (newrr) { 602238104Sdes *newrr = new; 603238104Sdes } 604238104Sdes return LDNS_STATUS_OK; 605238104Sdes 606238104Sdesldnserror: 607238104Sdes LDNS_FREE(type); 608238104Sdes LDNS_FREE(owner); 609238104Sdes LDNS_FREE(ttl); 610238104Sdes LDNS_FREE(clas); 611238104Sdes LDNS_FREE(rdata); 612238104Sdes LDNS_FREE(rd); 613238104Sdes LDNS_FREE(rd_buf); 614238104Sdes LDNS_FREE(b64); 615238104Sdes ldns_rr_free(new); 616238104Sdes return status; 617238104Sdes} 618238104Sdes 619238104Sdesldns_status 620238104Sdesldns_rr_new_frm_str(ldns_rr **newrr, const char *str, 621238104Sdes uint32_t default_ttl, ldns_rdf *origin, 622238104Sdes ldns_rdf **prev) 623238104Sdes{ 624238104Sdes return ldns_rr_new_frm_str_internal(newrr, 625238104Sdes str, 626238104Sdes default_ttl, 627238104Sdes origin, 628238104Sdes prev, 629238104Sdes false); 630238104Sdes} 631238104Sdes 632238104Sdesldns_status 633238104Sdesldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str, 634238104Sdes ldns_rdf *origin, ldns_rdf **prev) 635238104Sdes{ 636238104Sdes return ldns_rr_new_frm_str_internal(newrr, 637238104Sdes str, 638238104Sdes 0, 639238104Sdes origin, 640238104Sdes prev, 641238104Sdes true); 642238104Sdes} 643238104Sdes 644238104Sdesldns_status 645238104Sdesldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev) 646238104Sdes{ 647238104Sdes return ldns_rr_new_frm_fp_l(newrr, fp, ttl, origin, prev, NULL); 648238104Sdes} 649238104Sdes 650238104Sdesldns_status 651238104Sdesldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr) 652238104Sdes{ 653238104Sdes char *line; 654238104Sdes const char *endptr; /* unused */ 655238104Sdes ldns_rr *rr; 656238104Sdes uint32_t ttl; 657238104Sdes ldns_rdf *tmp; 658238104Sdes ldns_status s; 659238104Sdes ssize_t size; 660238104Sdes int offset = 0; 661238104Sdes 662238104Sdes if (default_ttl) { 663238104Sdes ttl = *default_ttl; 664238104Sdes } else { 665238104Sdes ttl = 0; 666238104Sdes } 667238104Sdes 668238104Sdes line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); 669238104Sdes if (!line) { 670238104Sdes return LDNS_STATUS_MEM_ERR; 671238104Sdes } 672238104Sdes 673238104Sdes /* read an entire line in from the file */ 674238104Sdes if ((size = ldns_fget_token_l(fp, line, LDNS_PARSE_SKIP_SPACE, LDNS_MAX_LINELEN, line_nr)) == -1) { 675238104Sdes LDNS_FREE(line); 676238104Sdes /* if last line was empty, we are now at feof, which is not 677238104Sdes * always a parse error (happens when for instance last line 678238104Sdes * was a comment) 679238104Sdes */ 680238104Sdes return LDNS_STATUS_SYNTAX_ERR; 681238104Sdes } 682238104Sdes 683238104Sdes /* we can have the situation, where we've read ok, but still got 684238104Sdes * no bytes to play with, in this case size is 0 685238104Sdes */ 686238104Sdes if (size == 0) { 687238104Sdes LDNS_FREE(line); 688238104Sdes return LDNS_STATUS_SYNTAX_EMPTY; 689238104Sdes } 690238104Sdes 691238104Sdes if (strncmp(line, "$ORIGIN", 7) == 0 && isspace(line[7])) { 692238104Sdes if (*origin) { 693238104Sdes ldns_rdf_deep_free(*origin); 694238104Sdes *origin = NULL; 695238104Sdes } 696238104Sdes offset = 8; 697238104Sdes while (isspace(line[offset])) { 698238104Sdes offset++; 699238104Sdes } 700238104Sdes tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, line + offset); 701238104Sdes if (!tmp) { 702238104Sdes /* could not parse what next to $ORIGIN */ 703238104Sdes LDNS_FREE(line); 704238104Sdes return LDNS_STATUS_SYNTAX_DNAME_ERR; 705238104Sdes } 706238104Sdes *origin = tmp; 707238104Sdes s = LDNS_STATUS_SYNTAX_ORIGIN; 708238104Sdes } else if (strncmp(line, "$TTL", 4) == 0 && isspace(line[4])) { 709238104Sdes offset = 5; 710238104Sdes while (isspace(line[offset])) { 711238104Sdes offset++; 712238104Sdes } 713238104Sdes if (default_ttl) { 714238104Sdes *default_ttl = ldns_str2period(line + offset, &endptr); 715238104Sdes } 716238104Sdes s = LDNS_STATUS_SYNTAX_TTL; 717238104Sdes } else if (strncmp(line, "$INCLUDE", 8) == 0) { 718238104Sdes s = LDNS_STATUS_SYNTAX_INCLUDE; 719238104Sdes } else { 720238104Sdes if (origin && *origin) { 721238104Sdes s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, *origin, prev); 722238104Sdes } else { 723238104Sdes s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, NULL, prev); 724238104Sdes } 725238104Sdes } 726238104Sdes LDNS_FREE(line); 727238104Sdes if (newrr && s == LDNS_STATUS_OK) { 728238104Sdes *newrr = rr; 729238104Sdes } 730238104Sdes return s; 731238104Sdes} 732238104Sdes 733238104Sdesvoid 734238104Sdesldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner) 735238104Sdes{ 736238104Sdes rr->_owner = owner; 737238104Sdes} 738238104Sdes 739238104Sdesvoid 740238104Sdesldns_rr_set_question(ldns_rr *rr, bool question) 741238104Sdes{ 742238104Sdes rr->_rr_question = question; 743238104Sdes} 744238104Sdes 745238104Sdesvoid 746238104Sdesldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl) 747238104Sdes{ 748238104Sdes rr->_ttl = ttl; 749238104Sdes} 750238104Sdes 751238104Sdesvoid 752238104Sdesldns_rr_set_rd_count(ldns_rr *rr, size_t count) 753238104Sdes{ 754238104Sdes rr->_rd_count = count; 755238104Sdes} 756238104Sdes 757238104Sdesvoid 758238104Sdesldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type) 759238104Sdes{ 760238104Sdes rr->_rr_type = rr_type; 761238104Sdes} 762238104Sdes 763238104Sdesvoid 764238104Sdesldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class) 765238104Sdes{ 766238104Sdes rr->_rr_class = rr_class; 767238104Sdes} 768238104Sdes 769238104Sdesldns_rdf * 770238104Sdesldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position) 771238104Sdes{ 772238104Sdes size_t rd_count; 773238104Sdes ldns_rdf *pop; 774238104Sdes 775238104Sdes rd_count = ldns_rr_rd_count(rr); 776238104Sdes if (position < rd_count) { 777238104Sdes /* dicard the old one */ 778238104Sdes pop = rr->_rdata_fields[position]; 779238104Sdes rr->_rdata_fields[position] = (ldns_rdf*)f; 780238104Sdes return pop; 781238104Sdes } else { 782238104Sdes return NULL; 783238104Sdes } 784238104Sdes} 785238104Sdes 786238104Sdesbool 787238104Sdesldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f) 788238104Sdes{ 789238104Sdes size_t rd_count; 790238104Sdes ldns_rdf **rdata_fields; 791238104Sdes 792238104Sdes rd_count = ldns_rr_rd_count(rr); 793238104Sdes 794238104Sdes /* grow the array */ 795238104Sdes rdata_fields = LDNS_XREALLOC( 796238104Sdes rr->_rdata_fields, ldns_rdf *, rd_count + 1); 797238104Sdes if (!rdata_fields) { 798238104Sdes return false; 799238104Sdes } 800238104Sdes 801238104Sdes /* add the new member */ 802238104Sdes rr->_rdata_fields = rdata_fields; 803238104Sdes rr->_rdata_fields[rd_count] = (ldns_rdf*)f; 804238104Sdes 805238104Sdes ldns_rr_set_rd_count(rr, rd_count + 1); 806238104Sdes return true; 807238104Sdes} 808238104Sdes 809238104Sdesldns_rdf * 810238104Sdesldns_rr_pop_rdf(ldns_rr *rr) 811238104Sdes{ 812238104Sdes size_t rd_count; 813238104Sdes ldns_rdf *pop; 814238104Sdes ldns_rdf** newrd; 815238104Sdes 816238104Sdes rd_count = ldns_rr_rd_count(rr); 817238104Sdes 818238104Sdes if (rd_count == 0) { 819238104Sdes return NULL; 820238104Sdes } 821238104Sdes 822238104Sdes pop = rr->_rdata_fields[rd_count - 1]; 823238104Sdes 824238104Sdes /* try to shrink the array */ 825238104Sdes if(rd_count > 1) { 826238104Sdes newrd = LDNS_XREALLOC( 827238104Sdes rr->_rdata_fields, ldns_rdf *, rd_count - 1); 828238104Sdes if(newrd) 829238104Sdes rr->_rdata_fields = newrd; 830238104Sdes } else { 831238104Sdes LDNS_FREE(rr->_rdata_fields); 832238104Sdes } 833238104Sdes 834238104Sdes ldns_rr_set_rd_count(rr, rd_count - 1); 835238104Sdes return pop; 836238104Sdes} 837238104Sdes 838238104Sdesldns_rdf * 839238104Sdesldns_rr_rdf(const ldns_rr *rr, size_t nr) 840238104Sdes{ 841238104Sdes if (rr && nr < ldns_rr_rd_count(rr)) { 842238104Sdes return rr->_rdata_fields[nr]; 843238104Sdes } else { 844238104Sdes return NULL; 845238104Sdes } 846238104Sdes} 847238104Sdes 848238104Sdesldns_rdf * 849238104Sdesldns_rr_owner(const ldns_rr *rr) 850238104Sdes{ 851238104Sdes return rr->_owner; 852238104Sdes} 853238104Sdes 854238104Sdesbool 855238104Sdesldns_rr_is_question(const ldns_rr *rr) 856238104Sdes{ 857238104Sdes return rr->_rr_question; 858238104Sdes} 859238104Sdes 860238104Sdesuint32_t 861238104Sdesldns_rr_ttl(const ldns_rr *rr) 862238104Sdes{ 863238104Sdes return rr->_ttl; 864238104Sdes} 865238104Sdes 866238104Sdessize_t 867238104Sdesldns_rr_rd_count(const ldns_rr *rr) 868238104Sdes{ 869238104Sdes return rr->_rd_count; 870238104Sdes} 871238104Sdes 872238104Sdesldns_rr_type 873238104Sdesldns_rr_get_type(const ldns_rr *rr) 874238104Sdes{ 875238104Sdes return rr->_rr_type; 876238104Sdes} 877238104Sdes 878238104Sdesldns_rr_class 879238104Sdesldns_rr_get_class(const ldns_rr *rr) 880238104Sdes{ 881238104Sdes return rr->_rr_class; 882238104Sdes} 883238104Sdes 884238104Sdes/* rr_lists */ 885238104Sdes 886238104Sdessize_t 887238104Sdesldns_rr_list_rr_count(const ldns_rr_list *rr_list) 888238104Sdes{ 889238104Sdes if (rr_list) { 890238104Sdes return rr_list->_rr_count; 891238104Sdes } else { 892238104Sdes return 0; 893238104Sdes } 894238104Sdes} 895238104Sdes 896238104Sdesldns_rr * 897238104Sdesldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count) 898238104Sdes{ 899238104Sdes ldns_rr *old; 900238104Sdes 901238104Sdes if (count > ldns_rr_list_rr_count(rr_list)) { 902238104Sdes return NULL; 903238104Sdes } 904238104Sdes 905238104Sdes old = ldns_rr_list_rr(rr_list, count); 906238104Sdes 907238104Sdes /* overwrite old's pointer */ 908238104Sdes rr_list->_rrs[count] = (ldns_rr*)r; 909238104Sdes return old; 910238104Sdes} 911238104Sdes 912238104Sdesvoid 913238104Sdesldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count) 914238104Sdes{ 915238104Sdes assert(count <= rr_list->_rr_capacity); 916238104Sdes rr_list->_rr_count = count; 917238104Sdes} 918238104Sdes 919238104Sdesldns_rr * 920238104Sdesldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr) 921238104Sdes{ 922238104Sdes if (nr < ldns_rr_list_rr_count(rr_list)) { 923238104Sdes return rr_list->_rrs[nr]; 924238104Sdes } else { 925238104Sdes return NULL; 926238104Sdes } 927238104Sdes} 928238104Sdes 929238104Sdesldns_rr_list * 930246827Sdesldns_rr_list_new(void) 931238104Sdes{ 932238104Sdes ldns_rr_list *rr_list = LDNS_MALLOC(ldns_rr_list); 933238104Sdes if(!rr_list) return NULL; 934238104Sdes rr_list->_rr_count = 0; 935238104Sdes rr_list->_rr_capacity = 0; 936238104Sdes rr_list->_rrs = NULL; 937238104Sdes return rr_list; 938238104Sdes} 939238104Sdes 940238104Sdesvoid 941238104Sdesldns_rr_list_free(ldns_rr_list *rr_list) 942238104Sdes{ 943238104Sdes if (rr_list) { 944238104Sdes LDNS_FREE(rr_list->_rrs); 945238104Sdes LDNS_FREE(rr_list); 946238104Sdes } 947238104Sdes} 948238104Sdes 949238104Sdesvoid 950238104Sdesldns_rr_list_deep_free(ldns_rr_list *rr_list) 951238104Sdes{ 952238104Sdes size_t i; 953238104Sdes 954238104Sdes if (rr_list) { 955238104Sdes for (i=0; i < ldns_rr_list_rr_count(rr_list); i++) { 956238104Sdes ldns_rr_free(ldns_rr_list_rr(rr_list, i)); 957238104Sdes } 958238104Sdes LDNS_FREE(rr_list->_rrs); 959238104Sdes LDNS_FREE(rr_list); 960238104Sdes } 961238104Sdes} 962238104Sdes 963238104Sdes 964238104Sdes/* add right to left. So we modify *left! */ 965238104Sdesbool 966238104Sdesldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right) 967238104Sdes{ 968238104Sdes size_t r_rr_count; 969238104Sdes size_t i; 970238104Sdes 971238104Sdes if (!left) { 972238104Sdes return false; 973238104Sdes } 974238104Sdes 975238104Sdes if (right) { 976238104Sdes r_rr_count = ldns_rr_list_rr_count(right); 977238104Sdes } else { 978238104Sdes r_rr_count = 0; 979238104Sdes } 980238104Sdes 981238104Sdes /* push right to left */ 982238104Sdes for(i = 0; i < r_rr_count; i++) { 983238104Sdes ldns_rr_list_push_rr(left, ldns_rr_list_rr(right, i)); 984238104Sdes } 985238104Sdes return true; 986238104Sdes} 987238104Sdes 988238104Sdesldns_rr_list * 989238104Sdesldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right) 990238104Sdes{ 991238104Sdes size_t l_rr_count; 992238104Sdes size_t r_rr_count; 993238104Sdes size_t i; 994238104Sdes ldns_rr_list *cat; 995238104Sdes 996238104Sdes if (left) { 997238104Sdes l_rr_count = ldns_rr_list_rr_count(left); 998238104Sdes } else { 999238104Sdes return ldns_rr_list_clone(right); 1000238104Sdes } 1001238104Sdes 1002238104Sdes if (right) { 1003238104Sdes r_rr_count = ldns_rr_list_rr_count(right); 1004238104Sdes } else { 1005238104Sdes r_rr_count = 0; 1006238104Sdes } 1007238104Sdes 1008238104Sdes cat = ldns_rr_list_new(); 1009238104Sdes 1010238104Sdes if (!cat) { 1011238104Sdes return NULL; 1012238104Sdes } 1013238104Sdes 1014238104Sdes /* left */ 1015238104Sdes for(i = 0; i < l_rr_count; i++) { 1016238104Sdes ldns_rr_list_push_rr(cat, 1017238104Sdes ldns_rr_clone(ldns_rr_list_rr(left, i))); 1018238104Sdes } 1019238104Sdes /* right */ 1020238104Sdes for(i = 0; i < r_rr_count; i++) { 1021238104Sdes ldns_rr_list_push_rr(cat, 1022238104Sdes ldns_rr_clone(ldns_rr_list_rr(right, i))); 1023238104Sdes } 1024238104Sdes return cat; 1025238104Sdes} 1026238104Sdes 1027238104Sdesldns_rr_list * 1028238104Sdesldns_rr_list_subtype_by_rdf(ldns_rr_list *l, ldns_rdf *r, size_t pos) 1029238104Sdes{ 1030238104Sdes size_t i; 1031238104Sdes ldns_rr_list *subtyped; 1032238104Sdes ldns_rdf *list_rdf; 1033238104Sdes 1034238104Sdes subtyped = ldns_rr_list_new(); 1035238104Sdes 1036238104Sdes for(i = 0; i < ldns_rr_list_rr_count(l); i++) { 1037238104Sdes list_rdf = ldns_rr_rdf( 1038238104Sdes ldns_rr_list_rr(l, i), 1039238104Sdes pos); 1040238104Sdes if (!list_rdf) { 1041238104Sdes /* pos is too large or any other error */ 1042238104Sdes ldns_rr_list_deep_free(subtyped); 1043238104Sdes return NULL; 1044238104Sdes } 1045238104Sdes 1046238104Sdes if (ldns_rdf_compare(list_rdf, r) == 0) { 1047238104Sdes /* a match */ 1048238104Sdes ldns_rr_list_push_rr(subtyped, 1049238104Sdes ldns_rr_clone(ldns_rr_list_rr(l, i))); 1050238104Sdes } 1051238104Sdes } 1052238104Sdes 1053238104Sdes if (ldns_rr_list_rr_count(subtyped) > 0) { 1054238104Sdes return subtyped; 1055238104Sdes } else { 1056238104Sdes ldns_rr_list_free(subtyped); 1057238104Sdes return NULL; 1058238104Sdes } 1059238104Sdes} 1060238104Sdes 1061238104Sdesbool 1062238104Sdesldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr) 1063238104Sdes{ 1064238104Sdes size_t rr_count; 1065238104Sdes size_t cap; 1066238104Sdes 1067238104Sdes rr_count = ldns_rr_list_rr_count(rr_list); 1068238104Sdes cap = rr_list->_rr_capacity; 1069238104Sdes 1070238104Sdes /* grow the array */ 1071238104Sdes if(rr_count+1 > cap) { 1072238104Sdes ldns_rr **rrs; 1073238104Sdes 1074238104Sdes if(cap == 0) 1075238104Sdes cap = LDNS_RRLIST_INIT; /* initial list size */ 1076238104Sdes else cap *= 2; 1077238104Sdes rrs = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap); 1078238104Sdes if (!rrs) { 1079238104Sdes return false; 1080238104Sdes } 1081238104Sdes rr_list->_rrs = rrs; 1082238104Sdes rr_list->_rr_capacity = cap; 1083238104Sdes } 1084238104Sdes 1085238104Sdes /* add the new member */ 1086238104Sdes rr_list->_rrs[rr_count] = (ldns_rr*)rr; 1087238104Sdes 1088238104Sdes ldns_rr_list_set_rr_count(rr_list, rr_count + 1); 1089238104Sdes return true; 1090238104Sdes} 1091238104Sdes 1092238104Sdesbool 1093238104Sdesldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list) 1094238104Sdes{ 1095238104Sdes size_t i; 1096238104Sdes 1097238104Sdes for(i = 0; i < ldns_rr_list_rr_count(push_list); i++) { 1098238104Sdes if (!ldns_rr_list_push_rr(rr_list, 1099238104Sdes ldns_rr_list_rr(push_list, i))) { 1100238104Sdes return false; 1101238104Sdes } 1102238104Sdes } 1103238104Sdes return true; 1104238104Sdes} 1105238104Sdes 1106238104Sdesldns_rr * 1107238104Sdesldns_rr_list_pop_rr(ldns_rr_list *rr_list) 1108238104Sdes{ 1109238104Sdes size_t rr_count; 1110238104Sdes size_t cap; 1111238104Sdes ldns_rr *pop; 1112238104Sdes 1113238104Sdes rr_count = ldns_rr_list_rr_count(rr_list); 1114238104Sdes 1115238104Sdes if (rr_count == 0) { 1116238104Sdes return NULL; 1117238104Sdes } 1118238104Sdes 1119238104Sdes cap = rr_list->_rr_capacity; 1120238104Sdes pop = ldns_rr_list_rr(rr_list, rr_count - 1); 1121238104Sdes 1122238104Sdes /* shrink the array */ 1123238104Sdes if(cap > LDNS_RRLIST_INIT && rr_count-1 <= cap/2) { 1124238104Sdes ldns_rr** a; 1125238104Sdes cap /= 2; 1126238104Sdes a = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap); 1127238104Sdes if(a) { 1128238104Sdes rr_list->_rrs = a; 1129238104Sdes rr_list->_rr_capacity = cap; 1130238104Sdes } 1131238104Sdes } 1132238104Sdes 1133238104Sdes ldns_rr_list_set_rr_count(rr_list, rr_count - 1); 1134238104Sdes 1135238104Sdes return pop; 1136238104Sdes} 1137238104Sdes 1138238104Sdesldns_rr_list * 1139238104Sdesldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t howmany) 1140238104Sdes{ 1141238104Sdes /* pop a number of rr's and put them in a rr_list */ 1142238104Sdes ldns_rr_list *popped; 1143238104Sdes ldns_rr *p; 1144238104Sdes size_t i = howmany; 1145238104Sdes 1146238104Sdes popped = ldns_rr_list_new(); 1147238104Sdes 1148238104Sdes if (!popped) { 1149238104Sdes return NULL; 1150238104Sdes } 1151238104Sdes 1152238104Sdes 1153238104Sdes while(i > 0 && 1154238104Sdes (p = ldns_rr_list_pop_rr(rr_list)) != NULL) { 1155238104Sdes ldns_rr_list_push_rr(popped, p); 1156238104Sdes i--; 1157238104Sdes } 1158238104Sdes 1159238104Sdes if (i == howmany) { 1160238104Sdes return NULL; 1161238104Sdes } else { 1162238104Sdes return popped; 1163238104Sdes } 1164238104Sdes} 1165238104Sdes 1166238104Sdes 1167238104Sdesbool 1168238104Sdesldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr) 1169238104Sdes{ 1170238104Sdes size_t i; 1171238104Sdes 1172238104Sdes if (!rr_list || !rr || ldns_rr_list_rr_count(rr_list) == 0) { 1173238104Sdes return false; 1174238104Sdes } 1175238104Sdes 1176238104Sdes for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { 1177238104Sdes if (rr == ldns_rr_list_rr(rr_list, i)) { 1178238104Sdes return true; 1179238104Sdes } else if (ldns_rr_compare(rr, ldns_rr_list_rr(rr_list, i)) == 0) { 1180238104Sdes return true; 1181238104Sdes } 1182238104Sdes } 1183238104Sdes return false; 1184238104Sdes} 1185238104Sdes 1186238104Sdesbool 1187238104Sdesldns_is_rrset(ldns_rr_list *rr_list) 1188238104Sdes{ 1189238104Sdes ldns_rr_type t; 1190238104Sdes ldns_rr_class c; 1191238104Sdes ldns_rdf *o; 1192238104Sdes ldns_rr *tmp; 1193238104Sdes size_t i; 1194238104Sdes 1195238104Sdes if (!rr_list || ldns_rr_list_rr_count(rr_list) == 0) { 1196238104Sdes return false; 1197238104Sdes } 1198238104Sdes 1199238104Sdes tmp = ldns_rr_list_rr(rr_list, 0); 1200238104Sdes 1201238104Sdes t = ldns_rr_get_type(tmp); 1202238104Sdes c = ldns_rr_get_class(tmp); 1203238104Sdes o = ldns_rr_owner(tmp); 1204238104Sdes 1205238104Sdes /* compare these with the rest of the rr_list, start with 1 */ 1206238104Sdes for (i = 1; i < ldns_rr_list_rr_count(rr_list); i++) { 1207238104Sdes tmp = ldns_rr_list_rr(rr_list, i); 1208238104Sdes if (t != ldns_rr_get_type(tmp)) { 1209238104Sdes return false; 1210238104Sdes } 1211238104Sdes if (c != ldns_rr_get_class(tmp)) { 1212238104Sdes return false; 1213238104Sdes } 1214238104Sdes if (ldns_rdf_compare(o, ldns_rr_owner(tmp)) != 0) { 1215238104Sdes return false; 1216238104Sdes } 1217238104Sdes } 1218238104Sdes return true; 1219238104Sdes} 1220238104Sdes 1221238104Sdesbool 1222238104Sdesldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr) 1223238104Sdes{ 1224238104Sdes size_t rr_count; 1225238104Sdes size_t i; 1226238104Sdes ldns_rr *last; 1227238104Sdes 1228238104Sdes assert(rr != NULL); 1229238104Sdes 1230238104Sdes rr_count = ldns_rr_list_rr_count(rr_list); 1231238104Sdes 1232238104Sdes if (rr_count == 0) { 1233238104Sdes /* nothing there, so checking it is 1234238104Sdes * not needed */ 1235238104Sdes return ldns_rr_list_push_rr(rr_list, rr); 1236238104Sdes } else { 1237238104Sdes /* check with the final rr in the rr_list */ 1238238104Sdes last = ldns_rr_list_rr(rr_list, rr_count - 1); 1239238104Sdes 1240238104Sdes if (ldns_rr_get_class(last) != ldns_rr_get_class(rr)) { 1241238104Sdes return false; 1242238104Sdes } 1243238104Sdes if (ldns_rr_get_type(last) != ldns_rr_get_type(rr)) { 1244238104Sdes return false; 1245238104Sdes } 1246238104Sdes /* only check if not equal to RRSIG */ 1247238104Sdes if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) { 1248238104Sdes if (ldns_rr_ttl(last) != ldns_rr_ttl(rr)) { 1249238104Sdes return false; 1250238104Sdes } 1251238104Sdes } 1252238104Sdes if (ldns_rdf_compare(ldns_rr_owner(last), 1253238104Sdes ldns_rr_owner(rr)) != 0) { 1254238104Sdes return false; 1255238104Sdes } 1256238104Sdes /* ok, still alive - check if the rr already 1257238104Sdes * exists - if so, dont' add it */ 1258238104Sdes for(i = 0; i < rr_count; i++) { 1259238104Sdes if(ldns_rr_compare( 1260238104Sdes ldns_rr_list_rr(rr_list, i), rr) == 0) { 1261238104Sdes return false; 1262238104Sdes } 1263238104Sdes } 1264238104Sdes /* it's safe, push it */ 1265238104Sdes return ldns_rr_list_push_rr(rr_list, rr); 1266238104Sdes } 1267238104Sdes} 1268238104Sdes 1269238104Sdesldns_rr * 1270238104Sdesldns_rr_set_pop_rr(ldns_rr_list *rr_list) 1271238104Sdes{ 1272238104Sdes return ldns_rr_list_pop_rr(rr_list); 1273238104Sdes} 1274238104Sdes 1275238104Sdesldns_rr_list * 1276238104Sdesldns_rr_list_pop_rrset(ldns_rr_list *rr_list) 1277238104Sdes{ 1278238104Sdes ldns_rr_list *rrset; 1279238104Sdes ldns_rr *last_rr = NULL; 1280238104Sdes ldns_rr *next_rr; 1281238104Sdes 1282238104Sdes if (!rr_list) { 1283238104Sdes return NULL; 1284238104Sdes } 1285238104Sdes 1286238104Sdes rrset = ldns_rr_list_new(); 1287238104Sdes if (!last_rr) { 1288238104Sdes last_rr = ldns_rr_list_pop_rr(rr_list); 1289238104Sdes if (!last_rr) { 1290238104Sdes ldns_rr_list_free(rrset); 1291238104Sdes return NULL; 1292238104Sdes } else { 1293238104Sdes ldns_rr_list_push_rr(rrset, last_rr); 1294238104Sdes } 1295238104Sdes } 1296238104Sdes 1297238104Sdes if (ldns_rr_list_rr_count(rr_list) > 0) { 1298238104Sdes next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1); 1299238104Sdes } else { 1300238104Sdes next_rr = NULL; 1301238104Sdes } 1302238104Sdes 1303238104Sdes while (next_rr) { 1304238104Sdes if ( 1305238104Sdes ldns_rdf_compare(ldns_rr_owner(next_rr), 1306238104Sdes ldns_rr_owner(last_rr)) == 0 1307238104Sdes && 1308238104Sdes ldns_rr_get_type(next_rr) == ldns_rr_get_type(last_rr) 1309238104Sdes && 1310238104Sdes ldns_rr_get_class(next_rr) == ldns_rr_get_class(last_rr) 1311238104Sdes ) { 1312238104Sdes ldns_rr_list_push_rr(rrset, ldns_rr_list_pop_rr(rr_list)); 1313238104Sdes if (ldns_rr_list_rr_count(rr_list) > 0) { 1314238104Sdes last_rr = next_rr; 1315238104Sdes next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1); 1316238104Sdes } else { 1317238104Sdes next_rr = NULL; 1318238104Sdes } 1319238104Sdes } else { 1320238104Sdes next_rr = NULL; 1321238104Sdes } 1322238104Sdes } 1323238104Sdes 1324238104Sdes return rrset; 1325238104Sdes} 1326238104Sdes 1327238104Sdesldns_rr * 1328238104Sdesldns_rr_clone(const ldns_rr *rr) 1329238104Sdes{ 1330238104Sdes size_t i; 1331238104Sdes ldns_rr *new_rr; 1332238104Sdes 1333238104Sdes if (!rr) { 1334238104Sdes return NULL; 1335238104Sdes } 1336238104Sdes 1337238104Sdes new_rr = ldns_rr_new(); 1338238104Sdes if (!new_rr) { 1339238104Sdes return NULL; 1340238104Sdes } 1341238104Sdes if (ldns_rr_owner(rr)) { 1342238104Sdes ldns_rr_set_owner(new_rr, ldns_rdf_clone(ldns_rr_owner(rr))); 1343238104Sdes } 1344238104Sdes ldns_rr_set_ttl(new_rr, ldns_rr_ttl(rr)); 1345238104Sdes ldns_rr_set_type(new_rr, ldns_rr_get_type(rr)); 1346238104Sdes ldns_rr_set_class(new_rr, ldns_rr_get_class(rr)); 1347238104Sdes ldns_rr_set_question(new_rr, ldns_rr_is_question(rr)); 1348238104Sdes 1349238104Sdes for (i = 0; i < ldns_rr_rd_count(rr); i++) { 1350238104Sdes if (ldns_rr_rdf(rr,i)) { 1351238104Sdes ldns_rr_push_rdf(new_rr, ldns_rdf_clone(ldns_rr_rdf(rr, i))); 1352238104Sdes } 1353238104Sdes } 1354238104Sdes 1355238104Sdes return new_rr; 1356238104Sdes} 1357238104Sdes 1358238104Sdesldns_rr_list * 1359238104Sdesldns_rr_list_clone(const ldns_rr_list *rrlist) 1360238104Sdes{ 1361238104Sdes size_t i; 1362238104Sdes ldns_rr_list *new_list; 1363238104Sdes ldns_rr *r; 1364238104Sdes 1365238104Sdes if (!rrlist) { 1366238104Sdes return NULL; 1367238104Sdes } 1368238104Sdes 1369238104Sdes new_list = ldns_rr_list_new(); 1370238104Sdes if (!new_list) { 1371238104Sdes return NULL; 1372238104Sdes } 1373238104Sdes for (i = 0; i < ldns_rr_list_rr_count(rrlist); i++) { 1374238104Sdes r = ldns_rr_clone( 1375238104Sdes ldns_rr_list_rr(rrlist, i) 1376238104Sdes ); 1377238104Sdes if (!r) { 1378238104Sdes /* huh, failure in cloning */ 1379238104Sdes ldns_rr_list_deep_free(new_list); 1380238104Sdes return NULL; 1381238104Sdes } 1382238104Sdes ldns_rr_list_push_rr(new_list, r); 1383238104Sdes } 1384238104Sdes return new_list; 1385238104Sdes} 1386238104Sdes 1387238104Sdes 1388246827Sdesstatic int 1389238104Sdesqsort_rr_compare(const void *a, const void *b) 1390238104Sdes{ 1391238104Sdes const ldns_rr *rr1 = * (const ldns_rr **) a; 1392238104Sdes const ldns_rr *rr2 = * (const ldns_rr **) b; 1393238104Sdes 1394238104Sdes if (rr1 == NULL && rr2 == NULL) { 1395238104Sdes return 0; 1396238104Sdes } 1397238104Sdes if (rr1 == NULL) { 1398238104Sdes return -1; 1399238104Sdes } 1400238104Sdes if (rr2 == NULL) { 1401238104Sdes return 1; 1402238104Sdes } 1403238104Sdes return ldns_rr_compare(rr1, rr2); 1404238104Sdes} 1405238104Sdes 1406246827Sdesstatic int 1407238104Sdesqsort_schwartz_rr_compare(const void *a, const void *b) 1408238104Sdes{ 1409238104Sdes int result = 0; 1410238104Sdes ldns_rr *rr1, *rr2; 1411238104Sdes ldns_buffer *rr1_buf, *rr2_buf; 1412238104Sdes struct ldns_schwartzian_compare_struct *sa = *(struct ldns_schwartzian_compare_struct **) a; 1413238104Sdes struct ldns_schwartzian_compare_struct *sb = *(struct ldns_schwartzian_compare_struct **) b; 1414238104Sdes /* if we are doing 2wire, we need to do lowercasing on the dname (and maybe on the rdata) 1415238104Sdes * this must be done for comparison only, so we need to have a temp var for both buffers, 1416238104Sdes * which is only used when the transformed object value isn't there yet 1417238104Sdes */ 1418238104Sdes ldns_rr *canonical_a, *canonical_b; 1419238104Sdes 1420238104Sdes rr1 = (ldns_rr *) sa->original_object; 1421238104Sdes rr2 = (ldns_rr *) sb->original_object; 1422238104Sdes 1423238104Sdes result = ldns_rr_compare_no_rdata(rr1, rr2); 1424238104Sdes 1425238104Sdes if (result == 0) { 1426238104Sdes if (!sa->transformed_object) { 1427238104Sdes canonical_a = ldns_rr_clone(sa->original_object); 1428238104Sdes ldns_rr2canonical(canonical_a); 1429238104Sdes sa->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_a)); 1430238104Sdes if (ldns_rr2buffer_wire(sa->transformed_object, canonical_a, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { 1431238104Sdes ldns_buffer_free((ldns_buffer *)sa->transformed_object); 1432238104Sdes sa->transformed_object = NULL; 1433238104Sdes ldns_rr_free(canonical_a); 1434238104Sdes return 0; 1435238104Sdes } 1436238104Sdes ldns_rr_free(canonical_a); 1437238104Sdes } 1438238104Sdes if (!sb->transformed_object) { 1439238104Sdes canonical_b = ldns_rr_clone(sb->original_object); 1440238104Sdes ldns_rr2canonical(canonical_b); 1441238104Sdes sb->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_b)); 1442238104Sdes if (ldns_rr2buffer_wire(sb->transformed_object, canonical_b, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { 1443238104Sdes ldns_buffer_free((ldns_buffer *)sa->transformed_object); 1444238104Sdes ldns_buffer_free((ldns_buffer *)sb->transformed_object); 1445238104Sdes sa->transformed_object = NULL; 1446238104Sdes sb->transformed_object = NULL; 1447238104Sdes ldns_rr_free(canonical_b); 1448238104Sdes return 0; 1449238104Sdes } 1450238104Sdes ldns_rr_free(canonical_b); 1451238104Sdes } 1452238104Sdes rr1_buf = (ldns_buffer *) sa->transformed_object; 1453238104Sdes rr2_buf = (ldns_buffer *) sb->transformed_object; 1454238104Sdes 1455238104Sdes result = ldns_rr_compare_wire(rr1_buf, rr2_buf); 1456238104Sdes } 1457238104Sdes 1458238104Sdes return result; 1459238104Sdes} 1460238104Sdes 1461238104Sdesvoid 1462238104Sdesldns_rr_list_sort(ldns_rr_list *unsorted) 1463238104Sdes{ 1464238104Sdes struct ldns_schwartzian_compare_struct **sortables; 1465238104Sdes size_t item_count; 1466238104Sdes size_t i; 1467238104Sdes 1468238104Sdes if (unsorted) { 1469238104Sdes item_count = ldns_rr_list_rr_count(unsorted); 1470238104Sdes 1471238104Sdes sortables = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct *, 1472238104Sdes item_count); 1473238104Sdes if(!sortables) return; /* no way to return error */ 1474238104Sdes for (i = 0; i < item_count; i++) { 1475238104Sdes sortables[i] = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct, 1); 1476238104Sdes if(!sortables[i]) { 1477238104Sdes /* free the allocated parts */ 1478238104Sdes while(i>0) { 1479238104Sdes i--; 1480238104Sdes LDNS_FREE(sortables[i]); 1481238104Sdes } 1482238104Sdes /* no way to return error */ 1483238104Sdes return; 1484238104Sdes } 1485238104Sdes sortables[i]->original_object = ldns_rr_list_rr(unsorted, i); 1486238104Sdes sortables[i]->transformed_object = NULL; 1487238104Sdes } 1488238104Sdes qsort(sortables, 1489238104Sdes item_count, 1490238104Sdes sizeof(struct ldns_schwartzian_compare_struct *), 1491238104Sdes qsort_schwartz_rr_compare); 1492238104Sdes for (i = 0; i < item_count; i++) { 1493238104Sdes unsorted->_rrs[i] = sortables[i]->original_object; 1494238104Sdes if (sortables[i]->transformed_object) { 1495238104Sdes ldns_buffer_free(sortables[i]->transformed_object); 1496238104Sdes } 1497238104Sdes LDNS_FREE(sortables[i]); 1498238104Sdes } 1499238104Sdes LDNS_FREE(sortables); 1500238104Sdes } 1501238104Sdes} 1502238104Sdes 1503238104Sdesint 1504238104Sdesldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2) 1505238104Sdes{ 1506238104Sdes size_t rr1_len; 1507238104Sdes size_t rr2_len; 1508238104Sdes size_t offset; 1509238104Sdes 1510238104Sdes assert(rr1 != NULL); 1511238104Sdes assert(rr2 != NULL); 1512238104Sdes 1513238104Sdes rr1_len = ldns_rr_uncompressed_size(rr1); 1514238104Sdes rr2_len = ldns_rr_uncompressed_size(rr2); 1515238104Sdes 1516238104Sdes if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) < 0) { 1517238104Sdes return -1; 1518238104Sdes } else if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) > 0) { 1519238104Sdes return 1; 1520238104Sdes } 1521238104Sdes 1522238104Sdes /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */ 1523238104Sdes if (ldns_rr_get_class(rr1) != ldns_rr_get_class(rr2)) { 1524238104Sdes return ldns_rr_get_class(rr1) - ldns_rr_get_class(rr2); 1525238104Sdes } 1526238104Sdes 1527238104Sdes /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */ 1528238104Sdes if (ldns_rr_get_type(rr1) != ldns_rr_get_type(rr2)) { 1529238104Sdes return ldns_rr_get_type(rr1) - ldns_rr_get_type(rr2); 1530238104Sdes } 1531238104Sdes 1532238104Sdes /* offset is the owername length + ttl + type + class + rdlen == start of wire format rdata */ 1533238104Sdes offset = ldns_rdf_size(ldns_rr_owner(rr1)) + 4 + 2 + 2 + 2; 1534238104Sdes /* if either record doesn't have any RDATA... */ 1535238104Sdes if (offset > rr1_len || offset > rr2_len) { 1536238104Sdes if (rr1_len == rr2_len) { 1537238104Sdes return 0; 1538238104Sdes } 1539238104Sdes return ((int) rr2_len - (int) rr1_len); 1540238104Sdes } 1541238104Sdes 1542238104Sdes return 0; 1543238104Sdes} 1544238104Sdes 1545238104Sdesint ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf) 1546238104Sdes{ 1547238104Sdes size_t rr1_len, rr2_len, min_len, i, offset; 1548238104Sdes 1549238104Sdes rr1_len = ldns_buffer_capacity(rr1_buf); 1550238104Sdes rr2_len = ldns_buffer_capacity(rr2_buf); 1551238104Sdes 1552238104Sdes /* jump past dname (checked in earlier part) 1553238104Sdes * and especially past TTL */ 1554238104Sdes offset = 0; 1555238104Sdes while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) { 1556238104Sdes offset += *ldns_buffer_at(rr1_buf, offset) + 1; 1557238104Sdes } 1558238104Sdes /* jump to rdata section (PAST the rdata length field, otherwise 1559238104Sdes rrs with different lengths might be sorted erroneously */ 1560238104Sdes offset += 11; 1561238104Sdes min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len; 1562238104Sdes /* Compare RRs RDATA byte for byte. */ 1563238104Sdes for(i = offset; i < min_len; i++) { 1564238104Sdes if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) { 1565238104Sdes return -1; 1566238104Sdes } else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) { 1567238104Sdes return +1; 1568238104Sdes } 1569238104Sdes } 1570238104Sdes 1571238104Sdes /* If both RDATAs are the same up to min_len, then the shorter one sorts first. */ 1572238104Sdes if (rr1_len < rr2_len) { 1573238104Sdes return -1; 1574238104Sdes } else if (rr1_len > rr2_len) { 1575238104Sdes return +1; 1576238104Sdes } 1577238104Sdes /* The RDATAs are equal. */ 1578238104Sdes return 0; 1579238104Sdes 1580238104Sdes} 1581238104Sdes 1582238104Sdesint 1583238104Sdesldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2) 1584238104Sdes{ 1585238104Sdes int result; 1586238104Sdes size_t rr1_len, rr2_len; 1587238104Sdes 1588238104Sdes ldns_buffer *rr1_buf; 1589238104Sdes ldns_buffer *rr2_buf; 1590238104Sdes 1591238104Sdes result = ldns_rr_compare_no_rdata(rr1, rr2); 1592238104Sdes if (result == 0) { 1593238104Sdes rr1_len = ldns_rr_uncompressed_size(rr1); 1594238104Sdes rr2_len = ldns_rr_uncompressed_size(rr2); 1595238104Sdes 1596238104Sdes rr1_buf = ldns_buffer_new(rr1_len); 1597238104Sdes rr2_buf = ldns_buffer_new(rr2_len); 1598238104Sdes 1599238104Sdes if (ldns_rr2buffer_wire_canonical(rr1_buf, 1600238104Sdes rr1, 1601238104Sdes LDNS_SECTION_ANY) 1602238104Sdes != LDNS_STATUS_OK) { 1603238104Sdes ldns_buffer_free(rr1_buf); 1604238104Sdes ldns_buffer_free(rr2_buf); 1605238104Sdes return 0; 1606238104Sdes } 1607238104Sdes if (ldns_rr2buffer_wire_canonical(rr2_buf, 1608238104Sdes rr2, 1609238104Sdes LDNS_SECTION_ANY) 1610238104Sdes != LDNS_STATUS_OK) { 1611238104Sdes ldns_buffer_free(rr1_buf); 1612238104Sdes ldns_buffer_free(rr2_buf); 1613238104Sdes return 0; 1614238104Sdes } 1615238104Sdes 1616238104Sdes result = ldns_rr_compare_wire(rr1_buf, rr2_buf); 1617238104Sdes 1618238104Sdes ldns_buffer_free(rr1_buf); 1619238104Sdes ldns_buffer_free(rr2_buf); 1620238104Sdes } 1621238104Sdes 1622238104Sdes return result; 1623238104Sdes} 1624238104Sdes 1625238104Sdes/* convert dnskey to a ds with the given algorithm, 1626238104Sdes * then compare the result with the given ds */ 1627238104Sdesstatic int 1628238104Sdesldns_rr_compare_ds_dnskey(ldns_rr *ds, 1629238104Sdes ldns_rr *dnskey) 1630238104Sdes{ 1631238104Sdes ldns_rr *ds_gen; 1632238104Sdes bool result = false; 1633238104Sdes ldns_hash algo; 1634238104Sdes 1635238104Sdes if (!dnskey || !ds || 1636238104Sdes ldns_rr_get_type(ds) != LDNS_RR_TYPE_DS || 1637238104Sdes ldns_rr_get_type(dnskey) != LDNS_RR_TYPE_DNSKEY) { 1638238104Sdes return false; 1639238104Sdes } 1640238104Sdes 1641238104Sdes if (ldns_rr_rdf(ds, 2) == NULL) { 1642238104Sdes return false; 1643238104Sdes } 1644238104Sdes algo = ldns_rdf2native_int8(ldns_rr_rdf(ds, 2)); 1645238104Sdes 1646238104Sdes ds_gen = ldns_key_rr2ds(dnskey, algo); 1647238104Sdes if (ds_gen) { 1648238104Sdes result = ldns_rr_compare(ds, ds_gen) == 0; 1649238104Sdes ldns_rr_free(ds_gen); 1650238104Sdes } 1651238104Sdes return result; 1652238104Sdes} 1653238104Sdes 1654238104Sdesbool 1655238104Sdesldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2) 1656238104Sdes{ 1657238104Sdes bool result; 1658238104Sdes ldns_rr *rr1 = ldns_rr_clone(orr1); 1659238104Sdes ldns_rr *rr2 = ldns_rr_clone(orr2); 1660238104Sdes 1661238104Sdes /* set ttls to zero */ 1662238104Sdes ldns_rr_set_ttl(rr1, 0); 1663238104Sdes ldns_rr_set_ttl(rr2, 0); 1664238104Sdes 1665238104Sdes if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DS && 1666238104Sdes ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DNSKEY) { 1667238104Sdes result = ldns_rr_compare_ds_dnskey(rr1, rr2); 1668238104Sdes } else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DNSKEY && 1669238104Sdes ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DS) { 1670238104Sdes result = ldns_rr_compare_ds_dnskey(rr2, rr1); 1671238104Sdes } else { 1672238104Sdes result = (ldns_rr_compare(rr1, rr2) == 0); 1673238104Sdes } 1674238104Sdes 1675238104Sdes ldns_rr_free(rr1); 1676238104Sdes ldns_rr_free(rr2); 1677238104Sdes 1678238104Sdes return result; 1679238104Sdes} 1680238104Sdes 1681238104Sdesint 1682238104Sdesldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2) 1683238104Sdes{ 1684238104Sdes size_t i = 0; 1685238104Sdes int rr_cmp; 1686238104Sdes 1687238104Sdes assert(rrl1 != NULL); 1688238104Sdes assert(rrl2 != NULL); 1689238104Sdes 1690238104Sdes for (i = 0; i < ldns_rr_list_rr_count(rrl1) && i < ldns_rr_list_rr_count(rrl2); i++) { 1691238104Sdes rr_cmp = ldns_rr_compare(ldns_rr_list_rr(rrl1, i), ldns_rr_list_rr(rrl2, i)); 1692238104Sdes if (rr_cmp != 0) { 1693238104Sdes return rr_cmp; 1694238104Sdes } 1695238104Sdes } 1696238104Sdes 1697238104Sdes if (i == ldns_rr_list_rr_count(rrl1) && 1698238104Sdes i != ldns_rr_list_rr_count(rrl2)) { 1699238104Sdes return 1; 1700238104Sdes } else if (i == ldns_rr_list_rr_count(rrl2) && 1701238104Sdes i != ldns_rr_list_rr_count(rrl1)) { 1702238104Sdes return -1; 1703238104Sdes } else { 1704238104Sdes return 0; 1705238104Sdes } 1706238104Sdes} 1707238104Sdes 1708238104Sdessize_t 1709238104Sdesldns_rr_uncompressed_size(const ldns_rr *r) 1710238104Sdes{ 1711238104Sdes size_t rrsize; 1712238104Sdes size_t i; 1713238104Sdes 1714238104Sdes rrsize = 0; 1715238104Sdes /* add all the rdf sizes */ 1716238104Sdes for(i = 0; i < ldns_rr_rd_count(r); i++) { 1717238104Sdes rrsize += ldns_rdf_size(ldns_rr_rdf(r, i)); 1718238104Sdes } 1719238104Sdes /* ownername */ 1720238104Sdes rrsize += ldns_rdf_size(ldns_rr_owner(r)); 1721238104Sdes rrsize += LDNS_RR_OVERHEAD; 1722238104Sdes return rrsize; 1723238104Sdes} 1724238104Sdes 1725238104Sdesvoid 1726238104Sdesldns_rr2canonical(ldns_rr *rr) 1727238104Sdes{ 1728238104Sdes uint16_t i; 1729238104Sdes 1730238104Sdes if (!rr) { 1731238104Sdes return; 1732238104Sdes } 1733238104Sdes 1734238104Sdes ldns_dname2canonical(ldns_rr_owner(rr)); 1735238104Sdes 1736238104Sdes /* 1737238104Sdes * lowercase the rdata dnames if the rr type is one 1738238104Sdes * of the list in chapter 7 of RFC3597 1739238104Sdes * Also added RRSIG, because a "Signer's Name" should be canonicalized 1740238104Sdes * too. See dnssec-bis-updates-16. We can add it to this list because 1741238104Sdes * the "Signer's Name" is the only dname type rdata field in a RRSIG. 1742238104Sdes */ 1743238104Sdes switch(ldns_rr_get_type(rr)) { 1744238104Sdes case LDNS_RR_TYPE_NS: 1745238104Sdes case LDNS_RR_TYPE_MD: 1746238104Sdes case LDNS_RR_TYPE_MF: 1747238104Sdes case LDNS_RR_TYPE_CNAME: 1748238104Sdes case LDNS_RR_TYPE_SOA: 1749238104Sdes case LDNS_RR_TYPE_MB: 1750238104Sdes case LDNS_RR_TYPE_MG: 1751238104Sdes case LDNS_RR_TYPE_MR: 1752238104Sdes case LDNS_RR_TYPE_PTR: 1753238104Sdes case LDNS_RR_TYPE_MINFO: 1754238104Sdes case LDNS_RR_TYPE_MX: 1755238104Sdes case LDNS_RR_TYPE_RP: 1756238104Sdes case LDNS_RR_TYPE_AFSDB: 1757238104Sdes case LDNS_RR_TYPE_RT: 1758238104Sdes case LDNS_RR_TYPE_SIG: 1759238104Sdes case LDNS_RR_TYPE_PX: 1760238104Sdes case LDNS_RR_TYPE_NXT: 1761238104Sdes case LDNS_RR_TYPE_NAPTR: 1762238104Sdes case LDNS_RR_TYPE_KX: 1763238104Sdes case LDNS_RR_TYPE_SRV: 1764238104Sdes case LDNS_RR_TYPE_DNAME: 1765238104Sdes case LDNS_RR_TYPE_A6: 1766238104Sdes case LDNS_RR_TYPE_RRSIG: 1767238104Sdes for (i = 0; i < ldns_rr_rd_count(rr); i++) { 1768238104Sdes ldns_dname2canonical(ldns_rr_rdf(rr, i)); 1769238104Sdes } 1770238104Sdes return; 1771238104Sdes default: 1772238104Sdes /* do nothing */ 1773238104Sdes return; 1774238104Sdes } 1775238104Sdes} 1776238104Sdes 1777238104Sdesvoid 1778238104Sdesldns_rr_list2canonical(ldns_rr_list *rr_list) 1779238104Sdes{ 1780238104Sdes size_t i; 1781238104Sdes for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { 1782238104Sdes ldns_rr2canonical(ldns_rr_list_rr(rr_list, i)); 1783238104Sdes } 1784238104Sdes} 1785238104Sdes 1786238104Sdesuint8_t 1787238104Sdesldns_rr_label_count(ldns_rr *rr) 1788238104Sdes{ 1789238104Sdes if (!rr) { 1790238104Sdes return 0; 1791238104Sdes } 1792238104Sdes return ldns_dname_label_count( 1793238104Sdes ldns_rr_owner(rr)); 1794238104Sdes} 1795238104Sdes 1796238104Sdes/** \cond */ 1797238104Sdesstatic const ldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; 1798238104Sdesstatic const ldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A }; 1799238104Sdesstatic const ldns_rdf_type type_ns_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1800238104Sdesstatic const ldns_rdf_type type_md_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1801238104Sdesstatic const ldns_rdf_type type_mf_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1802238104Sdesstatic const ldns_rdf_type type_cname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1803238104Sdesstatic const ldns_rdf_type type_soa_wireformat[] = { 1804238104Sdes LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_INT32, 1805238104Sdes LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, 1806238104Sdes LDNS_RDF_TYPE_PERIOD 1807238104Sdes}; 1808238104Sdesstatic const ldns_rdf_type type_mb_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1809238104Sdesstatic const ldns_rdf_type type_mg_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1810238104Sdesstatic const ldns_rdf_type type_mr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1811238104Sdesstatic const ldns_rdf_type type_wks_wireformat[] = { 1812238104Sdes LDNS_RDF_TYPE_A, LDNS_RDF_TYPE_WKS 1813238104Sdes}; 1814238104Sdesstatic const ldns_rdf_type type_ptr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1815238104Sdesstatic const ldns_rdf_type type_hinfo_wireformat[] = { 1816238104Sdes LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR 1817238104Sdes}; 1818238104Sdesstatic const ldns_rdf_type type_minfo_wireformat[] = { 1819238104Sdes LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1820238104Sdes}; 1821238104Sdesstatic const ldns_rdf_type type_mx_wireformat[] = { 1822238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1823238104Sdes}; 1824238104Sdesstatic const ldns_rdf_type type_rp_wireformat[] = { 1825238104Sdes LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1826238104Sdes}; 1827238104Sdesstatic const ldns_rdf_type type_afsdb_wireformat[] = { 1828238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1829238104Sdes}; 1830238104Sdesstatic const ldns_rdf_type type_x25_wireformat[] = { LDNS_RDF_TYPE_STR }; 1831238104Sdesstatic const ldns_rdf_type type_isdn_wireformat[] = { 1832238104Sdes LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR 1833238104Sdes}; 1834238104Sdesstatic const ldns_rdf_type type_rt_wireformat[] = { 1835238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1836238104Sdes}; 1837238104Sdesstatic const ldns_rdf_type type_nsap_wireformat[] = { 1838238104Sdes LDNS_RDF_TYPE_NSAP 1839238104Sdes}; 1840238104Sdesstatic const ldns_rdf_type type_nsap_ptr_wireformat[] = { 1841238104Sdes LDNS_RDF_TYPE_STR 1842238104Sdes}; 1843238104Sdesstatic const ldns_rdf_type type_sig_wireformat[] = { 1844238104Sdes LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, 1845238104Sdes LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, 1846238104Sdes LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 1847238104Sdes}; 1848238104Sdesstatic const ldns_rdf_type type_key_wireformat[] = { 1849238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 1850238104Sdes}; 1851238104Sdesstatic const ldns_rdf_type type_px_wireformat[] = { 1852238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1853238104Sdes}; 1854238104Sdesstatic const ldns_rdf_type type_gpos_wireformat[] = { 1855238104Sdes LDNS_RDF_TYPE_STR, 1856238104Sdes LDNS_RDF_TYPE_STR, 1857238104Sdes LDNS_RDF_TYPE_STR 1858238104Sdes}; 1859238104Sdesstatic const ldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA }; 1860238104Sdesstatic const ldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC }; 1861238104Sdesstatic const ldns_rdf_type type_nxt_wireformat[] = { 1862238104Sdes LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_UNKNOWN 1863238104Sdes}; 1864238104Sdesstatic const ldns_rdf_type type_eid_wireformat[] = { 1865238104Sdes LDNS_RDF_TYPE_HEX 1866238104Sdes}; 1867238104Sdesstatic const ldns_rdf_type type_nimloc_wireformat[] = { 1868238104Sdes LDNS_RDF_TYPE_HEX 1869238104Sdes}; 1870238104Sdesstatic const ldns_rdf_type type_srv_wireformat[] = { 1871238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1872238104Sdes}; 1873238104Sdesstatic const ldns_rdf_type type_atma_wireformat[] = { 1874238104Sdes LDNS_RDF_TYPE_ATMA 1875238104Sdes}; 1876238104Sdesstatic const ldns_rdf_type type_naptr_wireformat[] = { 1877238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_DNAME 1878238104Sdes}; 1879238104Sdesstatic const ldns_rdf_type type_kx_wireformat[] = { 1880238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1881238104Sdes}; 1882238104Sdesstatic const ldns_rdf_type type_cert_wireformat[] = { 1883238104Sdes LDNS_RDF_TYPE_CERT_ALG, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_B64 1884238104Sdes}; 1885238104Sdesstatic const ldns_rdf_type type_a6_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; 1886238104Sdesstatic const ldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1887238104Sdesstatic const ldns_rdf_type type_sink_wireformat[] = { LDNS_RDF_TYPE_INT8, 1888238104Sdes LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 1889238104Sdes}; 1890238104Sdesstatic const ldns_rdf_type type_apl_wireformat[] = { 1891238104Sdes LDNS_RDF_TYPE_APL 1892238104Sdes}; 1893238104Sdesstatic const ldns_rdf_type type_ds_wireformat[] = { 1894238104Sdes LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX 1895238104Sdes}; 1896238104Sdesstatic const ldns_rdf_type type_sshfp_wireformat[] = { 1897238104Sdes LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX 1898238104Sdes}; 1899238104Sdesstatic const ldns_rdf_type type_ipseckey_wireformat[] = { 1900238104Sdes LDNS_RDF_TYPE_IPSECKEY 1901238104Sdes}; 1902238104Sdesstatic const ldns_rdf_type type_rrsig_wireformat[] = { 1903238104Sdes LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, 1904238104Sdes LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 1905238104Sdes}; 1906238104Sdesstatic const ldns_rdf_type type_nsec_wireformat[] = { 1907238104Sdes LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_NSEC 1908238104Sdes}; 1909238104Sdesstatic const ldns_rdf_type type_dhcid_wireformat[] = { 1910238104Sdes LDNS_RDF_TYPE_B64 1911238104Sdes}; 1912238104Sdesstatic const ldns_rdf_type type_talink_wireformat[] = { 1913238104Sdes LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1914238104Sdes}; 1915238104Sdes/* nsec3 is some vars, followed by same type of data of nsec */ 1916238104Sdesstatic const ldns_rdf_type type_nsec3_wireformat[] = { 1917238104Sdes/* LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/ 1918238104Sdes 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 1919238104Sdes}; 1920238104Sdes 1921238104Sdesstatic const ldns_rdf_type type_nsec3param_wireformat[] = { 1922238104Sdes/* LDNS_RDF_TYPE_NSEC3_PARAMS_VARS*/ 1923238104Sdes LDNS_RDF_TYPE_INT8, 1924238104Sdes LDNS_RDF_TYPE_INT8, 1925238104Sdes LDNS_RDF_TYPE_INT16, 1926238104Sdes LDNS_RDF_TYPE_NSEC3_SALT 1927238104Sdes}; 1928238104Sdes 1929238104Sdesstatic const ldns_rdf_type type_dnskey_wireformat[] = { 1930238104Sdes LDNS_RDF_TYPE_INT16, 1931238104Sdes LDNS_RDF_TYPE_INT8, 1932238104Sdes LDNS_RDF_TYPE_ALG, 1933238104Sdes LDNS_RDF_TYPE_B64 1934238104Sdes}; 1935238104Sdesstatic const ldns_rdf_type type_tsig_wireformat[] = { 1936238104Sdes LDNS_RDF_TYPE_DNAME, 1937238104Sdes LDNS_RDF_TYPE_TSIGTIME, 1938238104Sdes LDNS_RDF_TYPE_INT16, 1939238104Sdes LDNS_RDF_TYPE_INT16_DATA, 1940238104Sdes LDNS_RDF_TYPE_INT16, 1941238104Sdes LDNS_RDF_TYPE_INT16, 1942238104Sdes LDNS_RDF_TYPE_INT16_DATA 1943238104Sdes}; 1944238104Sdes/** \endcond */ 1945238104Sdes 1946238104Sdes/** \cond */ 1947238104Sdes/* All RR's defined in 1035 are well known and can thus 1948238104Sdes * be compressed. See RFC3597. These RR's are: 1949238104Sdes * CNAME HINFO MB MD MF MG MINFO MR MX NULL NS PTR SOA TXT 1950238104Sdes */ 1951238104Sdesstatic ldns_rr_descriptor rdata_field_descriptors[] = { 1952238104Sdes /* 0 */ 1953238104Sdes { 0, NULL, 0, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1954238104Sdes /* 1 */ 1955238104Sdes {LDNS_RR_TYPE_A, "A", 1, 1, type_a_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1956238104Sdes /* 2 */ 1957238104Sdes {LDNS_RR_TYPE_NS, "NS", 1, 1, type_ns_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1958238104Sdes /* 3 */ 1959238104Sdes {LDNS_RR_TYPE_MD, "MD", 1, 1, type_md_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1960238104Sdes /* 4 */ 1961238104Sdes {LDNS_RR_TYPE_MF, "MF", 1, 1, type_mf_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1962238104Sdes /* 5 */ 1963238104Sdes {LDNS_RR_TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1964238104Sdes /* 6 */ 1965238104Sdes {LDNS_RR_TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, 1966238104Sdes /* 7 */ 1967238104Sdes {LDNS_RR_TYPE_MB, "MB", 1, 1, type_mb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1968238104Sdes /* 8 */ 1969238104Sdes {LDNS_RR_TYPE_MG, "MG", 1, 1, type_mg_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1970238104Sdes /* 9 */ 1971238104Sdes {LDNS_RR_TYPE_MR, "MR", 1, 1, type_mr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1972238104Sdes /* 10 */ 1973238104Sdes {LDNS_RR_TYPE_NULL, "NULL", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1974238104Sdes /* 11 */ 1975238104Sdes {LDNS_RR_TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1976238104Sdes /* 12 */ 1977238104Sdes {LDNS_RR_TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1978238104Sdes /* 13 */ 1979238104Sdes {LDNS_RR_TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1980238104Sdes /* 14 */ 1981238104Sdes {LDNS_RR_TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, 1982238104Sdes /* 15 */ 1983238104Sdes {LDNS_RR_TYPE_MX, "MX", 2, 2, type_mx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1984238104Sdes /* 16 */ 1985238104Sdes {LDNS_RR_TYPE_TXT, "TXT", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, 1986238104Sdes /* 17 */ 1987238104Sdes {LDNS_RR_TYPE_RP, "RP", 2, 2, type_rp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, 1988238104Sdes /* 18 */ 1989238104Sdes {LDNS_RR_TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 1990238104Sdes /* 19 */ 1991238104Sdes {LDNS_RR_TYPE_X25, "X25", 1, 1, type_x25_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1992238104Sdes /* 20 */ 1993238104Sdes {LDNS_RR_TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1994238104Sdes /* 21 */ 1995238104Sdes {LDNS_RR_TYPE_RT, "RT", 2, 2, type_rt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 1996238104Sdes /* 22 */ 1997238104Sdes {LDNS_RR_TYPE_NSAP, "NSAP", 1, 1, type_nsap_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1998238104Sdes /* 23 */ 1999238104Sdes {LDNS_RR_TYPE_NSAP_PTR, "NSAP-PTR", 1, 1, type_nsap_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2000238104Sdes /* 24 */ 2001238104Sdes {LDNS_RR_TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2002238104Sdes /* 25 */ 2003238104Sdes {LDNS_RR_TYPE_KEY, "KEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2004238104Sdes /* 26 */ 2005238104Sdes {LDNS_RR_TYPE_PX, "PX", 3, 3, type_px_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, 2006238104Sdes /* 27 */ 2007238104Sdes {LDNS_RR_TYPE_GPOS, "GPOS", 1, 1, type_gpos_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2008238104Sdes /* 28 */ 2009238104Sdes {LDNS_RR_TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2010238104Sdes /* 29 */ 2011238104Sdes {LDNS_RR_TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2012238104Sdes /* 30 */ 2013238104Sdes {LDNS_RR_TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2014238104Sdes /* 31 */ 2015238104Sdes {LDNS_RR_TYPE_EID, "EID", 1, 1, type_eid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2016238104Sdes /* 32 */ 2017238104Sdes {LDNS_RR_TYPE_NIMLOC, "NIMLOC", 1, 1, type_nimloc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2018238104Sdes /* 33 */ 2019238104Sdes {LDNS_RR_TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2020238104Sdes /* 34 */ 2021238104Sdes {LDNS_RR_TYPE_ATMA, "ATMA", 1, 1, type_atma_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2022238104Sdes /* 35 */ 2023238104Sdes {LDNS_RR_TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2024238104Sdes /* 36 */ 2025238104Sdes {LDNS_RR_TYPE_KX, "KX", 2, 2, type_kx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2026238104Sdes /* 37 */ 2027238104Sdes {LDNS_RR_TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2028238104Sdes /* 38 */ 2029238104Sdes {LDNS_RR_TYPE_A6, "A6", 1, 1, type_a6_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2030238104Sdes /* 39 */ 2031238104Sdes {LDNS_RR_TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2032238104Sdes /* 40 */ 2033238104Sdes {LDNS_RR_TYPE_SINK, "SINK", 1, 1, type_sink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2034238104Sdes /* 41 */ 2035238104Sdes {LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2036238104Sdes /* 42 */ 2037238104Sdes {LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL, LDNS_RR_NO_COMPRESS, 0 }, 2038238104Sdes /* 43 */ 2039238104Sdes {LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2040238104Sdes /* 44 */ 2041238104Sdes {LDNS_RR_TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2042238104Sdes /* 45 */ 2043238104Sdes {LDNS_RR_TYPE_IPSECKEY, "IPSECKEY", 1, 1, type_ipseckey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2044238104Sdes /* 46 */ 2045238104Sdes {LDNS_RR_TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2046238104Sdes /* 47 */ 2047238104Sdes {LDNS_RR_TYPE_NSEC, "NSEC", 1, 2, type_nsec_wireformat, LDNS_RDF_TYPE_NSEC, LDNS_RR_NO_COMPRESS, 1 }, 2048238104Sdes /* 48 */ 2049238104Sdes {LDNS_RR_TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2050238104Sdes /* 49 */ 2051238104Sdes{LDNS_RR_TYPE_DHCID, "DHCID", 1, 1, type_dhcid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2052238104Sdes /* 50 */ 2053238104Sdes {LDNS_RR_TYPE_NSEC3, "NSEC3", 5, 6, type_nsec3_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2054238104Sdes /* 51 */ 2055238104Sdes{LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2056238104Sdes /* 52 */ 2057238104Sdes{LDNS_RR_TYPE_NULL, "TYPE52", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2058238104Sdes{LDNS_RR_TYPE_NULL, "TYPE53", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2059238104Sdes{LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2060238104Sdes{LDNS_RR_TYPE_NULL, "TYPE55", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2061238104Sdes{LDNS_RR_TYPE_NULL, "TYPE56", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2062238104Sdes{LDNS_RR_TYPE_NULL, "TYPE57", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2063238104Sdes /* 58 */ 2064238104Sdes{LDNS_RR_TYPE_TALINK, "TALINK", 2, 2, type_talink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, 2065238104Sdes{LDNS_RR_TYPE_NULL, "TYPE59", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2066238104Sdes{LDNS_RR_TYPE_NULL, "TYPE60", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2067238104Sdes{LDNS_RR_TYPE_NULL, "TYPE61", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2068238104Sdes{LDNS_RR_TYPE_NULL, "TYPE62", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2069238104Sdes{LDNS_RR_TYPE_NULL, "TYPE63", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2070238104Sdes{LDNS_RR_TYPE_NULL, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2071238104Sdes{LDNS_RR_TYPE_NULL, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2072238104Sdes{LDNS_RR_TYPE_NULL, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2073238104Sdes{LDNS_RR_TYPE_NULL, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2074238104Sdes{LDNS_RR_TYPE_NULL, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2075238104Sdes{LDNS_RR_TYPE_NULL, "TYPE69", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2076238104Sdes{LDNS_RR_TYPE_NULL, "TYPE70", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2077238104Sdes{LDNS_RR_TYPE_NULL, "TYPE71", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2078238104Sdes{LDNS_RR_TYPE_NULL, "TYPE72", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2079238104Sdes{LDNS_RR_TYPE_NULL, "TYPE73", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2080238104Sdes{LDNS_RR_TYPE_NULL, "TYPE74", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2081238104Sdes{LDNS_RR_TYPE_NULL, "TYPE75", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2082238104Sdes{LDNS_RR_TYPE_NULL, "TYPE76", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2083238104Sdes{LDNS_RR_TYPE_NULL, "TYPE77", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2084238104Sdes{LDNS_RR_TYPE_NULL, "TYPE78", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2085238104Sdes{LDNS_RR_TYPE_NULL, "TYPE79", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2086238104Sdes{LDNS_RR_TYPE_NULL, "TYPE80", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2087238104Sdes{LDNS_RR_TYPE_NULL, "TYPE81", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2088238104Sdes{LDNS_RR_TYPE_NULL, "TYPE82", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2089238104Sdes{LDNS_RR_TYPE_NULL, "TYPE83", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2090238104Sdes{LDNS_RR_TYPE_NULL, "TYPE84", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2091238104Sdes{LDNS_RR_TYPE_NULL, "TYPE85", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2092238104Sdes{LDNS_RR_TYPE_NULL, "TYPE86", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2093238104Sdes{LDNS_RR_TYPE_NULL, "TYPE87", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2094238104Sdes{LDNS_RR_TYPE_NULL, "TYPE88", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2095238104Sdes{LDNS_RR_TYPE_NULL, "TYPE89", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2096238104Sdes{LDNS_RR_TYPE_NULL, "TYPE90", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2097238104Sdes{LDNS_RR_TYPE_NULL, "TYPE91", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2098238104Sdes{LDNS_RR_TYPE_NULL, "TYPE92", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2099238104Sdes{LDNS_RR_TYPE_NULL, "TYPE93", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2100238104Sdes{LDNS_RR_TYPE_NULL, "TYPE94", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2101238104Sdes{LDNS_RR_TYPE_NULL, "TYPE95", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2102238104Sdes{LDNS_RR_TYPE_NULL, "TYPE96", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2103238104Sdes{LDNS_RR_TYPE_NULL, "TYPE97", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2104238104Sdes{LDNS_RR_TYPE_NULL, "TYPE98", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2105238104Sdes{LDNS_RR_TYPE_SPF, "SPF", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, 2106238104Sdes{LDNS_RR_TYPE_NULL, "TYPE100", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2107238104Sdes{LDNS_RR_TYPE_NULL, "TYPE101", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2108238104Sdes{LDNS_RR_TYPE_NULL, "TYPE102", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2109238104Sdes{LDNS_RR_TYPE_NULL, "TYPE103", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2110238104Sdes{LDNS_RR_TYPE_NULL, "TYPE104", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2111238104Sdes{LDNS_RR_TYPE_NULL, "TYPE105", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2112238104Sdes{LDNS_RR_TYPE_NULL, "TYPE106", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2113238104Sdes{LDNS_RR_TYPE_NULL, "TYPE107", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2114238104Sdes{LDNS_RR_TYPE_NULL, "TYPE108", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2115238104Sdes{LDNS_RR_TYPE_NULL, "TYPE109", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2116238104Sdes{LDNS_RR_TYPE_NULL, "TYPE110", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2117238104Sdes{LDNS_RR_TYPE_NULL, "TYPE111", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2118238104Sdes{LDNS_RR_TYPE_NULL, "TYPE112", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2119238104Sdes{LDNS_RR_TYPE_NULL, "TYPE113", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2120238104Sdes{LDNS_RR_TYPE_NULL, "TYPE114", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2121238104Sdes{LDNS_RR_TYPE_NULL, "TYPE115", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2122238104Sdes{LDNS_RR_TYPE_NULL, "TYPE116", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2123238104Sdes{LDNS_RR_TYPE_NULL, "TYPE117", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2124238104Sdes{LDNS_RR_TYPE_NULL, "TYPE118", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2125238104Sdes{LDNS_RR_TYPE_NULL, "TYPE119", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2126238104Sdes{LDNS_RR_TYPE_NULL, "TYPE120", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2127238104Sdes{LDNS_RR_TYPE_NULL, "TYPE121", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2128238104Sdes{LDNS_RR_TYPE_NULL, "TYPE122", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2129238104Sdes{LDNS_RR_TYPE_NULL, "TYPE123", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2130238104Sdes{LDNS_RR_TYPE_NULL, "TYPE124", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2131238104Sdes{LDNS_RR_TYPE_NULL, "TYPE125", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2132238104Sdes{LDNS_RR_TYPE_NULL, "TYPE126", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2133238104Sdes{LDNS_RR_TYPE_NULL, "TYPE127", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2134238104Sdes{LDNS_RR_TYPE_NULL, "TYPE128", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2135238104Sdes{LDNS_RR_TYPE_NULL, "TYPE129", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2136238104Sdes{LDNS_RR_TYPE_NULL, "TYPE130", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2137238104Sdes{LDNS_RR_TYPE_NULL, "TYPE131", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2138238104Sdes{LDNS_RR_TYPE_NULL, "TYPE132", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2139238104Sdes{LDNS_RR_TYPE_NULL, "TYPE133", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2140238104Sdes{LDNS_RR_TYPE_NULL, "TYPE134", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2141238104Sdes{LDNS_RR_TYPE_NULL, "TYPE135", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2142238104Sdes{LDNS_RR_TYPE_NULL, "TYPE136", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2143238104Sdes{LDNS_RR_TYPE_NULL, "TYPE137", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2144238104Sdes{LDNS_RR_TYPE_NULL, "TYPE138", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2145238104Sdes{LDNS_RR_TYPE_NULL, "TYPE139", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2146238104Sdes{LDNS_RR_TYPE_NULL, "TYPE140", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2147238104Sdes{LDNS_RR_TYPE_NULL, "TYPE141", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2148238104Sdes{LDNS_RR_TYPE_NULL, "TYPE142", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2149238104Sdes{LDNS_RR_TYPE_NULL, "TYPE143", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2150238104Sdes{LDNS_RR_TYPE_NULL, "TYPE144", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2151238104Sdes{LDNS_RR_TYPE_NULL, "TYPE145", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2152238104Sdes{LDNS_RR_TYPE_NULL, "TYPE146", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2153238104Sdes{LDNS_RR_TYPE_NULL, "TYPE147", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2154238104Sdes{LDNS_RR_TYPE_NULL, "TYPE148", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2155238104Sdes{LDNS_RR_TYPE_NULL, "TYPE149", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2156238104Sdes{LDNS_RR_TYPE_NULL, "TYPE150", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2157238104Sdes{LDNS_RR_TYPE_NULL, "TYPE151", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2158238104Sdes{LDNS_RR_TYPE_NULL, "TYPE152", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2159238104Sdes{LDNS_RR_TYPE_NULL, "TYPE153", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2160238104Sdes{LDNS_RR_TYPE_NULL, "TYPE154", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2161238104Sdes{LDNS_RR_TYPE_NULL, "TYPE155", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2162238104Sdes{LDNS_RR_TYPE_NULL, "TYPE156", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2163238104Sdes{LDNS_RR_TYPE_NULL, "TYPE157", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2164238104Sdes{LDNS_RR_TYPE_NULL, "TYPE158", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2165238104Sdes{LDNS_RR_TYPE_NULL, "TYPE159", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2166238104Sdes{LDNS_RR_TYPE_NULL, "TYPE160", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2167238104Sdes{LDNS_RR_TYPE_NULL, "TYPE161", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2168238104Sdes{LDNS_RR_TYPE_NULL, "TYPE162", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2169238104Sdes{LDNS_RR_TYPE_NULL, "TYPE163", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2170238104Sdes{LDNS_RR_TYPE_NULL, "TYPE164", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2171238104Sdes{LDNS_RR_TYPE_NULL, "TYPE165", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2172238104Sdes{LDNS_RR_TYPE_NULL, "TYPE166", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2173238104Sdes{LDNS_RR_TYPE_NULL, "TYPE167", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2174238104Sdes{LDNS_RR_TYPE_NULL, "TYPE168", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2175238104Sdes{LDNS_RR_TYPE_NULL, "TYPE169", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2176238104Sdes{LDNS_RR_TYPE_NULL, "TYPE170", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2177238104Sdes{LDNS_RR_TYPE_NULL, "TYPE171", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2178238104Sdes{LDNS_RR_TYPE_NULL, "TYPE172", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2179238104Sdes{LDNS_RR_TYPE_NULL, "TYPE173", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2180238104Sdes{LDNS_RR_TYPE_NULL, "TYPE174", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2181238104Sdes{LDNS_RR_TYPE_NULL, "TYPE175", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2182238104Sdes{LDNS_RR_TYPE_NULL, "TYPE176", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2183238104Sdes{LDNS_RR_TYPE_NULL, "TYPE177", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2184238104Sdes{LDNS_RR_TYPE_NULL, "TYPE178", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2185238104Sdes{LDNS_RR_TYPE_NULL, "TYPE179", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2186238104Sdes{LDNS_RR_TYPE_NULL, "TYPE180", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2187238104Sdes{LDNS_RR_TYPE_NULL, "TYPE181", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2188238104Sdes{LDNS_RR_TYPE_NULL, "TYPE182", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2189238104Sdes{LDNS_RR_TYPE_NULL, "TYPE183", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2190238104Sdes{LDNS_RR_TYPE_NULL, "TYPE184", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2191238104Sdes{LDNS_RR_TYPE_NULL, "TYPE185", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2192238104Sdes{LDNS_RR_TYPE_NULL, "TYPE186", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2193238104Sdes{LDNS_RR_TYPE_NULL, "TYPE187", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2194238104Sdes{LDNS_RR_TYPE_NULL, "TYPE188", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2195238104Sdes{LDNS_RR_TYPE_NULL, "TYPE189", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2196238104Sdes{LDNS_RR_TYPE_NULL, "TYPE190", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2197238104Sdes{LDNS_RR_TYPE_NULL, "TYPE191", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2198238104Sdes{LDNS_RR_TYPE_NULL, "TYPE192", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2199238104Sdes{LDNS_RR_TYPE_NULL, "TYPE193", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2200238104Sdes{LDNS_RR_TYPE_NULL, "TYPE194", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2201238104Sdes{LDNS_RR_TYPE_NULL, "TYPE195", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2202238104Sdes{LDNS_RR_TYPE_NULL, "TYPE196", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2203238104Sdes{LDNS_RR_TYPE_NULL, "TYPE197", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2204238104Sdes{LDNS_RR_TYPE_NULL, "TYPE198", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2205238104Sdes{LDNS_RR_TYPE_NULL, "TYPE199", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2206238104Sdes{LDNS_RR_TYPE_NULL, "TYPE200", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2207238104Sdes{LDNS_RR_TYPE_NULL, "TYPE201", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2208238104Sdes{LDNS_RR_TYPE_NULL, "TYPE202", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2209238104Sdes{LDNS_RR_TYPE_NULL, "TYPE203", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2210238104Sdes{LDNS_RR_TYPE_NULL, "TYPE204", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2211238104Sdes{LDNS_RR_TYPE_NULL, "TYPE205", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2212238104Sdes{LDNS_RR_TYPE_NULL, "TYPE206", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2213238104Sdes{LDNS_RR_TYPE_NULL, "TYPE207", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2214238104Sdes{LDNS_RR_TYPE_NULL, "TYPE208", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2215238104Sdes{LDNS_RR_TYPE_NULL, "TYPE209", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2216238104Sdes{LDNS_RR_TYPE_NULL, "TYPE210", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2217238104Sdes{LDNS_RR_TYPE_NULL, "TYPE211", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2218238104Sdes{LDNS_RR_TYPE_NULL, "TYPE212", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2219238104Sdes{LDNS_RR_TYPE_NULL, "TYPE213", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2220238104Sdes{LDNS_RR_TYPE_NULL, "TYPE214", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2221238104Sdes{LDNS_RR_TYPE_NULL, "TYPE215", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2222238104Sdes{LDNS_RR_TYPE_NULL, "TYPE216", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2223238104Sdes{LDNS_RR_TYPE_NULL, "TYPE217", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2224238104Sdes{LDNS_RR_TYPE_NULL, "TYPE218", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2225238104Sdes{LDNS_RR_TYPE_NULL, "TYPE219", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2226238104Sdes{LDNS_RR_TYPE_NULL, "TYPE220", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2227238104Sdes{LDNS_RR_TYPE_NULL, "TYPE221", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2228238104Sdes{LDNS_RR_TYPE_NULL, "TYPE222", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2229238104Sdes{LDNS_RR_TYPE_NULL, "TYPE223", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2230238104Sdes{LDNS_RR_TYPE_NULL, "TYPE224", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2231238104Sdes{LDNS_RR_TYPE_NULL, "TYPE225", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2232238104Sdes{LDNS_RR_TYPE_NULL, "TYPE226", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2233238104Sdes{LDNS_RR_TYPE_NULL, "TYPE227", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2234238104Sdes{LDNS_RR_TYPE_NULL, "TYPE228", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2235238104Sdes{LDNS_RR_TYPE_NULL, "TYPE229", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2236238104Sdes{LDNS_RR_TYPE_NULL, "TYPE230", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2237238104Sdes{LDNS_RR_TYPE_NULL, "TYPE231", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2238238104Sdes{LDNS_RR_TYPE_NULL, "TYPE232", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2239238104Sdes{LDNS_RR_TYPE_NULL, "TYPE233", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2240238104Sdes{LDNS_RR_TYPE_NULL, "TYPE234", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2241238104Sdes{LDNS_RR_TYPE_NULL, "TYPE235", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2242238104Sdes{LDNS_RR_TYPE_NULL, "TYPE236", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2243238104Sdes{LDNS_RR_TYPE_NULL, "TYPE237", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2244238104Sdes{LDNS_RR_TYPE_NULL, "TYPE238", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2245238104Sdes{LDNS_RR_TYPE_NULL, "TYPE239", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2246238104Sdes{LDNS_RR_TYPE_NULL, "TYPE240", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2247238104Sdes{LDNS_RR_TYPE_NULL, "TYPE241", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2248238104Sdes{LDNS_RR_TYPE_NULL, "TYPE242", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2249238104Sdes{LDNS_RR_TYPE_NULL, "TYPE243", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2250238104Sdes{LDNS_RR_TYPE_NULL, "TYPE244", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2251238104Sdes{LDNS_RR_TYPE_NULL, "TYPE245", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2252238104Sdes{LDNS_RR_TYPE_NULL, "TYPE246", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2253238104Sdes{LDNS_RR_TYPE_NULL, "TYPE247", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2254238104Sdes{LDNS_RR_TYPE_NULL, "TYPE248", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2255238104Sdes{LDNS_RR_TYPE_NULL, "TYPE249", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2256238104Sdes/* LDNS_RDF_TYPE_INT16_DATA essentially takes two fields (length and data) and 2257238104Sdes * makes them into one. So, while in rfc 2845 is specified that a TSIG may have 2258238104Sdes * 8 or 9 rdata fields, by this implementation, the min/max are 7 each. 2259238104Sdes */ 2260238104Sdes{LDNS_RR_TYPE_TSIG, "TSIG", 7, 7, type_tsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2261238104Sdes/* split in array, no longer contiguous */ 2262238104Sdes{LDNS_RR_TYPE_DLV, "DLV", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 } 2263238104Sdes}; 2264238104Sdes/** \endcond */ 2265238104Sdes 2266238104Sdes/** 2267238104Sdes * \def LDNS_RDATA_FIELD_DESCRIPTORS_COUNT 2268238104Sdes * computes the number of rdata fields 2269238104Sdes */ 2270238104Sdes#define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \ 2271238104Sdes (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0])) 2272238104Sdes 2273238104Sdesconst ldns_rr_descriptor * 2274238104Sdesldns_rr_descript(uint16_t type) 2275238104Sdes{ 2276238104Sdes size_t i; 2277238104Sdes if (type <= LDNS_RDATA_FIELD_DESCRIPTORS_COMMON) { 2278238104Sdes return &rdata_field_descriptors[type]; 2279238104Sdes } else { 2280238104Sdes /* because not all array index equals type code */ 2281238104Sdes for (i = LDNS_RDATA_FIELD_DESCRIPTORS_COMMON; 2282238104Sdes i < LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; 2283238104Sdes i++) { 2284238104Sdes if (rdata_field_descriptors[i]._type == type) { 2285238104Sdes return &rdata_field_descriptors[i]; 2286238104Sdes } 2287238104Sdes } 2288238104Sdes return &rdata_field_descriptors[0]; 2289238104Sdes } 2290238104Sdes} 2291238104Sdes 2292238104Sdessize_t 2293238104Sdesldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor) 2294238104Sdes{ 2295238104Sdes if (descriptor) { 2296238104Sdes return descriptor->_minimum; 2297238104Sdes } else { 2298238104Sdes return 0; 2299238104Sdes } 2300238104Sdes} 2301238104Sdes 2302238104Sdessize_t 2303238104Sdesldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor) 2304238104Sdes{ 2305238104Sdes if (descriptor) { 2306238104Sdes if (descriptor->_variable != LDNS_RDF_TYPE_NONE) { 2307238104Sdes /* Should really be SIZE_MAX... bad FreeBSD. */ 2308238104Sdes return UINT_MAX; 2309238104Sdes } else { 2310238104Sdes return descriptor->_maximum; 2311238104Sdes } 2312238104Sdes } else { 2313238104Sdes return 0; 2314238104Sdes } 2315238104Sdes} 2316238104Sdes 2317238104Sdesldns_rdf_type 2318238104Sdesldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, 2319238104Sdes size_t index) 2320238104Sdes{ 2321238104Sdes assert(descriptor != NULL); 2322238104Sdes assert(index < descriptor->_maximum 2323238104Sdes || descriptor->_variable != LDNS_RDF_TYPE_NONE); 2324238104Sdes if (index < descriptor->_maximum) { 2325238104Sdes return descriptor->_wireformat[index]; 2326238104Sdes } else { 2327238104Sdes return descriptor->_variable; 2328238104Sdes } 2329238104Sdes} 2330238104Sdes 2331238104Sdesldns_rr_type 2332238104Sdesldns_get_rr_type_by_name(const char *name) 2333238104Sdes{ 2334238104Sdes unsigned int i; 2335238104Sdes const char *desc_name; 2336238104Sdes const ldns_rr_descriptor *desc; 2337238104Sdes 2338238104Sdes /* TYPEXX representation */ 2339238104Sdes if (strlen(name) > 4 && strncasecmp(name, "TYPE", 4) == 0) { 2340238104Sdes return atoi(name + 4); 2341238104Sdes } 2342238104Sdes 2343238104Sdes /* Normal types */ 2344238104Sdes for (i = 0; i < (unsigned int) LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; i++) { 2345238104Sdes desc = &rdata_field_descriptors[i]; 2346238104Sdes desc_name = desc->_name; 2347238104Sdes if(desc_name && 2348238104Sdes strlen(name) == strlen(desc_name) && 2349238104Sdes strncasecmp(name, desc_name, strlen(desc_name)) == 0) { 2350238104Sdes /* because not all array index equals type code */ 2351238104Sdes return desc->_type; 2352238104Sdes } 2353238104Sdes } 2354238104Sdes 2355238104Sdes /* special cases for query types */ 2356238104Sdes if (strlen(name) == 4 && strncasecmp(name, "IXFR", 4) == 0) { 2357238104Sdes return 251; 2358238104Sdes } else if (strlen(name) == 4 && strncasecmp(name, "AXFR", 4) == 0) { 2359238104Sdes return 252; 2360238104Sdes } else if (strlen(name) == 5 && strncasecmp(name, "MAILB", 5) == 0) { 2361238104Sdes return 253; 2362238104Sdes } else if (strlen(name) == 5 && strncasecmp(name, "MAILA", 5) == 0) { 2363238104Sdes return 254; 2364238104Sdes } else if (strlen(name) == 3 && strncasecmp(name, "ANY", 3) == 0) { 2365238104Sdes return 255; 2366238104Sdes } 2367238104Sdes 2368238104Sdes return 0; 2369238104Sdes} 2370238104Sdes 2371238104Sdesldns_rr_class 2372238104Sdesldns_get_rr_class_by_name(const char *name) 2373238104Sdes{ 2374238104Sdes ldns_lookup_table *lt; 2375238104Sdes 2376238104Sdes /* CLASSXX representation */ 2377238104Sdes if (strlen(name) > 5 && strncasecmp(name, "CLASS", 5) == 0) { 2378238104Sdes return atoi(name + 5); 2379238104Sdes } 2380238104Sdes 2381238104Sdes /* Normal types */ 2382238104Sdes lt = ldns_lookup_by_name(ldns_rr_classes, name); 2383238104Sdes 2384238104Sdes if (lt) { 2385238104Sdes return lt->id; 2386238104Sdes } 2387238104Sdes return 0; 2388238104Sdes} 2389238104Sdes 2390238104Sdes 2391238104Sdesldns_rr_type 2392238104Sdesldns_rdf2rr_type(const ldns_rdf *rd) 2393238104Sdes{ 2394238104Sdes ldns_rr_type r; 2395238104Sdes 2396238104Sdes if (!rd) { 2397238104Sdes return 0; 2398238104Sdes } 2399238104Sdes 2400238104Sdes if (ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_TYPE) { 2401238104Sdes return 0; 2402238104Sdes } 2403238104Sdes 2404238104Sdes r = (ldns_rr_type) ldns_rdf2native_int16(rd); 2405238104Sdes return r; 2406238104Sdes} 2407238104Sdes 2408238104Sdesldns_rr_type 2409238104Sdesldns_rr_list_type(const ldns_rr_list *rr_list) 2410238104Sdes{ 2411238104Sdes if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) { 2412238104Sdes return ldns_rr_get_type(ldns_rr_list_rr(rr_list, 0)); 2413238104Sdes } else { 2414238104Sdes return 0; 2415238104Sdes } 2416238104Sdes} 2417238104Sdes 2418238104Sdesldns_rdf * 2419238104Sdesldns_rr_list_owner(const ldns_rr_list *rr_list) 2420238104Sdes{ 2421238104Sdes if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) { 2422238104Sdes return ldns_rr_owner(ldns_rr_list_rr(rr_list, 0)); 2423238104Sdes } else { 2424238104Sdes return NULL; 2425238104Sdes } 2426238104Sdes} 2427