1*7b5038d7SDag-Erling Smørgrav /* rr.c 2*7b5038d7SDag-Erling Smørgrav * 3*7b5038d7SDag-Erling Smørgrav * access functions for ldns_rr - 4*7b5038d7SDag-Erling Smørgrav * a Net::DNS like library for C 5*7b5038d7SDag-Erling Smørgrav * LibDNS Team @ NLnet Labs 6*7b5038d7SDag-Erling Smørgrav * 7*7b5038d7SDag-Erling Smørgrav * (c) NLnet Labs, 2004-2006 8*7b5038d7SDag-Erling Smørgrav * See the file LICENSE for the license 9*7b5038d7SDag-Erling Smørgrav */ 10*7b5038d7SDag-Erling Smørgrav #include <ldns/config.h> 11*7b5038d7SDag-Erling Smørgrav 12*7b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h> 13*7b5038d7SDag-Erling Smørgrav 14*7b5038d7SDag-Erling Smørgrav #include <strings.h> 15*7b5038d7SDag-Erling Smørgrav #include <limits.h> 16*7b5038d7SDag-Erling Smørgrav 17*7b5038d7SDag-Erling Smørgrav #include <errno.h> 18*7b5038d7SDag-Erling Smørgrav 19*7b5038d7SDag-Erling Smørgrav #define LDNS_SYNTAX_DATALEN 16 20*7b5038d7SDag-Erling Smørgrav #define LDNS_TTL_DATALEN 21 21*7b5038d7SDag-Erling Smørgrav #define LDNS_RRLIST_INIT 8 22*7b5038d7SDag-Erling Smørgrav 23*7b5038d7SDag-Erling Smørgrav ldns_rr * 24*7b5038d7SDag-Erling Smørgrav ldns_rr_new(void) 25*7b5038d7SDag-Erling Smørgrav { 26*7b5038d7SDag-Erling Smørgrav ldns_rr *rr; 27*7b5038d7SDag-Erling Smørgrav rr = LDNS_MALLOC(ldns_rr); 28*7b5038d7SDag-Erling Smørgrav if (!rr) { 29*7b5038d7SDag-Erling Smørgrav return NULL; 30*7b5038d7SDag-Erling Smørgrav } 31*7b5038d7SDag-Erling Smørgrav 32*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(rr, NULL); 33*7b5038d7SDag-Erling Smørgrav ldns_rr_set_question(rr, false); 34*7b5038d7SDag-Erling Smørgrav ldns_rr_set_rd_count(rr, 0); 35*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields = NULL; 36*7b5038d7SDag-Erling Smørgrav ldns_rr_set_class(rr, LDNS_RR_CLASS_IN); 37*7b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL); 38*7b5038d7SDag-Erling Smørgrav return rr; 39*7b5038d7SDag-Erling Smørgrav } 40*7b5038d7SDag-Erling Smørgrav 41*7b5038d7SDag-Erling Smørgrav ldns_rr * 42*7b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_type(ldns_rr_type t) 43*7b5038d7SDag-Erling Smørgrav { 44*7b5038d7SDag-Erling Smørgrav ldns_rr *rr; 45*7b5038d7SDag-Erling Smørgrav const ldns_rr_descriptor *desc; 46*7b5038d7SDag-Erling Smørgrav size_t i; 47*7b5038d7SDag-Erling Smørgrav 48*7b5038d7SDag-Erling Smørgrav rr = LDNS_MALLOC(ldns_rr); 49*7b5038d7SDag-Erling Smørgrav if (!rr) { 50*7b5038d7SDag-Erling Smørgrav return NULL; 51*7b5038d7SDag-Erling Smørgrav } 52*7b5038d7SDag-Erling Smørgrav 53*7b5038d7SDag-Erling Smørgrav desc = ldns_rr_descript(t); 54*7b5038d7SDag-Erling Smørgrav 55*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields = LDNS_XMALLOC(ldns_rdf *, ldns_rr_descriptor_minimum(desc)); 56*7b5038d7SDag-Erling Smørgrav if(!rr->_rdata_fields) { 57*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr); 58*7b5038d7SDag-Erling Smørgrav return NULL; 59*7b5038d7SDag-Erling Smørgrav } 60*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_descriptor_minimum(desc); i++) { 61*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields[i] = NULL; 62*7b5038d7SDag-Erling Smørgrav } 63*7b5038d7SDag-Erling Smørgrav 64*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(rr, NULL); 65*7b5038d7SDag-Erling Smørgrav ldns_rr_set_question(rr, false); 66*7b5038d7SDag-Erling Smørgrav /* set the count to minimum */ 67*7b5038d7SDag-Erling Smørgrav ldns_rr_set_rd_count(rr, ldns_rr_descriptor_minimum(desc)); 68*7b5038d7SDag-Erling Smørgrav ldns_rr_set_class(rr, LDNS_RR_CLASS_IN); 69*7b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL); 70*7b5038d7SDag-Erling Smørgrav ldns_rr_set_type(rr, t); 71*7b5038d7SDag-Erling Smørgrav return rr; 72*7b5038d7SDag-Erling Smørgrav } 73*7b5038d7SDag-Erling Smørgrav 74*7b5038d7SDag-Erling Smørgrav void 75*7b5038d7SDag-Erling Smørgrav ldns_rr_free(ldns_rr *rr) 76*7b5038d7SDag-Erling Smørgrav { 77*7b5038d7SDag-Erling Smørgrav size_t i; 78*7b5038d7SDag-Erling Smørgrav if (rr) { 79*7b5038d7SDag-Erling Smørgrav if (ldns_rr_owner(rr)) { 80*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(ldns_rr_owner(rr)); 81*7b5038d7SDag-Erling Smørgrav } 82*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_rd_count(rr); i++) { 83*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(ldns_rr_rdf(rr, i)); 84*7b5038d7SDag-Erling Smørgrav } 85*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr->_rdata_fields); 86*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr); 87*7b5038d7SDag-Erling Smørgrav } 88*7b5038d7SDag-Erling Smørgrav } 89*7b5038d7SDag-Erling Smørgrav 90*7b5038d7SDag-Erling Smørgrav /* 91*7b5038d7SDag-Erling Smørgrav * trailing spaces are allowed 92*7b5038d7SDag-Erling Smørgrav * leading spaces are not allowed 93*7b5038d7SDag-Erling Smørgrav * allow ttl to be optional 94*7b5038d7SDag-Erling Smørgrav * class is optional too 95*7b5038d7SDag-Erling Smørgrav * if ttl is missing, and default_ttl is 0, use DEF_TTL 96*7b5038d7SDag-Erling Smørgrav * allow ttl to be written as 1d3h 97*7b5038d7SDag-Erling Smørgrav * So the RR should look like. e.g. 98*7b5038d7SDag-Erling Smørgrav * miek.nl. 3600 IN MX 10 elektron.atoom.net 99*7b5038d7SDag-Erling Smørgrav * or 100*7b5038d7SDag-Erling Smørgrav * miek.nl. 1h IN MX 10 elektron.atoom.net 101*7b5038d7SDag-Erling Smørgrav * or 102*7b5038d7SDag-Erling Smørgrav * miek.nl. IN MX 10 elektron.atoom.net 103*7b5038d7SDag-Erling Smørgrav */ 104*7b5038d7SDag-Erling Smørgrav static ldns_status 105*7b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str, 106*7b5038d7SDag-Erling Smørgrav uint32_t default_ttl, ldns_rdf *origin, 107*7b5038d7SDag-Erling Smørgrav ldns_rdf **prev, bool question) 108*7b5038d7SDag-Erling Smørgrav { 109*7b5038d7SDag-Erling Smørgrav ldns_rr *new; 110*7b5038d7SDag-Erling Smørgrav const ldns_rr_descriptor *desc; 111*7b5038d7SDag-Erling Smørgrav ldns_rr_type rr_type; 112*7b5038d7SDag-Erling Smørgrav ldns_buffer *rr_buf = NULL; 113*7b5038d7SDag-Erling Smørgrav ldns_buffer *rd_buf = NULL; 114*7b5038d7SDag-Erling Smørgrav uint32_t ttl_val; 115*7b5038d7SDag-Erling Smørgrav char *owner = NULL; 116*7b5038d7SDag-Erling Smørgrav char *ttl = NULL; 117*7b5038d7SDag-Erling Smørgrav ldns_rr_class clas_val; 118*7b5038d7SDag-Erling Smørgrav char *clas = NULL; 119*7b5038d7SDag-Erling Smørgrav char *type = NULL; 120*7b5038d7SDag-Erling Smørgrav char *rdata = NULL; 121*7b5038d7SDag-Erling Smørgrav char *rd = NULL; 122*7b5038d7SDag-Erling Smørgrav char *b64 = NULL; 123*7b5038d7SDag-Erling Smørgrav size_t rd_strlen; 124*7b5038d7SDag-Erling Smørgrav const char *delimiters; 125*7b5038d7SDag-Erling Smørgrav ssize_t c; 126*7b5038d7SDag-Erling Smørgrav ldns_rdf *owner_dname; 127*7b5038d7SDag-Erling Smørgrav const char* endptr; 128*7b5038d7SDag-Erling Smørgrav int was_unknown_rr_format = 0; 129*7b5038d7SDag-Erling Smørgrav ldns_status status = LDNS_STATUS_OK; 130*7b5038d7SDag-Erling Smørgrav 131*7b5038d7SDag-Erling Smørgrav /* used for types with unknown number of rdatas */ 132*7b5038d7SDag-Erling Smørgrav bool done; 133*7b5038d7SDag-Erling Smørgrav bool quoted; 134*7b5038d7SDag-Erling Smørgrav 135*7b5038d7SDag-Erling Smørgrav ldns_rdf *r = NULL; 136*7b5038d7SDag-Erling Smørgrav uint16_t r_cnt; 137*7b5038d7SDag-Erling Smørgrav uint16_t r_min; 138*7b5038d7SDag-Erling Smørgrav uint16_t r_max; 139*7b5038d7SDag-Erling Smørgrav size_t pre_data_pos; 140*7b5038d7SDag-Erling Smørgrav 141*7b5038d7SDag-Erling Smørgrav new = ldns_rr_new(); 142*7b5038d7SDag-Erling Smørgrav 143*7b5038d7SDag-Erling Smørgrav owner = LDNS_XMALLOC(char, LDNS_MAX_DOMAINLEN + 1); 144*7b5038d7SDag-Erling Smørgrav ttl = LDNS_XMALLOC(char, LDNS_TTL_DATALEN); 145*7b5038d7SDag-Erling Smørgrav clas = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN); 146*7b5038d7SDag-Erling Smørgrav rdata = LDNS_XMALLOC(char, LDNS_MAX_PACKETLEN + 1); 147*7b5038d7SDag-Erling Smørgrav rr_buf = LDNS_MALLOC(ldns_buffer); 148*7b5038d7SDag-Erling Smørgrav rd_buf = LDNS_MALLOC(ldns_buffer); 149*7b5038d7SDag-Erling Smørgrav rd = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); 150*7b5038d7SDag-Erling Smørgrav b64 = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); 151*7b5038d7SDag-Erling Smørgrav if (!new || !owner || !ttl || !clas || !rdata || !rr_buf || !rd_buf || !rd || !b64 ) { 152*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_MEM_ERR; 153*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_buf); 154*7b5038d7SDag-Erling Smørgrav goto ldnserror; 155*7b5038d7SDag-Erling Smørgrav } 156*7b5038d7SDag-Erling Smørgrav 157*7b5038d7SDag-Erling Smørgrav ldns_buffer_new_frm_data(rr_buf, (char*)str, strlen(str)); 158*7b5038d7SDag-Erling Smørgrav 159*7b5038d7SDag-Erling Smørgrav /* split the rr in its parts -1 signals trouble */ 160*7b5038d7SDag-Erling Smørgrav if (ldns_bget_token(rr_buf, owner, "\t\n ", LDNS_MAX_DOMAINLEN) == -1) { 161*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_SYNTAX_ERR; 162*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 163*7b5038d7SDag-Erling Smørgrav goto ldnserror; 164*7b5038d7SDag-Erling Smørgrav } 165*7b5038d7SDag-Erling Smørgrav 166*7b5038d7SDag-Erling Smørgrav if (ldns_bget_token(rr_buf, ttl, "\t\n ", LDNS_TTL_DATALEN) == -1) { 167*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_SYNTAX_TTL_ERR; 168*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 169*7b5038d7SDag-Erling Smørgrav goto ldnserror; 170*7b5038d7SDag-Erling Smørgrav } 171*7b5038d7SDag-Erling Smørgrav ttl_val = (uint32_t) ldns_str2period(ttl, &endptr); 172*7b5038d7SDag-Erling Smørgrav 173*7b5038d7SDag-Erling Smørgrav if (strlen(ttl) > 0 && !isdigit((int) ttl[0])) { 174*7b5038d7SDag-Erling Smørgrav /* ah, it's not there or something */ 175*7b5038d7SDag-Erling Smørgrav if (default_ttl == 0) { 176*7b5038d7SDag-Erling Smørgrav ttl_val = LDNS_DEFAULT_TTL; 177*7b5038d7SDag-Erling Smørgrav } else { 178*7b5038d7SDag-Erling Smørgrav ttl_val = default_ttl; 179*7b5038d7SDag-Erling Smørgrav } 180*7b5038d7SDag-Erling Smørgrav /* we not ASSUMING the TTL is missing and that 181*7b5038d7SDag-Erling Smørgrav * the rest of the RR is still there. That is 182*7b5038d7SDag-Erling Smørgrav * CLASS TYPE RDATA 183*7b5038d7SDag-Erling Smørgrav * so ttl value we read is actually the class 184*7b5038d7SDag-Erling Smørgrav */ 185*7b5038d7SDag-Erling Smørgrav clas_val = ldns_get_rr_class_by_name(ttl); 186*7b5038d7SDag-Erling Smørgrav /* class can be left out too, assume IN, current 187*7b5038d7SDag-Erling Smørgrav * token must be type 188*7b5038d7SDag-Erling Smørgrav */ 189*7b5038d7SDag-Erling Smørgrav if (clas_val == 0) { 190*7b5038d7SDag-Erling Smørgrav clas_val = LDNS_RR_CLASS_IN; 191*7b5038d7SDag-Erling Smørgrav type = LDNS_XMALLOC(char, strlen(ttl) + 1); 192*7b5038d7SDag-Erling Smørgrav if(!type) { 193*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_MEM_ERR; 194*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 195*7b5038d7SDag-Erling Smørgrav goto ldnserror; 196*7b5038d7SDag-Erling Smørgrav } 197*7b5038d7SDag-Erling Smørgrav strncpy(type, ttl, strlen(ttl) + 1); 198*7b5038d7SDag-Erling Smørgrav } 199*7b5038d7SDag-Erling Smørgrav } else { 200*7b5038d7SDag-Erling Smørgrav if (ldns_bget_token(rr_buf, clas, "\t\n ", LDNS_SYNTAX_DATALEN) == -1) { 201*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_SYNTAX_CLASS_ERR; 202*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 203*7b5038d7SDag-Erling Smørgrav goto ldnserror; 204*7b5038d7SDag-Erling Smørgrav } 205*7b5038d7SDag-Erling Smørgrav clas_val = ldns_get_rr_class_by_name(clas); 206*7b5038d7SDag-Erling Smørgrav /* class can be left out too, assume IN, current 207*7b5038d7SDag-Erling Smørgrav * token must be type 208*7b5038d7SDag-Erling Smørgrav */ 209*7b5038d7SDag-Erling Smørgrav if (clas_val == 0) { 210*7b5038d7SDag-Erling Smørgrav clas_val = LDNS_RR_CLASS_IN; 211*7b5038d7SDag-Erling Smørgrav type = LDNS_XMALLOC(char, strlen(clas) + 1); 212*7b5038d7SDag-Erling Smørgrav if(!type) { 213*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_MEM_ERR; 214*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 215*7b5038d7SDag-Erling Smørgrav goto ldnserror; 216*7b5038d7SDag-Erling Smørgrav } 217*7b5038d7SDag-Erling Smørgrav strncpy(type, clas, strlen(clas) + 1); 218*7b5038d7SDag-Erling Smørgrav } 219*7b5038d7SDag-Erling Smørgrav } 220*7b5038d7SDag-Erling Smørgrav /* the rest should still be waiting for us */ 221*7b5038d7SDag-Erling Smørgrav 222*7b5038d7SDag-Erling Smørgrav if (!type) { 223*7b5038d7SDag-Erling Smørgrav type = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN); 224*7b5038d7SDag-Erling Smørgrav if(!type) { 225*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_MEM_ERR; 226*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 227*7b5038d7SDag-Erling Smørgrav goto ldnserror; 228*7b5038d7SDag-Erling Smørgrav } 229*7b5038d7SDag-Erling Smørgrav if (ldns_bget_token(rr_buf, type, "\t\n ", LDNS_SYNTAX_DATALEN) == -1) { 230*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_SYNTAX_TYPE_ERR; 231*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 232*7b5038d7SDag-Erling Smørgrav goto ldnserror; 233*7b5038d7SDag-Erling Smørgrav } 234*7b5038d7SDag-Erling Smørgrav } 235*7b5038d7SDag-Erling Smørgrav 236*7b5038d7SDag-Erling Smørgrav if (ldns_bget_token(rr_buf, rdata, "\0", LDNS_MAX_PACKETLEN) == -1) { 237*7b5038d7SDag-Erling Smørgrav /* apparently we are done, and it's only a question RR 238*7b5038d7SDag-Erling Smørgrav * so do not set status and go to ldnserror here 239*7b5038d7SDag-Erling Smørgrav */ 240*7b5038d7SDag-Erling Smørgrav } 241*7b5038d7SDag-Erling Smørgrav 242*7b5038d7SDag-Erling Smørgrav ldns_buffer_new_frm_data(rd_buf, rdata, strlen(rdata)); 243*7b5038d7SDag-Erling Smørgrav 244*7b5038d7SDag-Erling Smørgrav if (strlen(owner) <= 1 && strncmp(owner, "@", 1) == 0) { 245*7b5038d7SDag-Erling Smørgrav if (origin) { 246*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new, ldns_rdf_clone(origin)); 247*7b5038d7SDag-Erling Smørgrav } else if (prev && *prev) { 248*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new, ldns_rdf_clone(*prev)); 249*7b5038d7SDag-Erling Smørgrav } else { 250*7b5038d7SDag-Erling Smørgrav /* default to root */ 251*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new, ldns_dname_new_frm_str(".")); 252*7b5038d7SDag-Erling Smørgrav } 253*7b5038d7SDag-Erling Smørgrav 254*7b5038d7SDag-Erling Smørgrav /* @ also overrides prev */ 255*7b5038d7SDag-Erling Smørgrav if (prev) { 256*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(*prev); 257*7b5038d7SDag-Erling Smørgrav *prev = ldns_rdf_clone(ldns_rr_owner(new)); 258*7b5038d7SDag-Erling Smørgrav if (!*prev) { 259*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_MEM_ERR; 260*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 261*7b5038d7SDag-Erling Smørgrav goto ldnserror; 262*7b5038d7SDag-Erling Smørgrav } 263*7b5038d7SDag-Erling Smørgrav } 264*7b5038d7SDag-Erling Smørgrav } else { 265*7b5038d7SDag-Erling Smørgrav if (strlen(owner) == 0) { 266*7b5038d7SDag-Erling Smørgrav /* no ownername was given, try prev, if that fails 267*7b5038d7SDag-Erling Smørgrav * origin, else default to root */ 268*7b5038d7SDag-Erling Smørgrav if (prev && *prev) { 269*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new, ldns_rdf_clone(*prev)); 270*7b5038d7SDag-Erling Smørgrav } else if (origin) { 271*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new, ldns_rdf_clone(origin)); 272*7b5038d7SDag-Erling Smørgrav } else { 273*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new, ldns_dname_new_frm_str(".")); 274*7b5038d7SDag-Erling Smørgrav } 275*7b5038d7SDag-Erling Smørgrav if(!ldns_rr_owner(new)) { 276*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_MEM_ERR; 277*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 278*7b5038d7SDag-Erling Smørgrav goto ldnserror; 279*7b5038d7SDag-Erling Smørgrav } 280*7b5038d7SDag-Erling Smørgrav } else { 281*7b5038d7SDag-Erling Smørgrav owner_dname = ldns_dname_new_frm_str(owner); 282*7b5038d7SDag-Erling Smørgrav if (!owner_dname) { 283*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_SYNTAX_ERR; 284*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 285*7b5038d7SDag-Erling Smørgrav goto ldnserror; 286*7b5038d7SDag-Erling Smørgrav } 287*7b5038d7SDag-Erling Smørgrav 288*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new, owner_dname); 289*7b5038d7SDag-Erling Smørgrav if (!ldns_dname_str_absolute(owner) && origin) { 290*7b5038d7SDag-Erling Smørgrav if(ldns_dname_cat(ldns_rr_owner(new), 291*7b5038d7SDag-Erling Smørgrav origin) != LDNS_STATUS_OK) { 292*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_SYNTAX_ERR; 293*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 294*7b5038d7SDag-Erling Smørgrav goto ldnserror; 295*7b5038d7SDag-Erling Smørgrav } 296*7b5038d7SDag-Erling Smørgrav } 297*7b5038d7SDag-Erling Smørgrav if (prev) { 298*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(*prev); 299*7b5038d7SDag-Erling Smørgrav *prev = ldns_rdf_clone(ldns_rr_owner(new)); 300*7b5038d7SDag-Erling Smørgrav if(!*prev) { 301*7b5038d7SDag-Erling Smørgrav status = LDNS_STATUS_MEM_ERR; 302*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 303*7b5038d7SDag-Erling Smørgrav goto ldnserror; 304*7b5038d7SDag-Erling Smørgrav } 305*7b5038d7SDag-Erling Smørgrav } 306*7b5038d7SDag-Erling Smørgrav } 307*7b5038d7SDag-Erling Smørgrav } 308*7b5038d7SDag-Erling Smørgrav LDNS_FREE(owner); 309*7b5038d7SDag-Erling Smørgrav owner = NULL; 310*7b5038d7SDag-Erling Smørgrav 311*7b5038d7SDag-Erling Smørgrav ldns_rr_set_question(new, question); 312*7b5038d7SDag-Erling Smørgrav 313*7b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(new, ttl_val); 314*7b5038d7SDag-Erling Smørgrav LDNS_FREE(ttl); 315*7b5038d7SDag-Erling Smørgrav ttl = NULL; 316*7b5038d7SDag-Erling Smørgrav 317*7b5038d7SDag-Erling Smørgrav ldns_rr_set_class(new, clas_val); 318*7b5038d7SDag-Erling Smørgrav LDNS_FREE(clas); 319*7b5038d7SDag-Erling Smørgrav clas = NULL; 320*7b5038d7SDag-Erling Smørgrav 321*7b5038d7SDag-Erling Smørgrav rr_type = ldns_get_rr_type_by_name(type); 322*7b5038d7SDag-Erling Smørgrav LDNS_FREE(type); 323*7b5038d7SDag-Erling Smørgrav type = NULL; 324*7b5038d7SDag-Erling Smørgrav 325*7b5038d7SDag-Erling Smørgrav desc = ldns_rr_descript((uint16_t)rr_type); 326*7b5038d7SDag-Erling Smørgrav ldns_rr_set_type(new, rr_type); 327*7b5038d7SDag-Erling Smørgrav if (desc) { 328*7b5038d7SDag-Erling Smørgrav /* only the rdata remains */ 329*7b5038d7SDag-Erling Smørgrav r_max = ldns_rr_descriptor_maximum(desc); 330*7b5038d7SDag-Erling Smørgrav r_min = ldns_rr_descriptor_minimum(desc); 331*7b5038d7SDag-Erling Smørgrav } else { 332*7b5038d7SDag-Erling Smørgrav r_min = 0; 333*7b5038d7SDag-Erling Smørgrav r_max = 1; 334*7b5038d7SDag-Erling Smørgrav } 335*7b5038d7SDag-Erling Smørgrav 336*7b5038d7SDag-Erling Smørgrav /* depending on the rr_type we need to extract 337*7b5038d7SDag-Erling Smørgrav * the rdata differently, e.g. NSEC/NSEC3 */ 338*7b5038d7SDag-Erling Smørgrav switch(rr_type) { 339*7b5038d7SDag-Erling Smørgrav default: 340*7b5038d7SDag-Erling Smørgrav done = false; 341*7b5038d7SDag-Erling Smørgrav 342*7b5038d7SDag-Erling Smørgrav for (r_cnt = 0; !done && r_cnt < r_max; r_cnt++) { 343*7b5038d7SDag-Erling Smørgrav quoted = false; 344*7b5038d7SDag-Erling Smørgrav /* if type = B64, the field may contain spaces */ 345*7b5038d7SDag-Erling Smørgrav if (ldns_rr_descriptor_field_type(desc, 346*7b5038d7SDag-Erling Smørgrav r_cnt) == LDNS_RDF_TYPE_B64 || 347*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, 348*7b5038d7SDag-Erling Smørgrav r_cnt) == LDNS_RDF_TYPE_HEX || 349*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, 350*7b5038d7SDag-Erling Smørgrav r_cnt) == LDNS_RDF_TYPE_LOC || 351*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, 352*7b5038d7SDag-Erling Smørgrav r_cnt) == LDNS_RDF_TYPE_WKS || 353*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, 354*7b5038d7SDag-Erling Smørgrav r_cnt) == LDNS_RDF_TYPE_IPSECKEY || 355*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, 356*7b5038d7SDag-Erling Smørgrav r_cnt) == LDNS_RDF_TYPE_NSEC) { 357*7b5038d7SDag-Erling Smørgrav delimiters = "\n\t"; 358*7b5038d7SDag-Erling Smørgrav } else { 359*7b5038d7SDag-Erling Smørgrav delimiters = "\n\t "; 360*7b5038d7SDag-Erling Smørgrav } 361*7b5038d7SDag-Erling Smørgrav 362*7b5038d7SDag-Erling Smørgrav if (ldns_rr_descriptor_field_type(desc, 363*7b5038d7SDag-Erling Smørgrav r_cnt) == LDNS_RDF_TYPE_STR && 364*7b5038d7SDag-Erling Smørgrav ldns_buffer_remaining(rd_buf) > 0) { 365*7b5038d7SDag-Erling Smørgrav /* skip spaces */ 366*7b5038d7SDag-Erling Smørgrav while (*(ldns_buffer_current(rd_buf)) == ' ') { 367*7b5038d7SDag-Erling Smørgrav ldns_buffer_skip(rd_buf, 1); 368*7b5038d7SDag-Erling Smørgrav } 369*7b5038d7SDag-Erling Smørgrav 370*7b5038d7SDag-Erling Smørgrav if (*(ldns_buffer_current(rd_buf)) == '\"') { 371*7b5038d7SDag-Erling Smørgrav delimiters = "\"\0"; 372*7b5038d7SDag-Erling Smørgrav ldns_buffer_skip(rd_buf, 1); 373*7b5038d7SDag-Erling Smørgrav quoted = true; 374*7b5038d7SDag-Erling Smørgrav } 375*7b5038d7SDag-Erling Smørgrav } 376*7b5038d7SDag-Erling Smørgrav 377*7b5038d7SDag-Erling Smørgrav /* because number of fields can be variable, we can't 378*7b5038d7SDag-Erling Smørgrav rely on _maximum() only */ 379*7b5038d7SDag-Erling Smørgrav /* skip spaces */ 380*7b5038d7SDag-Erling Smørgrav while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf) && 381*7b5038d7SDag-Erling Smørgrav *(ldns_buffer_current(rd_buf)) == ' ' && !quoted 382*7b5038d7SDag-Erling Smørgrav ) { 383*7b5038d7SDag-Erling Smørgrav ldns_buffer_skip(rd_buf, 1); 384*7b5038d7SDag-Erling Smørgrav } 385*7b5038d7SDag-Erling Smørgrav 386*7b5038d7SDag-Erling Smørgrav pre_data_pos = ldns_buffer_position(rd_buf); 387*7b5038d7SDag-Erling Smørgrav if ((c = ldns_bget_token(rd_buf, rd, delimiters, 388*7b5038d7SDag-Erling Smørgrav LDNS_MAX_RDFLEN)) != -1) { 389*7b5038d7SDag-Erling Smørgrav /* hmmz, rfc3597 specifies that any type can be represented with 390*7b5038d7SDag-Erling Smørgrav * \# method, which can contain spaces... 391*7b5038d7SDag-Erling Smørgrav * it does specify size though... 392*7b5038d7SDag-Erling Smørgrav */ 393*7b5038d7SDag-Erling Smørgrav rd_strlen = strlen(rd); 394*7b5038d7SDag-Erling Smørgrav 395*7b5038d7SDag-Erling Smørgrav /* unknown RR data */ 396*7b5038d7SDag-Erling Smørgrav if (strncmp(rd, "\\#", 2) == 0 && !quoted && (rd_strlen == 2 || rd[2]==' ')) { 397*7b5038d7SDag-Erling Smørgrav uint16_t hex_data_size; 398*7b5038d7SDag-Erling Smørgrav char *hex_data_str; 399*7b5038d7SDag-Erling Smørgrav uint16_t cur_hex_data_size; 400*7b5038d7SDag-Erling Smørgrav 401*7b5038d7SDag-Erling Smørgrav was_unknown_rr_format = 1; 402*7b5038d7SDag-Erling Smørgrav /* go back to before \# and skip it while setting delimiters better */ 403*7b5038d7SDag-Erling Smørgrav ldns_buffer_set_position(rd_buf, pre_data_pos); 404*7b5038d7SDag-Erling Smørgrav delimiters = "\n\t "; 405*7b5038d7SDag-Erling Smørgrav (void)ldns_bget_token(rd_buf, rd, delimiters, LDNS_MAX_RDFLEN); 406*7b5038d7SDag-Erling Smørgrav /* read rdata octet length */ 407*7b5038d7SDag-Erling Smørgrav c = ldns_bget_token(rd_buf, rd, delimiters, LDNS_MAX_RDFLEN); 408*7b5038d7SDag-Erling Smørgrav if (c == -1) { 409*7b5038d7SDag-Erling Smørgrav /* something goes very wrong here */ 410*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 411*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 412*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 413*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 414*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 415*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 416*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_RDATA_ERR; 417*7b5038d7SDag-Erling Smørgrav } 418*7b5038d7SDag-Erling Smørgrav hex_data_size = (uint16_t) atoi(rd); 419*7b5038d7SDag-Erling Smørgrav /* copy the hex chars into hex str (which is 2 chars per byte) */ 420*7b5038d7SDag-Erling Smørgrav hex_data_str = LDNS_XMALLOC(char, 2 * hex_data_size + 1); 421*7b5038d7SDag-Erling Smørgrav if (!hex_data_str) { 422*7b5038d7SDag-Erling Smørgrav /* malloc error */ 423*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 424*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 425*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 426*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 427*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 428*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 429*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_RDATA_ERR; 430*7b5038d7SDag-Erling Smørgrav } 431*7b5038d7SDag-Erling Smørgrav cur_hex_data_size = 0; 432*7b5038d7SDag-Erling Smørgrav while(cur_hex_data_size < 2 * hex_data_size) { 433*7b5038d7SDag-Erling Smørgrav c = ldns_bget_token(rd_buf, rd, delimiters, LDNS_MAX_RDFLEN); 434*7b5038d7SDag-Erling Smørgrav if (c != -1) { 435*7b5038d7SDag-Erling Smørgrav rd_strlen = strlen(rd); 436*7b5038d7SDag-Erling Smørgrav } 437*7b5038d7SDag-Erling Smørgrav if (c == -1 || (size_t)cur_hex_data_size + rd_strlen > 2 * (size_t)hex_data_size) { 438*7b5038d7SDag-Erling Smørgrav LDNS_FREE(hex_data_str); 439*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 440*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 441*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 442*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 443*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 444*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 445*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_RDATA_ERR; 446*7b5038d7SDag-Erling Smørgrav } 447*7b5038d7SDag-Erling Smørgrav strncpy(hex_data_str + cur_hex_data_size, rd, rd_strlen); 448*7b5038d7SDag-Erling Smørgrav cur_hex_data_size += rd_strlen; 449*7b5038d7SDag-Erling Smørgrav } 450*7b5038d7SDag-Erling Smørgrav hex_data_str[cur_hex_data_size] = '\0'; 451*7b5038d7SDag-Erling Smørgrav 452*7b5038d7SDag-Erling Smørgrav /* correct the rdf type */ 453*7b5038d7SDag-Erling Smørgrav /* if *we* know the type, interpret it as wireformat */ 454*7b5038d7SDag-Erling Smørgrav if (desc) { 455*7b5038d7SDag-Erling Smørgrav size_t hex_pos = 0; 456*7b5038d7SDag-Erling Smørgrav uint8_t *hex_data = LDNS_XMALLOC(uint8_t, hex_data_size + 2); 457*7b5038d7SDag-Erling Smørgrav ldns_status s; 458*7b5038d7SDag-Erling Smørgrav if(!hex_data) { 459*7b5038d7SDag-Erling Smørgrav LDNS_FREE(hex_data_str); 460*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 461*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 462*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 463*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 464*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 465*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 466*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 467*7b5038d7SDag-Erling Smørgrav } 468*7b5038d7SDag-Erling Smørgrav ldns_write_uint16(hex_data, hex_data_size); 469*7b5038d7SDag-Erling Smørgrav ldns_hexstring_to_data(hex_data + 2, hex_data_str); 470*7b5038d7SDag-Erling Smørgrav s = ldns_wire2rdf(new, hex_data, 471*7b5038d7SDag-Erling Smørgrav hex_data_size+2, &hex_pos); 472*7b5038d7SDag-Erling Smørgrav if(s != LDNS_STATUS_OK) { 473*7b5038d7SDag-Erling Smørgrav LDNS_FREE(hex_data_str); 474*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 475*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 476*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 477*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 478*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 479*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 480*7b5038d7SDag-Erling Smørgrav return s; 481*7b5038d7SDag-Erling Smørgrav } 482*7b5038d7SDag-Erling Smørgrav LDNS_FREE(hex_data); 483*7b5038d7SDag-Erling Smørgrav } else { 484*7b5038d7SDag-Erling Smørgrav r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_HEX, hex_data_str); 485*7b5038d7SDag-Erling Smørgrav if(!r) { 486*7b5038d7SDag-Erling Smørgrav LDNS_FREE(hex_data_str); 487*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 488*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 489*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 490*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 491*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 492*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 493*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 494*7b5038d7SDag-Erling Smørgrav } 495*7b5038d7SDag-Erling Smørgrav ldns_rdf_set_type(r, LDNS_RDF_TYPE_UNKNOWN); 496*7b5038d7SDag-Erling Smørgrav if(!ldns_rr_push_rdf(new, r)) { 497*7b5038d7SDag-Erling Smørgrav LDNS_FREE(hex_data_str); 498*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 499*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 500*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 501*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 502*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 503*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 504*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 505*7b5038d7SDag-Erling Smørgrav } 506*7b5038d7SDag-Erling Smørgrav } 507*7b5038d7SDag-Erling Smørgrav LDNS_FREE(hex_data_str); 508*7b5038d7SDag-Erling Smørgrav } else { 509*7b5038d7SDag-Erling Smørgrav /* Normal RR */ 510*7b5038d7SDag-Erling Smørgrav switch(ldns_rr_descriptor_field_type(desc, r_cnt)) { 511*7b5038d7SDag-Erling Smørgrav case LDNS_RDF_TYPE_HEX: 512*7b5038d7SDag-Erling Smørgrav case LDNS_RDF_TYPE_B64: 513*7b5038d7SDag-Erling Smørgrav /* can have spaces, and will always be the last 514*7b5038d7SDag-Erling Smørgrav * record of the rrdata. Read in the rest */ 515*7b5038d7SDag-Erling Smørgrav if ((c = ldns_bget_token(rd_buf, 516*7b5038d7SDag-Erling Smørgrav b64, 517*7b5038d7SDag-Erling Smørgrav "\n", 518*7b5038d7SDag-Erling Smørgrav LDNS_MAX_RDFLEN)) 519*7b5038d7SDag-Erling Smørgrav != -1) { 520*7b5038d7SDag-Erling Smørgrav rd = strncat(rd, 521*7b5038d7SDag-Erling Smørgrav b64, 522*7b5038d7SDag-Erling Smørgrav LDNS_MAX_RDFLEN 523*7b5038d7SDag-Erling Smørgrav - strlen(rd) - 1); 524*7b5038d7SDag-Erling Smørgrav } 525*7b5038d7SDag-Erling Smørgrav r = ldns_rdf_new_frm_str( 526*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, r_cnt), 527*7b5038d7SDag-Erling Smørgrav rd); 528*7b5038d7SDag-Erling Smørgrav break; 529*7b5038d7SDag-Erling Smørgrav case LDNS_RDF_TYPE_DNAME: 530*7b5038d7SDag-Erling Smørgrav r = ldns_rdf_new_frm_str( 531*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, r_cnt), 532*7b5038d7SDag-Erling Smørgrav rd); 533*7b5038d7SDag-Erling Smørgrav 534*7b5038d7SDag-Erling Smørgrav /* check if the origin should be used or concatenated */ 535*7b5038d7SDag-Erling Smørgrav if (r && ldns_rdf_size(r) > 1 && ldns_rdf_data(r)[0] == 1 536*7b5038d7SDag-Erling Smørgrav && ldns_rdf_data(r)[1] == '@') { 537*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(r); 538*7b5038d7SDag-Erling Smørgrav if (origin) { 539*7b5038d7SDag-Erling Smørgrav r = ldns_rdf_clone(origin); 540*7b5038d7SDag-Erling Smørgrav } else { 541*7b5038d7SDag-Erling Smørgrav /* if this is the SOA, use its own owner name */ 542*7b5038d7SDag-Erling Smørgrav if (rr_type == LDNS_RR_TYPE_SOA) { 543*7b5038d7SDag-Erling Smørgrav r = ldns_rdf_clone(ldns_rr_owner(new)); 544*7b5038d7SDag-Erling Smørgrav } else { 545*7b5038d7SDag-Erling Smørgrav r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, "."); 546*7b5038d7SDag-Erling Smørgrav } 547*7b5038d7SDag-Erling Smørgrav } 548*7b5038d7SDag-Erling Smørgrav } else if (r && rd_strlen >= 1 && !ldns_dname_str_absolute(rd) && origin) { 549*7b5038d7SDag-Erling Smørgrav if (ldns_dname_cat(r, origin) != LDNS_STATUS_OK) { 550*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 551*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 552*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 553*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 554*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 555*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 556*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_ERR; 557*7b5038d7SDag-Erling Smørgrav } 558*7b5038d7SDag-Erling Smørgrav } 559*7b5038d7SDag-Erling Smørgrav break; 560*7b5038d7SDag-Erling Smørgrav default: 561*7b5038d7SDag-Erling Smørgrav r = ldns_rdf_new_frm_str( 562*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(desc, r_cnt), 563*7b5038d7SDag-Erling Smørgrav rd); 564*7b5038d7SDag-Erling Smørgrav break; 565*7b5038d7SDag-Erling Smørgrav } 566*7b5038d7SDag-Erling Smørgrav if (r) { 567*7b5038d7SDag-Erling Smørgrav ldns_rr_push_rdf(new, r); 568*7b5038d7SDag-Erling Smørgrav } else { 569*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 570*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 571*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 572*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 573*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 574*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 575*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_RDATA_ERR; 576*7b5038d7SDag-Erling Smørgrav } 577*7b5038d7SDag-Erling Smørgrav } 578*7b5038d7SDag-Erling Smørgrav if (quoted) { 579*7b5038d7SDag-Erling Smørgrav if (ldns_buffer_available(rd_buf, 1)) { 580*7b5038d7SDag-Erling Smørgrav ldns_buffer_skip(rd_buf, 1); 581*7b5038d7SDag-Erling Smørgrav } else { 582*7b5038d7SDag-Erling Smørgrav done = true; 583*7b5038d7SDag-Erling Smørgrav } 584*7b5038d7SDag-Erling Smørgrav } 585*7b5038d7SDag-Erling Smørgrav } else { 586*7b5038d7SDag-Erling Smørgrav done = true; 587*7b5038d7SDag-Erling Smørgrav } 588*7b5038d7SDag-Erling Smørgrav } 589*7b5038d7SDag-Erling Smørgrav } 590*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 591*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 592*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rd_buf); 593*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr_buf); 594*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 595*7b5038d7SDag-Erling Smørgrav 596*7b5038d7SDag-Erling Smørgrav if (!question && desc && !was_unknown_rr_format && ldns_rr_rd_count(new) < r_min) { 597*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 598*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR; 599*7b5038d7SDag-Erling Smørgrav } 600*7b5038d7SDag-Erling Smørgrav 601*7b5038d7SDag-Erling Smørgrav if (newrr) { 602*7b5038d7SDag-Erling Smørgrav *newrr = new; 603*7b5038d7SDag-Erling Smørgrav } 604*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_OK; 605*7b5038d7SDag-Erling Smørgrav 606*7b5038d7SDag-Erling Smørgrav ldnserror: 607*7b5038d7SDag-Erling Smørgrav LDNS_FREE(type); 608*7b5038d7SDag-Erling Smørgrav LDNS_FREE(owner); 609*7b5038d7SDag-Erling Smørgrav LDNS_FREE(ttl); 610*7b5038d7SDag-Erling Smørgrav LDNS_FREE(clas); 611*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rdata); 612*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd); 613*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rd_buf); 614*7b5038d7SDag-Erling Smørgrav LDNS_FREE(b64); 615*7b5038d7SDag-Erling Smørgrav ldns_rr_free(new); 616*7b5038d7SDag-Erling Smørgrav return status; 617*7b5038d7SDag-Erling Smørgrav } 618*7b5038d7SDag-Erling Smørgrav 619*7b5038d7SDag-Erling Smørgrav ldns_status 620*7b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_str(ldns_rr **newrr, const char *str, 621*7b5038d7SDag-Erling Smørgrav uint32_t default_ttl, ldns_rdf *origin, 622*7b5038d7SDag-Erling Smørgrav ldns_rdf **prev) 623*7b5038d7SDag-Erling Smørgrav { 624*7b5038d7SDag-Erling Smørgrav return ldns_rr_new_frm_str_internal(newrr, 625*7b5038d7SDag-Erling Smørgrav str, 626*7b5038d7SDag-Erling Smørgrav default_ttl, 627*7b5038d7SDag-Erling Smørgrav origin, 628*7b5038d7SDag-Erling Smørgrav prev, 629*7b5038d7SDag-Erling Smørgrav false); 630*7b5038d7SDag-Erling Smørgrav } 631*7b5038d7SDag-Erling Smørgrav 632*7b5038d7SDag-Erling Smørgrav ldns_status 633*7b5038d7SDag-Erling Smørgrav ldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str, 634*7b5038d7SDag-Erling Smørgrav ldns_rdf *origin, ldns_rdf **prev) 635*7b5038d7SDag-Erling Smørgrav { 636*7b5038d7SDag-Erling Smørgrav return ldns_rr_new_frm_str_internal(newrr, 637*7b5038d7SDag-Erling Smørgrav str, 638*7b5038d7SDag-Erling Smørgrav 0, 639*7b5038d7SDag-Erling Smørgrav origin, 640*7b5038d7SDag-Erling Smørgrav prev, 641*7b5038d7SDag-Erling Smørgrav true); 642*7b5038d7SDag-Erling Smørgrav } 643*7b5038d7SDag-Erling Smørgrav 644*7b5038d7SDag-Erling Smørgrav ldns_status 645*7b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev) 646*7b5038d7SDag-Erling Smørgrav { 647*7b5038d7SDag-Erling Smørgrav return ldns_rr_new_frm_fp_l(newrr, fp, ttl, origin, prev, NULL); 648*7b5038d7SDag-Erling Smørgrav } 649*7b5038d7SDag-Erling Smørgrav 650*7b5038d7SDag-Erling Smørgrav ldns_status 651*7b5038d7SDag-Erling Smørgrav ldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr) 652*7b5038d7SDag-Erling Smørgrav { 653*7b5038d7SDag-Erling Smørgrav char *line; 654*7b5038d7SDag-Erling Smørgrav const char *endptr; /* unused */ 655*7b5038d7SDag-Erling Smørgrav ldns_rr *rr; 656*7b5038d7SDag-Erling Smørgrav uint32_t ttl; 657*7b5038d7SDag-Erling Smørgrav ldns_rdf *tmp; 658*7b5038d7SDag-Erling Smørgrav ldns_status s; 659*7b5038d7SDag-Erling Smørgrav ssize_t size; 660*7b5038d7SDag-Erling Smørgrav int offset = 0; 661*7b5038d7SDag-Erling Smørgrav 662*7b5038d7SDag-Erling Smørgrav if (default_ttl) { 663*7b5038d7SDag-Erling Smørgrav ttl = *default_ttl; 664*7b5038d7SDag-Erling Smørgrav } else { 665*7b5038d7SDag-Erling Smørgrav ttl = 0; 666*7b5038d7SDag-Erling Smørgrav } 667*7b5038d7SDag-Erling Smørgrav 668*7b5038d7SDag-Erling Smørgrav line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); 669*7b5038d7SDag-Erling Smørgrav if (!line) { 670*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_MEM_ERR; 671*7b5038d7SDag-Erling Smørgrav } 672*7b5038d7SDag-Erling Smørgrav 673*7b5038d7SDag-Erling Smørgrav /* read an entire line in from the file */ 674*7b5038d7SDag-Erling Smørgrav if ((size = ldns_fget_token_l(fp, line, LDNS_PARSE_SKIP_SPACE, LDNS_MAX_LINELEN, line_nr)) == -1) { 675*7b5038d7SDag-Erling Smørgrav LDNS_FREE(line); 676*7b5038d7SDag-Erling Smørgrav /* if last line was empty, we are now at feof, which is not 677*7b5038d7SDag-Erling Smørgrav * always a parse error (happens when for instance last line 678*7b5038d7SDag-Erling Smørgrav * was a comment) 679*7b5038d7SDag-Erling Smørgrav */ 680*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_ERR; 681*7b5038d7SDag-Erling Smørgrav } 682*7b5038d7SDag-Erling Smørgrav 683*7b5038d7SDag-Erling Smørgrav /* we can have the situation, where we've read ok, but still got 684*7b5038d7SDag-Erling Smørgrav * no bytes to play with, in this case size is 0 685*7b5038d7SDag-Erling Smørgrav */ 686*7b5038d7SDag-Erling Smørgrav if (size == 0) { 687*7b5038d7SDag-Erling Smørgrav LDNS_FREE(line); 688*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_EMPTY; 689*7b5038d7SDag-Erling Smørgrav } 690*7b5038d7SDag-Erling Smørgrav 691*7b5038d7SDag-Erling Smørgrav if (strncmp(line, "$ORIGIN", 7) == 0 && isspace(line[7])) { 692*7b5038d7SDag-Erling Smørgrav if (*origin) { 693*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(*origin); 694*7b5038d7SDag-Erling Smørgrav *origin = NULL; 695*7b5038d7SDag-Erling Smørgrav } 696*7b5038d7SDag-Erling Smørgrav offset = 8; 697*7b5038d7SDag-Erling Smørgrav while (isspace(line[offset])) { 698*7b5038d7SDag-Erling Smørgrav offset++; 699*7b5038d7SDag-Erling Smørgrav } 700*7b5038d7SDag-Erling Smørgrav tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, line + offset); 701*7b5038d7SDag-Erling Smørgrav if (!tmp) { 702*7b5038d7SDag-Erling Smørgrav /* could not parse what next to $ORIGIN */ 703*7b5038d7SDag-Erling Smørgrav LDNS_FREE(line); 704*7b5038d7SDag-Erling Smørgrav return LDNS_STATUS_SYNTAX_DNAME_ERR; 705*7b5038d7SDag-Erling Smørgrav } 706*7b5038d7SDag-Erling Smørgrav *origin = tmp; 707*7b5038d7SDag-Erling Smørgrav s = LDNS_STATUS_SYNTAX_ORIGIN; 708*7b5038d7SDag-Erling Smørgrav } else if (strncmp(line, "$TTL", 4) == 0 && isspace(line[4])) { 709*7b5038d7SDag-Erling Smørgrav offset = 5; 710*7b5038d7SDag-Erling Smørgrav while (isspace(line[offset])) { 711*7b5038d7SDag-Erling Smørgrav offset++; 712*7b5038d7SDag-Erling Smørgrav } 713*7b5038d7SDag-Erling Smørgrav if (default_ttl) { 714*7b5038d7SDag-Erling Smørgrav *default_ttl = ldns_str2period(line + offset, &endptr); 715*7b5038d7SDag-Erling Smørgrav } 716*7b5038d7SDag-Erling Smørgrav s = LDNS_STATUS_SYNTAX_TTL; 717*7b5038d7SDag-Erling Smørgrav } else if (strncmp(line, "$INCLUDE", 8) == 0) { 718*7b5038d7SDag-Erling Smørgrav s = LDNS_STATUS_SYNTAX_INCLUDE; 719*7b5038d7SDag-Erling Smørgrav } else { 720*7b5038d7SDag-Erling Smørgrav if (origin && *origin) { 721*7b5038d7SDag-Erling Smørgrav s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, *origin, prev); 722*7b5038d7SDag-Erling Smørgrav } else { 723*7b5038d7SDag-Erling Smørgrav s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, NULL, prev); 724*7b5038d7SDag-Erling Smørgrav } 725*7b5038d7SDag-Erling Smørgrav } 726*7b5038d7SDag-Erling Smørgrav LDNS_FREE(line); 727*7b5038d7SDag-Erling Smørgrav if (newrr && s == LDNS_STATUS_OK) { 728*7b5038d7SDag-Erling Smørgrav *newrr = rr; 729*7b5038d7SDag-Erling Smørgrav } 730*7b5038d7SDag-Erling Smørgrav return s; 731*7b5038d7SDag-Erling Smørgrav } 732*7b5038d7SDag-Erling Smørgrav 733*7b5038d7SDag-Erling Smørgrav void 734*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner) 735*7b5038d7SDag-Erling Smørgrav { 736*7b5038d7SDag-Erling Smørgrav rr->_owner = owner; 737*7b5038d7SDag-Erling Smørgrav } 738*7b5038d7SDag-Erling Smørgrav 739*7b5038d7SDag-Erling Smørgrav void 740*7b5038d7SDag-Erling Smørgrav ldns_rr_set_question(ldns_rr *rr, bool question) 741*7b5038d7SDag-Erling Smørgrav { 742*7b5038d7SDag-Erling Smørgrav rr->_rr_question = question; 743*7b5038d7SDag-Erling Smørgrav } 744*7b5038d7SDag-Erling Smørgrav 745*7b5038d7SDag-Erling Smørgrav void 746*7b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl) 747*7b5038d7SDag-Erling Smørgrav { 748*7b5038d7SDag-Erling Smørgrav rr->_ttl = ttl; 749*7b5038d7SDag-Erling Smørgrav } 750*7b5038d7SDag-Erling Smørgrav 751*7b5038d7SDag-Erling Smørgrav void 752*7b5038d7SDag-Erling Smørgrav ldns_rr_set_rd_count(ldns_rr *rr, size_t count) 753*7b5038d7SDag-Erling Smørgrav { 754*7b5038d7SDag-Erling Smørgrav rr->_rd_count = count; 755*7b5038d7SDag-Erling Smørgrav } 756*7b5038d7SDag-Erling Smørgrav 757*7b5038d7SDag-Erling Smørgrav void 758*7b5038d7SDag-Erling Smørgrav ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type) 759*7b5038d7SDag-Erling Smørgrav { 760*7b5038d7SDag-Erling Smørgrav rr->_rr_type = rr_type; 761*7b5038d7SDag-Erling Smørgrav } 762*7b5038d7SDag-Erling Smørgrav 763*7b5038d7SDag-Erling Smørgrav void 764*7b5038d7SDag-Erling Smørgrav ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class) 765*7b5038d7SDag-Erling Smørgrav { 766*7b5038d7SDag-Erling Smørgrav rr->_rr_class = rr_class; 767*7b5038d7SDag-Erling Smørgrav } 768*7b5038d7SDag-Erling Smørgrav 769*7b5038d7SDag-Erling Smørgrav ldns_rdf * 770*7b5038d7SDag-Erling Smørgrav ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position) 771*7b5038d7SDag-Erling Smørgrav { 772*7b5038d7SDag-Erling Smørgrav size_t rd_count; 773*7b5038d7SDag-Erling Smørgrav ldns_rdf *pop; 774*7b5038d7SDag-Erling Smørgrav 775*7b5038d7SDag-Erling Smørgrav rd_count = ldns_rr_rd_count(rr); 776*7b5038d7SDag-Erling Smørgrav if (position < rd_count) { 777*7b5038d7SDag-Erling Smørgrav /* dicard the old one */ 778*7b5038d7SDag-Erling Smørgrav pop = rr->_rdata_fields[position]; 779*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields[position] = (ldns_rdf*)f; 780*7b5038d7SDag-Erling Smørgrav return pop; 781*7b5038d7SDag-Erling Smørgrav } else { 782*7b5038d7SDag-Erling Smørgrav return NULL; 783*7b5038d7SDag-Erling Smørgrav } 784*7b5038d7SDag-Erling Smørgrav } 785*7b5038d7SDag-Erling Smørgrav 786*7b5038d7SDag-Erling Smørgrav bool 787*7b5038d7SDag-Erling Smørgrav ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f) 788*7b5038d7SDag-Erling Smørgrav { 789*7b5038d7SDag-Erling Smørgrav size_t rd_count; 790*7b5038d7SDag-Erling Smørgrav ldns_rdf **rdata_fields; 791*7b5038d7SDag-Erling Smørgrav 792*7b5038d7SDag-Erling Smørgrav rd_count = ldns_rr_rd_count(rr); 793*7b5038d7SDag-Erling Smørgrav 794*7b5038d7SDag-Erling Smørgrav /* grow the array */ 795*7b5038d7SDag-Erling Smørgrav rdata_fields = LDNS_XREALLOC( 796*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields, ldns_rdf *, rd_count + 1); 797*7b5038d7SDag-Erling Smørgrav if (!rdata_fields) { 798*7b5038d7SDag-Erling Smørgrav return false; 799*7b5038d7SDag-Erling Smørgrav } 800*7b5038d7SDag-Erling Smørgrav 801*7b5038d7SDag-Erling Smørgrav /* add the new member */ 802*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields = rdata_fields; 803*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields[rd_count] = (ldns_rdf*)f; 804*7b5038d7SDag-Erling Smørgrav 805*7b5038d7SDag-Erling Smørgrav ldns_rr_set_rd_count(rr, rd_count + 1); 806*7b5038d7SDag-Erling Smørgrav return true; 807*7b5038d7SDag-Erling Smørgrav } 808*7b5038d7SDag-Erling Smørgrav 809*7b5038d7SDag-Erling Smørgrav ldns_rdf * 810*7b5038d7SDag-Erling Smørgrav ldns_rr_pop_rdf(ldns_rr *rr) 811*7b5038d7SDag-Erling Smørgrav { 812*7b5038d7SDag-Erling Smørgrav size_t rd_count; 813*7b5038d7SDag-Erling Smørgrav ldns_rdf *pop; 814*7b5038d7SDag-Erling Smørgrav ldns_rdf** newrd; 815*7b5038d7SDag-Erling Smørgrav 816*7b5038d7SDag-Erling Smørgrav rd_count = ldns_rr_rd_count(rr); 817*7b5038d7SDag-Erling Smørgrav 818*7b5038d7SDag-Erling Smørgrav if (rd_count == 0) { 819*7b5038d7SDag-Erling Smørgrav return NULL; 820*7b5038d7SDag-Erling Smørgrav } 821*7b5038d7SDag-Erling Smørgrav 822*7b5038d7SDag-Erling Smørgrav pop = rr->_rdata_fields[rd_count - 1]; 823*7b5038d7SDag-Erling Smørgrav 824*7b5038d7SDag-Erling Smørgrav /* try to shrink the array */ 825*7b5038d7SDag-Erling Smørgrav if(rd_count > 1) { 826*7b5038d7SDag-Erling Smørgrav newrd = LDNS_XREALLOC( 827*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields, ldns_rdf *, rd_count - 1); 828*7b5038d7SDag-Erling Smørgrav if(newrd) 829*7b5038d7SDag-Erling Smørgrav rr->_rdata_fields = newrd; 830*7b5038d7SDag-Erling Smørgrav } else { 831*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr->_rdata_fields); 832*7b5038d7SDag-Erling Smørgrav } 833*7b5038d7SDag-Erling Smørgrav 834*7b5038d7SDag-Erling Smørgrav ldns_rr_set_rd_count(rr, rd_count - 1); 835*7b5038d7SDag-Erling Smørgrav return pop; 836*7b5038d7SDag-Erling Smørgrav } 837*7b5038d7SDag-Erling Smørgrav 838*7b5038d7SDag-Erling Smørgrav ldns_rdf * 839*7b5038d7SDag-Erling Smørgrav ldns_rr_rdf(const ldns_rr *rr, size_t nr) 840*7b5038d7SDag-Erling Smørgrav { 841*7b5038d7SDag-Erling Smørgrav if (rr && nr < ldns_rr_rd_count(rr)) { 842*7b5038d7SDag-Erling Smørgrav return rr->_rdata_fields[nr]; 843*7b5038d7SDag-Erling Smørgrav } else { 844*7b5038d7SDag-Erling Smørgrav return NULL; 845*7b5038d7SDag-Erling Smørgrav } 846*7b5038d7SDag-Erling Smørgrav } 847*7b5038d7SDag-Erling Smørgrav 848*7b5038d7SDag-Erling Smørgrav ldns_rdf * 849*7b5038d7SDag-Erling Smørgrav ldns_rr_owner(const ldns_rr *rr) 850*7b5038d7SDag-Erling Smørgrav { 851*7b5038d7SDag-Erling Smørgrav return rr->_owner; 852*7b5038d7SDag-Erling Smørgrav } 853*7b5038d7SDag-Erling Smørgrav 854*7b5038d7SDag-Erling Smørgrav bool 855*7b5038d7SDag-Erling Smørgrav ldns_rr_is_question(const ldns_rr *rr) 856*7b5038d7SDag-Erling Smørgrav { 857*7b5038d7SDag-Erling Smørgrav return rr->_rr_question; 858*7b5038d7SDag-Erling Smørgrav } 859*7b5038d7SDag-Erling Smørgrav 860*7b5038d7SDag-Erling Smørgrav uint32_t 861*7b5038d7SDag-Erling Smørgrav ldns_rr_ttl(const ldns_rr *rr) 862*7b5038d7SDag-Erling Smørgrav { 863*7b5038d7SDag-Erling Smørgrav return rr->_ttl; 864*7b5038d7SDag-Erling Smørgrav } 865*7b5038d7SDag-Erling Smørgrav 866*7b5038d7SDag-Erling Smørgrav size_t 867*7b5038d7SDag-Erling Smørgrav ldns_rr_rd_count(const ldns_rr *rr) 868*7b5038d7SDag-Erling Smørgrav { 869*7b5038d7SDag-Erling Smørgrav return rr->_rd_count; 870*7b5038d7SDag-Erling Smørgrav } 871*7b5038d7SDag-Erling Smørgrav 872*7b5038d7SDag-Erling Smørgrav ldns_rr_type 873*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(const ldns_rr *rr) 874*7b5038d7SDag-Erling Smørgrav { 875*7b5038d7SDag-Erling Smørgrav return rr->_rr_type; 876*7b5038d7SDag-Erling Smørgrav } 877*7b5038d7SDag-Erling Smørgrav 878*7b5038d7SDag-Erling Smørgrav ldns_rr_class 879*7b5038d7SDag-Erling Smørgrav ldns_rr_get_class(const ldns_rr *rr) 880*7b5038d7SDag-Erling Smørgrav { 881*7b5038d7SDag-Erling Smørgrav return rr->_rr_class; 882*7b5038d7SDag-Erling Smørgrav } 883*7b5038d7SDag-Erling Smørgrav 884*7b5038d7SDag-Erling Smørgrav /* rr_lists */ 885*7b5038d7SDag-Erling Smørgrav 886*7b5038d7SDag-Erling Smørgrav size_t 887*7b5038d7SDag-Erling Smørgrav ldns_rr_list_rr_count(const ldns_rr_list *rr_list) 888*7b5038d7SDag-Erling Smørgrav { 889*7b5038d7SDag-Erling Smørgrav if (rr_list) { 890*7b5038d7SDag-Erling Smørgrav return rr_list->_rr_count; 891*7b5038d7SDag-Erling Smørgrav } else { 892*7b5038d7SDag-Erling Smørgrav return 0; 893*7b5038d7SDag-Erling Smørgrav } 894*7b5038d7SDag-Erling Smørgrav } 895*7b5038d7SDag-Erling Smørgrav 896*7b5038d7SDag-Erling Smørgrav ldns_rr * 897*7b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count) 898*7b5038d7SDag-Erling Smørgrav { 899*7b5038d7SDag-Erling Smørgrav ldns_rr *old; 900*7b5038d7SDag-Erling Smørgrav 901*7b5038d7SDag-Erling Smørgrav if (count > ldns_rr_list_rr_count(rr_list)) { 902*7b5038d7SDag-Erling Smørgrav return NULL; 903*7b5038d7SDag-Erling Smørgrav } 904*7b5038d7SDag-Erling Smørgrav 905*7b5038d7SDag-Erling Smørgrav old = ldns_rr_list_rr(rr_list, count); 906*7b5038d7SDag-Erling Smørgrav 907*7b5038d7SDag-Erling Smørgrav /* overwrite old's pointer */ 908*7b5038d7SDag-Erling Smørgrav rr_list->_rrs[count] = (ldns_rr*)r; 909*7b5038d7SDag-Erling Smørgrav return old; 910*7b5038d7SDag-Erling Smørgrav } 911*7b5038d7SDag-Erling Smørgrav 912*7b5038d7SDag-Erling Smørgrav void 913*7b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count) 914*7b5038d7SDag-Erling Smørgrav { 915*7b5038d7SDag-Erling Smørgrav assert(count <= rr_list->_rr_capacity); 916*7b5038d7SDag-Erling Smørgrav rr_list->_rr_count = count; 917*7b5038d7SDag-Erling Smørgrav } 918*7b5038d7SDag-Erling Smørgrav 919*7b5038d7SDag-Erling Smørgrav ldns_rr * 920*7b5038d7SDag-Erling Smørgrav ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr) 921*7b5038d7SDag-Erling Smørgrav { 922*7b5038d7SDag-Erling Smørgrav if (nr < ldns_rr_list_rr_count(rr_list)) { 923*7b5038d7SDag-Erling Smørgrav return rr_list->_rrs[nr]; 924*7b5038d7SDag-Erling Smørgrav } else { 925*7b5038d7SDag-Erling Smørgrav return NULL; 926*7b5038d7SDag-Erling Smørgrav } 927*7b5038d7SDag-Erling Smørgrav } 928*7b5038d7SDag-Erling Smørgrav 929*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 930*7b5038d7SDag-Erling Smørgrav ldns_rr_list_new(void) 931*7b5038d7SDag-Erling Smørgrav { 932*7b5038d7SDag-Erling Smørgrav ldns_rr_list *rr_list = LDNS_MALLOC(ldns_rr_list); 933*7b5038d7SDag-Erling Smørgrav if(!rr_list) return NULL; 934*7b5038d7SDag-Erling Smørgrav rr_list->_rr_count = 0; 935*7b5038d7SDag-Erling Smørgrav rr_list->_rr_capacity = 0; 936*7b5038d7SDag-Erling Smørgrav rr_list->_rrs = NULL; 937*7b5038d7SDag-Erling Smørgrav return rr_list; 938*7b5038d7SDag-Erling Smørgrav } 939*7b5038d7SDag-Erling Smørgrav 940*7b5038d7SDag-Erling Smørgrav void 941*7b5038d7SDag-Erling Smørgrav ldns_rr_list_free(ldns_rr_list *rr_list) 942*7b5038d7SDag-Erling Smørgrav { 943*7b5038d7SDag-Erling Smørgrav if (rr_list) { 944*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_list->_rrs); 945*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_list); 946*7b5038d7SDag-Erling Smørgrav } 947*7b5038d7SDag-Erling Smørgrav } 948*7b5038d7SDag-Erling Smørgrav 949*7b5038d7SDag-Erling Smørgrav void 950*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(ldns_rr_list *rr_list) 951*7b5038d7SDag-Erling Smørgrav { 952*7b5038d7SDag-Erling Smørgrav size_t i; 953*7b5038d7SDag-Erling Smørgrav 954*7b5038d7SDag-Erling Smørgrav if (rr_list) { 955*7b5038d7SDag-Erling Smørgrav for (i=0; i < ldns_rr_list_rr_count(rr_list); i++) { 956*7b5038d7SDag-Erling Smørgrav ldns_rr_free(ldns_rr_list_rr(rr_list, i)); 957*7b5038d7SDag-Erling Smørgrav } 958*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_list->_rrs); 959*7b5038d7SDag-Erling Smørgrav LDNS_FREE(rr_list); 960*7b5038d7SDag-Erling Smørgrav } 961*7b5038d7SDag-Erling Smørgrav } 962*7b5038d7SDag-Erling Smørgrav 963*7b5038d7SDag-Erling Smørgrav 964*7b5038d7SDag-Erling Smørgrav /* add right to left. So we modify *left! */ 965*7b5038d7SDag-Erling Smørgrav bool 966*7b5038d7SDag-Erling Smørgrav ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right) 967*7b5038d7SDag-Erling Smørgrav { 968*7b5038d7SDag-Erling Smørgrav size_t r_rr_count; 969*7b5038d7SDag-Erling Smørgrav size_t i; 970*7b5038d7SDag-Erling Smørgrav 971*7b5038d7SDag-Erling Smørgrav if (!left) { 972*7b5038d7SDag-Erling Smørgrav return false; 973*7b5038d7SDag-Erling Smørgrav } 974*7b5038d7SDag-Erling Smørgrav 975*7b5038d7SDag-Erling Smørgrav if (right) { 976*7b5038d7SDag-Erling Smørgrav r_rr_count = ldns_rr_list_rr_count(right); 977*7b5038d7SDag-Erling Smørgrav } else { 978*7b5038d7SDag-Erling Smørgrav r_rr_count = 0; 979*7b5038d7SDag-Erling Smørgrav } 980*7b5038d7SDag-Erling Smørgrav 981*7b5038d7SDag-Erling Smørgrav /* push right to left */ 982*7b5038d7SDag-Erling Smørgrav for(i = 0; i < r_rr_count; i++) { 983*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(left, ldns_rr_list_rr(right, i)); 984*7b5038d7SDag-Erling Smørgrav } 985*7b5038d7SDag-Erling Smørgrav return true; 986*7b5038d7SDag-Erling Smørgrav } 987*7b5038d7SDag-Erling Smørgrav 988*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 989*7b5038d7SDag-Erling Smørgrav ldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right) 990*7b5038d7SDag-Erling Smørgrav { 991*7b5038d7SDag-Erling Smørgrav size_t l_rr_count; 992*7b5038d7SDag-Erling Smørgrav size_t r_rr_count; 993*7b5038d7SDag-Erling Smørgrav size_t i; 994*7b5038d7SDag-Erling Smørgrav ldns_rr_list *cat; 995*7b5038d7SDag-Erling Smørgrav 996*7b5038d7SDag-Erling Smørgrav if (left) { 997*7b5038d7SDag-Erling Smørgrav l_rr_count = ldns_rr_list_rr_count(left); 998*7b5038d7SDag-Erling Smørgrav } else { 999*7b5038d7SDag-Erling Smørgrav return ldns_rr_list_clone(right); 1000*7b5038d7SDag-Erling Smørgrav } 1001*7b5038d7SDag-Erling Smørgrav 1002*7b5038d7SDag-Erling Smørgrav if (right) { 1003*7b5038d7SDag-Erling Smørgrav r_rr_count = ldns_rr_list_rr_count(right); 1004*7b5038d7SDag-Erling Smørgrav } else { 1005*7b5038d7SDag-Erling Smørgrav r_rr_count = 0; 1006*7b5038d7SDag-Erling Smørgrav } 1007*7b5038d7SDag-Erling Smørgrav 1008*7b5038d7SDag-Erling Smørgrav cat = ldns_rr_list_new(); 1009*7b5038d7SDag-Erling Smørgrav 1010*7b5038d7SDag-Erling Smørgrav if (!cat) { 1011*7b5038d7SDag-Erling Smørgrav return NULL; 1012*7b5038d7SDag-Erling Smørgrav } 1013*7b5038d7SDag-Erling Smørgrav 1014*7b5038d7SDag-Erling Smørgrav /* left */ 1015*7b5038d7SDag-Erling Smørgrav for(i = 0; i < l_rr_count; i++) { 1016*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(cat, 1017*7b5038d7SDag-Erling Smørgrav ldns_rr_clone(ldns_rr_list_rr(left, i))); 1018*7b5038d7SDag-Erling Smørgrav } 1019*7b5038d7SDag-Erling Smørgrav /* right */ 1020*7b5038d7SDag-Erling Smørgrav for(i = 0; i < r_rr_count; i++) { 1021*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(cat, 1022*7b5038d7SDag-Erling Smørgrav ldns_rr_clone(ldns_rr_list_rr(right, i))); 1023*7b5038d7SDag-Erling Smørgrav } 1024*7b5038d7SDag-Erling Smørgrav return cat; 1025*7b5038d7SDag-Erling Smørgrav } 1026*7b5038d7SDag-Erling Smørgrav 1027*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 1028*7b5038d7SDag-Erling Smørgrav ldns_rr_list_subtype_by_rdf(ldns_rr_list *l, ldns_rdf *r, size_t pos) 1029*7b5038d7SDag-Erling Smørgrav { 1030*7b5038d7SDag-Erling Smørgrav size_t i; 1031*7b5038d7SDag-Erling Smørgrav ldns_rr_list *subtyped; 1032*7b5038d7SDag-Erling Smørgrav ldns_rdf *list_rdf; 1033*7b5038d7SDag-Erling Smørgrav 1034*7b5038d7SDag-Erling Smørgrav subtyped = ldns_rr_list_new(); 1035*7b5038d7SDag-Erling Smørgrav 1036*7b5038d7SDag-Erling Smørgrav for(i = 0; i < ldns_rr_list_rr_count(l); i++) { 1037*7b5038d7SDag-Erling Smørgrav list_rdf = ldns_rr_rdf( 1038*7b5038d7SDag-Erling Smørgrav ldns_rr_list_rr(l, i), 1039*7b5038d7SDag-Erling Smørgrav pos); 1040*7b5038d7SDag-Erling Smørgrav if (!list_rdf) { 1041*7b5038d7SDag-Erling Smørgrav /* pos is too large or any other error */ 1042*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(subtyped); 1043*7b5038d7SDag-Erling Smørgrav return NULL; 1044*7b5038d7SDag-Erling Smørgrav } 1045*7b5038d7SDag-Erling Smørgrav 1046*7b5038d7SDag-Erling Smørgrav if (ldns_rdf_compare(list_rdf, r) == 0) { 1047*7b5038d7SDag-Erling Smørgrav /* a match */ 1048*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(subtyped, 1049*7b5038d7SDag-Erling Smørgrav ldns_rr_clone(ldns_rr_list_rr(l, i))); 1050*7b5038d7SDag-Erling Smørgrav } 1051*7b5038d7SDag-Erling Smørgrav } 1052*7b5038d7SDag-Erling Smørgrav 1053*7b5038d7SDag-Erling Smørgrav if (ldns_rr_list_rr_count(subtyped) > 0) { 1054*7b5038d7SDag-Erling Smørgrav return subtyped; 1055*7b5038d7SDag-Erling Smørgrav } else { 1056*7b5038d7SDag-Erling Smørgrav ldns_rr_list_free(subtyped); 1057*7b5038d7SDag-Erling Smørgrav return NULL; 1058*7b5038d7SDag-Erling Smørgrav } 1059*7b5038d7SDag-Erling Smørgrav } 1060*7b5038d7SDag-Erling Smørgrav 1061*7b5038d7SDag-Erling Smørgrav bool 1062*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr) 1063*7b5038d7SDag-Erling Smørgrav { 1064*7b5038d7SDag-Erling Smørgrav size_t rr_count; 1065*7b5038d7SDag-Erling Smørgrav size_t cap; 1066*7b5038d7SDag-Erling Smørgrav 1067*7b5038d7SDag-Erling Smørgrav rr_count = ldns_rr_list_rr_count(rr_list); 1068*7b5038d7SDag-Erling Smørgrav cap = rr_list->_rr_capacity; 1069*7b5038d7SDag-Erling Smørgrav 1070*7b5038d7SDag-Erling Smørgrav /* grow the array */ 1071*7b5038d7SDag-Erling Smørgrav if(rr_count+1 > cap) { 1072*7b5038d7SDag-Erling Smørgrav ldns_rr **rrs; 1073*7b5038d7SDag-Erling Smørgrav 1074*7b5038d7SDag-Erling Smørgrav if(cap == 0) 1075*7b5038d7SDag-Erling Smørgrav cap = LDNS_RRLIST_INIT; /* initial list size */ 1076*7b5038d7SDag-Erling Smørgrav else cap *= 2; 1077*7b5038d7SDag-Erling Smørgrav rrs = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap); 1078*7b5038d7SDag-Erling Smørgrav if (!rrs) { 1079*7b5038d7SDag-Erling Smørgrav return false; 1080*7b5038d7SDag-Erling Smørgrav } 1081*7b5038d7SDag-Erling Smørgrav rr_list->_rrs = rrs; 1082*7b5038d7SDag-Erling Smørgrav rr_list->_rr_capacity = cap; 1083*7b5038d7SDag-Erling Smørgrav } 1084*7b5038d7SDag-Erling Smørgrav 1085*7b5038d7SDag-Erling Smørgrav /* add the new member */ 1086*7b5038d7SDag-Erling Smørgrav rr_list->_rrs[rr_count] = (ldns_rr*)rr; 1087*7b5038d7SDag-Erling Smørgrav 1088*7b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr_count(rr_list, rr_count + 1); 1089*7b5038d7SDag-Erling Smørgrav return true; 1090*7b5038d7SDag-Erling Smørgrav } 1091*7b5038d7SDag-Erling Smørgrav 1092*7b5038d7SDag-Erling Smørgrav bool 1093*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list) 1094*7b5038d7SDag-Erling Smørgrav { 1095*7b5038d7SDag-Erling Smørgrav size_t i; 1096*7b5038d7SDag-Erling Smørgrav 1097*7b5038d7SDag-Erling Smørgrav for(i = 0; i < ldns_rr_list_rr_count(push_list); i++) { 1098*7b5038d7SDag-Erling Smørgrav if (!ldns_rr_list_push_rr(rr_list, 1099*7b5038d7SDag-Erling Smørgrav ldns_rr_list_rr(push_list, i))) { 1100*7b5038d7SDag-Erling Smørgrav return false; 1101*7b5038d7SDag-Erling Smørgrav } 1102*7b5038d7SDag-Erling Smørgrav } 1103*7b5038d7SDag-Erling Smørgrav return true; 1104*7b5038d7SDag-Erling Smørgrav } 1105*7b5038d7SDag-Erling Smørgrav 1106*7b5038d7SDag-Erling Smørgrav ldns_rr * 1107*7b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rr(ldns_rr_list *rr_list) 1108*7b5038d7SDag-Erling Smørgrav { 1109*7b5038d7SDag-Erling Smørgrav size_t rr_count; 1110*7b5038d7SDag-Erling Smørgrav size_t cap; 1111*7b5038d7SDag-Erling Smørgrav ldns_rr *pop; 1112*7b5038d7SDag-Erling Smørgrav 1113*7b5038d7SDag-Erling Smørgrav rr_count = ldns_rr_list_rr_count(rr_list); 1114*7b5038d7SDag-Erling Smørgrav 1115*7b5038d7SDag-Erling Smørgrav if (rr_count == 0) { 1116*7b5038d7SDag-Erling Smørgrav return NULL; 1117*7b5038d7SDag-Erling Smørgrav } 1118*7b5038d7SDag-Erling Smørgrav 1119*7b5038d7SDag-Erling Smørgrav cap = rr_list->_rr_capacity; 1120*7b5038d7SDag-Erling Smørgrav pop = ldns_rr_list_rr(rr_list, rr_count - 1); 1121*7b5038d7SDag-Erling Smørgrav 1122*7b5038d7SDag-Erling Smørgrav /* shrink the array */ 1123*7b5038d7SDag-Erling Smørgrav if(cap > LDNS_RRLIST_INIT && rr_count-1 <= cap/2) { 1124*7b5038d7SDag-Erling Smørgrav ldns_rr** a; 1125*7b5038d7SDag-Erling Smørgrav cap /= 2; 1126*7b5038d7SDag-Erling Smørgrav a = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap); 1127*7b5038d7SDag-Erling Smørgrav if(a) { 1128*7b5038d7SDag-Erling Smørgrav rr_list->_rrs = a; 1129*7b5038d7SDag-Erling Smørgrav rr_list->_rr_capacity = cap; 1130*7b5038d7SDag-Erling Smørgrav } 1131*7b5038d7SDag-Erling Smørgrav } 1132*7b5038d7SDag-Erling Smørgrav 1133*7b5038d7SDag-Erling Smørgrav ldns_rr_list_set_rr_count(rr_list, rr_count - 1); 1134*7b5038d7SDag-Erling Smørgrav 1135*7b5038d7SDag-Erling Smørgrav return pop; 1136*7b5038d7SDag-Erling Smørgrav } 1137*7b5038d7SDag-Erling Smørgrav 1138*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 1139*7b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t howmany) 1140*7b5038d7SDag-Erling Smørgrav { 1141*7b5038d7SDag-Erling Smørgrav /* pop a number of rr's and put them in a rr_list */ 1142*7b5038d7SDag-Erling Smørgrav ldns_rr_list *popped; 1143*7b5038d7SDag-Erling Smørgrav ldns_rr *p; 1144*7b5038d7SDag-Erling Smørgrav size_t i = howmany; 1145*7b5038d7SDag-Erling Smørgrav 1146*7b5038d7SDag-Erling Smørgrav popped = ldns_rr_list_new(); 1147*7b5038d7SDag-Erling Smørgrav 1148*7b5038d7SDag-Erling Smørgrav if (!popped) { 1149*7b5038d7SDag-Erling Smørgrav return NULL; 1150*7b5038d7SDag-Erling Smørgrav } 1151*7b5038d7SDag-Erling Smørgrav 1152*7b5038d7SDag-Erling Smørgrav 1153*7b5038d7SDag-Erling Smørgrav while(i > 0 && 1154*7b5038d7SDag-Erling Smørgrav (p = ldns_rr_list_pop_rr(rr_list)) != NULL) { 1155*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(popped, p); 1156*7b5038d7SDag-Erling Smørgrav i--; 1157*7b5038d7SDag-Erling Smørgrav } 1158*7b5038d7SDag-Erling Smørgrav 1159*7b5038d7SDag-Erling Smørgrav if (i == howmany) { 1160*7b5038d7SDag-Erling Smørgrav return NULL; 1161*7b5038d7SDag-Erling Smørgrav } else { 1162*7b5038d7SDag-Erling Smørgrav return popped; 1163*7b5038d7SDag-Erling Smørgrav } 1164*7b5038d7SDag-Erling Smørgrav } 1165*7b5038d7SDag-Erling Smørgrav 1166*7b5038d7SDag-Erling Smørgrav 1167*7b5038d7SDag-Erling Smørgrav bool 1168*7b5038d7SDag-Erling Smørgrav ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr) 1169*7b5038d7SDag-Erling Smørgrav { 1170*7b5038d7SDag-Erling Smørgrav size_t i; 1171*7b5038d7SDag-Erling Smørgrav 1172*7b5038d7SDag-Erling Smørgrav if (!rr_list || !rr || ldns_rr_list_rr_count(rr_list) == 0) { 1173*7b5038d7SDag-Erling Smørgrav return false; 1174*7b5038d7SDag-Erling Smørgrav } 1175*7b5038d7SDag-Erling Smørgrav 1176*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { 1177*7b5038d7SDag-Erling Smørgrav if (rr == ldns_rr_list_rr(rr_list, i)) { 1178*7b5038d7SDag-Erling Smørgrav return true; 1179*7b5038d7SDag-Erling Smørgrav } else if (ldns_rr_compare(rr, ldns_rr_list_rr(rr_list, i)) == 0) { 1180*7b5038d7SDag-Erling Smørgrav return true; 1181*7b5038d7SDag-Erling Smørgrav } 1182*7b5038d7SDag-Erling Smørgrav } 1183*7b5038d7SDag-Erling Smørgrav return false; 1184*7b5038d7SDag-Erling Smørgrav } 1185*7b5038d7SDag-Erling Smørgrav 1186*7b5038d7SDag-Erling Smørgrav bool 1187*7b5038d7SDag-Erling Smørgrav ldns_is_rrset(ldns_rr_list *rr_list) 1188*7b5038d7SDag-Erling Smørgrav { 1189*7b5038d7SDag-Erling Smørgrav ldns_rr_type t; 1190*7b5038d7SDag-Erling Smørgrav ldns_rr_class c; 1191*7b5038d7SDag-Erling Smørgrav ldns_rdf *o; 1192*7b5038d7SDag-Erling Smørgrav ldns_rr *tmp; 1193*7b5038d7SDag-Erling Smørgrav size_t i; 1194*7b5038d7SDag-Erling Smørgrav 1195*7b5038d7SDag-Erling Smørgrav if (!rr_list || ldns_rr_list_rr_count(rr_list) == 0) { 1196*7b5038d7SDag-Erling Smørgrav return false; 1197*7b5038d7SDag-Erling Smørgrav } 1198*7b5038d7SDag-Erling Smørgrav 1199*7b5038d7SDag-Erling Smørgrav tmp = ldns_rr_list_rr(rr_list, 0); 1200*7b5038d7SDag-Erling Smørgrav 1201*7b5038d7SDag-Erling Smørgrav t = ldns_rr_get_type(tmp); 1202*7b5038d7SDag-Erling Smørgrav c = ldns_rr_get_class(tmp); 1203*7b5038d7SDag-Erling Smørgrav o = ldns_rr_owner(tmp); 1204*7b5038d7SDag-Erling Smørgrav 1205*7b5038d7SDag-Erling Smørgrav /* compare these with the rest of the rr_list, start with 1 */ 1206*7b5038d7SDag-Erling Smørgrav for (i = 1; i < ldns_rr_list_rr_count(rr_list); i++) { 1207*7b5038d7SDag-Erling Smørgrav tmp = ldns_rr_list_rr(rr_list, i); 1208*7b5038d7SDag-Erling Smørgrav if (t != ldns_rr_get_type(tmp)) { 1209*7b5038d7SDag-Erling Smørgrav return false; 1210*7b5038d7SDag-Erling Smørgrav } 1211*7b5038d7SDag-Erling Smørgrav if (c != ldns_rr_get_class(tmp)) { 1212*7b5038d7SDag-Erling Smørgrav return false; 1213*7b5038d7SDag-Erling Smørgrav } 1214*7b5038d7SDag-Erling Smørgrav if (ldns_rdf_compare(o, ldns_rr_owner(tmp)) != 0) { 1215*7b5038d7SDag-Erling Smørgrav return false; 1216*7b5038d7SDag-Erling Smørgrav } 1217*7b5038d7SDag-Erling Smørgrav } 1218*7b5038d7SDag-Erling Smørgrav return true; 1219*7b5038d7SDag-Erling Smørgrav } 1220*7b5038d7SDag-Erling Smørgrav 1221*7b5038d7SDag-Erling Smørgrav bool 1222*7b5038d7SDag-Erling Smørgrav ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr) 1223*7b5038d7SDag-Erling Smørgrav { 1224*7b5038d7SDag-Erling Smørgrav size_t rr_count; 1225*7b5038d7SDag-Erling Smørgrav size_t i; 1226*7b5038d7SDag-Erling Smørgrav ldns_rr *last; 1227*7b5038d7SDag-Erling Smørgrav 1228*7b5038d7SDag-Erling Smørgrav assert(rr != NULL); 1229*7b5038d7SDag-Erling Smørgrav 1230*7b5038d7SDag-Erling Smørgrav rr_count = ldns_rr_list_rr_count(rr_list); 1231*7b5038d7SDag-Erling Smørgrav 1232*7b5038d7SDag-Erling Smørgrav if (rr_count == 0) { 1233*7b5038d7SDag-Erling Smørgrav /* nothing there, so checking it is 1234*7b5038d7SDag-Erling Smørgrav * not needed */ 1235*7b5038d7SDag-Erling Smørgrav return ldns_rr_list_push_rr(rr_list, rr); 1236*7b5038d7SDag-Erling Smørgrav } else { 1237*7b5038d7SDag-Erling Smørgrav /* check with the final rr in the rr_list */ 1238*7b5038d7SDag-Erling Smørgrav last = ldns_rr_list_rr(rr_list, rr_count - 1); 1239*7b5038d7SDag-Erling Smørgrav 1240*7b5038d7SDag-Erling Smørgrav if (ldns_rr_get_class(last) != ldns_rr_get_class(rr)) { 1241*7b5038d7SDag-Erling Smørgrav return false; 1242*7b5038d7SDag-Erling Smørgrav } 1243*7b5038d7SDag-Erling Smørgrav if (ldns_rr_get_type(last) != ldns_rr_get_type(rr)) { 1244*7b5038d7SDag-Erling Smørgrav return false; 1245*7b5038d7SDag-Erling Smørgrav } 1246*7b5038d7SDag-Erling Smørgrav /* only check if not equal to RRSIG */ 1247*7b5038d7SDag-Erling Smørgrav if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) { 1248*7b5038d7SDag-Erling Smørgrav if (ldns_rr_ttl(last) != ldns_rr_ttl(rr)) { 1249*7b5038d7SDag-Erling Smørgrav return false; 1250*7b5038d7SDag-Erling Smørgrav } 1251*7b5038d7SDag-Erling Smørgrav } 1252*7b5038d7SDag-Erling Smørgrav if (ldns_rdf_compare(ldns_rr_owner(last), 1253*7b5038d7SDag-Erling Smørgrav ldns_rr_owner(rr)) != 0) { 1254*7b5038d7SDag-Erling Smørgrav return false; 1255*7b5038d7SDag-Erling Smørgrav } 1256*7b5038d7SDag-Erling Smørgrav /* ok, still alive - check if the rr already 1257*7b5038d7SDag-Erling Smørgrav * exists - if so, dont' add it */ 1258*7b5038d7SDag-Erling Smørgrav for(i = 0; i < rr_count; i++) { 1259*7b5038d7SDag-Erling Smørgrav if(ldns_rr_compare( 1260*7b5038d7SDag-Erling Smørgrav ldns_rr_list_rr(rr_list, i), rr) == 0) { 1261*7b5038d7SDag-Erling Smørgrav return false; 1262*7b5038d7SDag-Erling Smørgrav } 1263*7b5038d7SDag-Erling Smørgrav } 1264*7b5038d7SDag-Erling Smørgrav /* it's safe, push it */ 1265*7b5038d7SDag-Erling Smørgrav return ldns_rr_list_push_rr(rr_list, rr); 1266*7b5038d7SDag-Erling Smørgrav } 1267*7b5038d7SDag-Erling Smørgrav } 1268*7b5038d7SDag-Erling Smørgrav 1269*7b5038d7SDag-Erling Smørgrav ldns_rr * 1270*7b5038d7SDag-Erling Smørgrav ldns_rr_set_pop_rr(ldns_rr_list *rr_list) 1271*7b5038d7SDag-Erling Smørgrav { 1272*7b5038d7SDag-Erling Smørgrav return ldns_rr_list_pop_rr(rr_list); 1273*7b5038d7SDag-Erling Smørgrav } 1274*7b5038d7SDag-Erling Smørgrav 1275*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 1276*7b5038d7SDag-Erling Smørgrav ldns_rr_list_pop_rrset(ldns_rr_list *rr_list) 1277*7b5038d7SDag-Erling Smørgrav { 1278*7b5038d7SDag-Erling Smørgrav ldns_rr_list *rrset; 1279*7b5038d7SDag-Erling Smørgrav ldns_rr *last_rr = NULL; 1280*7b5038d7SDag-Erling Smørgrav ldns_rr *next_rr; 1281*7b5038d7SDag-Erling Smørgrav 1282*7b5038d7SDag-Erling Smørgrav if (!rr_list) { 1283*7b5038d7SDag-Erling Smørgrav return NULL; 1284*7b5038d7SDag-Erling Smørgrav } 1285*7b5038d7SDag-Erling Smørgrav 1286*7b5038d7SDag-Erling Smørgrav rrset = ldns_rr_list_new(); 1287*7b5038d7SDag-Erling Smørgrav if (!last_rr) { 1288*7b5038d7SDag-Erling Smørgrav last_rr = ldns_rr_list_pop_rr(rr_list); 1289*7b5038d7SDag-Erling Smørgrav if (!last_rr) { 1290*7b5038d7SDag-Erling Smørgrav ldns_rr_list_free(rrset); 1291*7b5038d7SDag-Erling Smørgrav return NULL; 1292*7b5038d7SDag-Erling Smørgrav } else { 1293*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(rrset, last_rr); 1294*7b5038d7SDag-Erling Smørgrav } 1295*7b5038d7SDag-Erling Smørgrav } 1296*7b5038d7SDag-Erling Smørgrav 1297*7b5038d7SDag-Erling Smørgrav if (ldns_rr_list_rr_count(rr_list) > 0) { 1298*7b5038d7SDag-Erling Smørgrav next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1); 1299*7b5038d7SDag-Erling Smørgrav } else { 1300*7b5038d7SDag-Erling Smørgrav next_rr = NULL; 1301*7b5038d7SDag-Erling Smørgrav } 1302*7b5038d7SDag-Erling Smørgrav 1303*7b5038d7SDag-Erling Smørgrav while (next_rr) { 1304*7b5038d7SDag-Erling Smørgrav if ( 1305*7b5038d7SDag-Erling Smørgrav ldns_rdf_compare(ldns_rr_owner(next_rr), 1306*7b5038d7SDag-Erling Smørgrav ldns_rr_owner(last_rr)) == 0 1307*7b5038d7SDag-Erling Smørgrav && 1308*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(next_rr) == ldns_rr_get_type(last_rr) 1309*7b5038d7SDag-Erling Smørgrav && 1310*7b5038d7SDag-Erling Smørgrav ldns_rr_get_class(next_rr) == ldns_rr_get_class(last_rr) 1311*7b5038d7SDag-Erling Smørgrav ) { 1312*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(rrset, ldns_rr_list_pop_rr(rr_list)); 1313*7b5038d7SDag-Erling Smørgrav if (ldns_rr_list_rr_count(rr_list) > 0) { 1314*7b5038d7SDag-Erling Smørgrav last_rr = next_rr; 1315*7b5038d7SDag-Erling Smørgrav next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1); 1316*7b5038d7SDag-Erling Smørgrav } else { 1317*7b5038d7SDag-Erling Smørgrav next_rr = NULL; 1318*7b5038d7SDag-Erling Smørgrav } 1319*7b5038d7SDag-Erling Smørgrav } else { 1320*7b5038d7SDag-Erling Smørgrav next_rr = NULL; 1321*7b5038d7SDag-Erling Smørgrav } 1322*7b5038d7SDag-Erling Smørgrav } 1323*7b5038d7SDag-Erling Smørgrav 1324*7b5038d7SDag-Erling Smørgrav return rrset; 1325*7b5038d7SDag-Erling Smørgrav } 1326*7b5038d7SDag-Erling Smørgrav 1327*7b5038d7SDag-Erling Smørgrav ldns_rr * 1328*7b5038d7SDag-Erling Smørgrav ldns_rr_clone(const ldns_rr *rr) 1329*7b5038d7SDag-Erling Smørgrav { 1330*7b5038d7SDag-Erling Smørgrav size_t i; 1331*7b5038d7SDag-Erling Smørgrav ldns_rr *new_rr; 1332*7b5038d7SDag-Erling Smørgrav 1333*7b5038d7SDag-Erling Smørgrav if (!rr) { 1334*7b5038d7SDag-Erling Smørgrav return NULL; 1335*7b5038d7SDag-Erling Smørgrav } 1336*7b5038d7SDag-Erling Smørgrav 1337*7b5038d7SDag-Erling Smørgrav new_rr = ldns_rr_new(); 1338*7b5038d7SDag-Erling Smørgrav if (!new_rr) { 1339*7b5038d7SDag-Erling Smørgrav return NULL; 1340*7b5038d7SDag-Erling Smørgrav } 1341*7b5038d7SDag-Erling Smørgrav if (ldns_rr_owner(rr)) { 1342*7b5038d7SDag-Erling Smørgrav ldns_rr_set_owner(new_rr, ldns_rdf_clone(ldns_rr_owner(rr))); 1343*7b5038d7SDag-Erling Smørgrav } 1344*7b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(new_rr, ldns_rr_ttl(rr)); 1345*7b5038d7SDag-Erling Smørgrav ldns_rr_set_type(new_rr, ldns_rr_get_type(rr)); 1346*7b5038d7SDag-Erling Smørgrav ldns_rr_set_class(new_rr, ldns_rr_get_class(rr)); 1347*7b5038d7SDag-Erling Smørgrav ldns_rr_set_question(new_rr, ldns_rr_is_question(rr)); 1348*7b5038d7SDag-Erling Smørgrav 1349*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_rd_count(rr); i++) { 1350*7b5038d7SDag-Erling Smørgrav if (ldns_rr_rdf(rr,i)) { 1351*7b5038d7SDag-Erling Smørgrav ldns_rr_push_rdf(new_rr, ldns_rdf_clone(ldns_rr_rdf(rr, i))); 1352*7b5038d7SDag-Erling Smørgrav } 1353*7b5038d7SDag-Erling Smørgrav } 1354*7b5038d7SDag-Erling Smørgrav 1355*7b5038d7SDag-Erling Smørgrav return new_rr; 1356*7b5038d7SDag-Erling Smørgrav } 1357*7b5038d7SDag-Erling Smørgrav 1358*7b5038d7SDag-Erling Smørgrav ldns_rr_list * 1359*7b5038d7SDag-Erling Smørgrav ldns_rr_list_clone(const ldns_rr_list *rrlist) 1360*7b5038d7SDag-Erling Smørgrav { 1361*7b5038d7SDag-Erling Smørgrav size_t i; 1362*7b5038d7SDag-Erling Smørgrav ldns_rr_list *new_list; 1363*7b5038d7SDag-Erling Smørgrav ldns_rr *r; 1364*7b5038d7SDag-Erling Smørgrav 1365*7b5038d7SDag-Erling Smørgrav if (!rrlist) { 1366*7b5038d7SDag-Erling Smørgrav return NULL; 1367*7b5038d7SDag-Erling Smørgrav } 1368*7b5038d7SDag-Erling Smørgrav 1369*7b5038d7SDag-Erling Smørgrav new_list = ldns_rr_list_new(); 1370*7b5038d7SDag-Erling Smørgrav if (!new_list) { 1371*7b5038d7SDag-Erling Smørgrav return NULL; 1372*7b5038d7SDag-Erling Smørgrav } 1373*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_list_rr_count(rrlist); i++) { 1374*7b5038d7SDag-Erling Smørgrav r = ldns_rr_clone( 1375*7b5038d7SDag-Erling Smørgrav ldns_rr_list_rr(rrlist, i) 1376*7b5038d7SDag-Erling Smørgrav ); 1377*7b5038d7SDag-Erling Smørgrav if (!r) { 1378*7b5038d7SDag-Erling Smørgrav /* huh, failure in cloning */ 1379*7b5038d7SDag-Erling Smørgrav ldns_rr_list_deep_free(new_list); 1380*7b5038d7SDag-Erling Smørgrav return NULL; 1381*7b5038d7SDag-Erling Smørgrav } 1382*7b5038d7SDag-Erling Smørgrav ldns_rr_list_push_rr(new_list, r); 1383*7b5038d7SDag-Erling Smørgrav } 1384*7b5038d7SDag-Erling Smørgrav return new_list; 1385*7b5038d7SDag-Erling Smørgrav } 1386*7b5038d7SDag-Erling Smørgrav 1387*7b5038d7SDag-Erling Smørgrav 1388*7b5038d7SDag-Erling Smørgrav static int 1389*7b5038d7SDag-Erling Smørgrav qsort_rr_compare(const void *a, const void *b) 1390*7b5038d7SDag-Erling Smørgrav { 1391*7b5038d7SDag-Erling Smørgrav const ldns_rr *rr1 = * (const ldns_rr **) a; 1392*7b5038d7SDag-Erling Smørgrav const ldns_rr *rr2 = * (const ldns_rr **) b; 1393*7b5038d7SDag-Erling Smørgrav 1394*7b5038d7SDag-Erling Smørgrav if (rr1 == NULL && rr2 == NULL) { 1395*7b5038d7SDag-Erling Smørgrav return 0; 1396*7b5038d7SDag-Erling Smørgrav } 1397*7b5038d7SDag-Erling Smørgrav if (rr1 == NULL) { 1398*7b5038d7SDag-Erling Smørgrav return -1; 1399*7b5038d7SDag-Erling Smørgrav } 1400*7b5038d7SDag-Erling Smørgrav if (rr2 == NULL) { 1401*7b5038d7SDag-Erling Smørgrav return 1; 1402*7b5038d7SDag-Erling Smørgrav } 1403*7b5038d7SDag-Erling Smørgrav return ldns_rr_compare(rr1, rr2); 1404*7b5038d7SDag-Erling Smørgrav } 1405*7b5038d7SDag-Erling Smørgrav 1406*7b5038d7SDag-Erling Smørgrav static int 1407*7b5038d7SDag-Erling Smørgrav qsort_schwartz_rr_compare(const void *a, const void *b) 1408*7b5038d7SDag-Erling Smørgrav { 1409*7b5038d7SDag-Erling Smørgrav int result = 0; 1410*7b5038d7SDag-Erling Smørgrav ldns_rr *rr1, *rr2; 1411*7b5038d7SDag-Erling Smørgrav ldns_buffer *rr1_buf, *rr2_buf; 1412*7b5038d7SDag-Erling Smørgrav struct ldns_schwartzian_compare_struct *sa = *(struct ldns_schwartzian_compare_struct **) a; 1413*7b5038d7SDag-Erling Smørgrav struct ldns_schwartzian_compare_struct *sb = *(struct ldns_schwartzian_compare_struct **) b; 1414*7b5038d7SDag-Erling Smørgrav /* if we are doing 2wire, we need to do lowercasing on the dname (and maybe on the rdata) 1415*7b5038d7SDag-Erling Smørgrav * this must be done for comparison only, so we need to have a temp var for both buffers, 1416*7b5038d7SDag-Erling Smørgrav * which is only used when the transformed object value isn't there yet 1417*7b5038d7SDag-Erling Smørgrav */ 1418*7b5038d7SDag-Erling Smørgrav ldns_rr *canonical_a, *canonical_b; 1419*7b5038d7SDag-Erling Smørgrav 1420*7b5038d7SDag-Erling Smørgrav rr1 = (ldns_rr *) sa->original_object; 1421*7b5038d7SDag-Erling Smørgrav rr2 = (ldns_rr *) sb->original_object; 1422*7b5038d7SDag-Erling Smørgrav 1423*7b5038d7SDag-Erling Smørgrav result = ldns_rr_compare_no_rdata(rr1, rr2); 1424*7b5038d7SDag-Erling Smørgrav 1425*7b5038d7SDag-Erling Smørgrav if (result == 0) { 1426*7b5038d7SDag-Erling Smørgrav if (!sa->transformed_object) { 1427*7b5038d7SDag-Erling Smørgrav canonical_a = ldns_rr_clone(sa->original_object); 1428*7b5038d7SDag-Erling Smørgrav ldns_rr2canonical(canonical_a); 1429*7b5038d7SDag-Erling Smørgrav sa->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_a)); 1430*7b5038d7SDag-Erling Smørgrav if (ldns_rr2buffer_wire(sa->transformed_object, canonical_a, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { 1431*7b5038d7SDag-Erling Smørgrav ldns_buffer_free((ldns_buffer *)sa->transformed_object); 1432*7b5038d7SDag-Erling Smørgrav sa->transformed_object = NULL; 1433*7b5038d7SDag-Erling Smørgrav ldns_rr_free(canonical_a); 1434*7b5038d7SDag-Erling Smørgrav return 0; 1435*7b5038d7SDag-Erling Smørgrav } 1436*7b5038d7SDag-Erling Smørgrav ldns_rr_free(canonical_a); 1437*7b5038d7SDag-Erling Smørgrav } 1438*7b5038d7SDag-Erling Smørgrav if (!sb->transformed_object) { 1439*7b5038d7SDag-Erling Smørgrav canonical_b = ldns_rr_clone(sb->original_object); 1440*7b5038d7SDag-Erling Smørgrav ldns_rr2canonical(canonical_b); 1441*7b5038d7SDag-Erling Smørgrav sb->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_b)); 1442*7b5038d7SDag-Erling Smørgrav if (ldns_rr2buffer_wire(sb->transformed_object, canonical_b, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { 1443*7b5038d7SDag-Erling Smørgrav ldns_buffer_free((ldns_buffer *)sa->transformed_object); 1444*7b5038d7SDag-Erling Smørgrav ldns_buffer_free((ldns_buffer *)sb->transformed_object); 1445*7b5038d7SDag-Erling Smørgrav sa->transformed_object = NULL; 1446*7b5038d7SDag-Erling Smørgrav sb->transformed_object = NULL; 1447*7b5038d7SDag-Erling Smørgrav ldns_rr_free(canonical_b); 1448*7b5038d7SDag-Erling Smørgrav return 0; 1449*7b5038d7SDag-Erling Smørgrav } 1450*7b5038d7SDag-Erling Smørgrav ldns_rr_free(canonical_b); 1451*7b5038d7SDag-Erling Smørgrav } 1452*7b5038d7SDag-Erling Smørgrav rr1_buf = (ldns_buffer *) sa->transformed_object; 1453*7b5038d7SDag-Erling Smørgrav rr2_buf = (ldns_buffer *) sb->transformed_object; 1454*7b5038d7SDag-Erling Smørgrav 1455*7b5038d7SDag-Erling Smørgrav result = ldns_rr_compare_wire(rr1_buf, rr2_buf); 1456*7b5038d7SDag-Erling Smørgrav } 1457*7b5038d7SDag-Erling Smørgrav 1458*7b5038d7SDag-Erling Smørgrav return result; 1459*7b5038d7SDag-Erling Smørgrav } 1460*7b5038d7SDag-Erling Smørgrav 1461*7b5038d7SDag-Erling Smørgrav void 1462*7b5038d7SDag-Erling Smørgrav ldns_rr_list_sort(ldns_rr_list *unsorted) 1463*7b5038d7SDag-Erling Smørgrav { 1464*7b5038d7SDag-Erling Smørgrav struct ldns_schwartzian_compare_struct **sortables; 1465*7b5038d7SDag-Erling Smørgrav size_t item_count; 1466*7b5038d7SDag-Erling Smørgrav size_t i; 1467*7b5038d7SDag-Erling Smørgrav 1468*7b5038d7SDag-Erling Smørgrav if (unsorted) { 1469*7b5038d7SDag-Erling Smørgrav item_count = ldns_rr_list_rr_count(unsorted); 1470*7b5038d7SDag-Erling Smørgrav 1471*7b5038d7SDag-Erling Smørgrav sortables = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct *, 1472*7b5038d7SDag-Erling Smørgrav item_count); 1473*7b5038d7SDag-Erling Smørgrav if(!sortables) return; /* no way to return error */ 1474*7b5038d7SDag-Erling Smørgrav for (i = 0; i < item_count; i++) { 1475*7b5038d7SDag-Erling Smørgrav sortables[i] = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct, 1); 1476*7b5038d7SDag-Erling Smørgrav if(!sortables[i]) { 1477*7b5038d7SDag-Erling Smørgrav /* free the allocated parts */ 1478*7b5038d7SDag-Erling Smørgrav while(i>0) { 1479*7b5038d7SDag-Erling Smørgrav i--; 1480*7b5038d7SDag-Erling Smørgrav LDNS_FREE(sortables[i]); 1481*7b5038d7SDag-Erling Smørgrav } 1482*7b5038d7SDag-Erling Smørgrav /* no way to return error */ 1483*7b5038d7SDag-Erling Smørgrav return; 1484*7b5038d7SDag-Erling Smørgrav } 1485*7b5038d7SDag-Erling Smørgrav sortables[i]->original_object = ldns_rr_list_rr(unsorted, i); 1486*7b5038d7SDag-Erling Smørgrav sortables[i]->transformed_object = NULL; 1487*7b5038d7SDag-Erling Smørgrav } 1488*7b5038d7SDag-Erling Smørgrav qsort(sortables, 1489*7b5038d7SDag-Erling Smørgrav item_count, 1490*7b5038d7SDag-Erling Smørgrav sizeof(struct ldns_schwartzian_compare_struct *), 1491*7b5038d7SDag-Erling Smørgrav qsort_schwartz_rr_compare); 1492*7b5038d7SDag-Erling Smørgrav for (i = 0; i < item_count; i++) { 1493*7b5038d7SDag-Erling Smørgrav unsorted->_rrs[i] = sortables[i]->original_object; 1494*7b5038d7SDag-Erling Smørgrav if (sortables[i]->transformed_object) { 1495*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(sortables[i]->transformed_object); 1496*7b5038d7SDag-Erling Smørgrav } 1497*7b5038d7SDag-Erling Smørgrav LDNS_FREE(sortables[i]); 1498*7b5038d7SDag-Erling Smørgrav } 1499*7b5038d7SDag-Erling Smørgrav LDNS_FREE(sortables); 1500*7b5038d7SDag-Erling Smørgrav } 1501*7b5038d7SDag-Erling Smørgrav } 1502*7b5038d7SDag-Erling Smørgrav 1503*7b5038d7SDag-Erling Smørgrav int 1504*7b5038d7SDag-Erling Smørgrav ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2) 1505*7b5038d7SDag-Erling Smørgrav { 1506*7b5038d7SDag-Erling Smørgrav size_t rr1_len; 1507*7b5038d7SDag-Erling Smørgrav size_t rr2_len; 1508*7b5038d7SDag-Erling Smørgrav size_t offset; 1509*7b5038d7SDag-Erling Smørgrav 1510*7b5038d7SDag-Erling Smørgrav assert(rr1 != NULL); 1511*7b5038d7SDag-Erling Smørgrav assert(rr2 != NULL); 1512*7b5038d7SDag-Erling Smørgrav 1513*7b5038d7SDag-Erling Smørgrav rr1_len = ldns_rr_uncompressed_size(rr1); 1514*7b5038d7SDag-Erling Smørgrav rr2_len = ldns_rr_uncompressed_size(rr2); 1515*7b5038d7SDag-Erling Smørgrav 1516*7b5038d7SDag-Erling Smørgrav if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) < 0) { 1517*7b5038d7SDag-Erling Smørgrav return -1; 1518*7b5038d7SDag-Erling Smørgrav } else if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) > 0) { 1519*7b5038d7SDag-Erling Smørgrav return 1; 1520*7b5038d7SDag-Erling Smørgrav } 1521*7b5038d7SDag-Erling Smørgrav 1522*7b5038d7SDag-Erling Smørgrav /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */ 1523*7b5038d7SDag-Erling Smørgrav if (ldns_rr_get_class(rr1) != ldns_rr_get_class(rr2)) { 1524*7b5038d7SDag-Erling Smørgrav return ldns_rr_get_class(rr1) - ldns_rr_get_class(rr2); 1525*7b5038d7SDag-Erling Smørgrav } 1526*7b5038d7SDag-Erling Smørgrav 1527*7b5038d7SDag-Erling Smørgrav /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */ 1528*7b5038d7SDag-Erling Smørgrav if (ldns_rr_get_type(rr1) != ldns_rr_get_type(rr2)) { 1529*7b5038d7SDag-Erling Smørgrav return ldns_rr_get_type(rr1) - ldns_rr_get_type(rr2); 1530*7b5038d7SDag-Erling Smørgrav } 1531*7b5038d7SDag-Erling Smørgrav 1532*7b5038d7SDag-Erling Smørgrav /* offset is the owername length + ttl + type + class + rdlen == start of wire format rdata */ 1533*7b5038d7SDag-Erling Smørgrav offset = ldns_rdf_size(ldns_rr_owner(rr1)) + 4 + 2 + 2 + 2; 1534*7b5038d7SDag-Erling Smørgrav /* if either record doesn't have any RDATA... */ 1535*7b5038d7SDag-Erling Smørgrav if (offset > rr1_len || offset > rr2_len) { 1536*7b5038d7SDag-Erling Smørgrav if (rr1_len == rr2_len) { 1537*7b5038d7SDag-Erling Smørgrav return 0; 1538*7b5038d7SDag-Erling Smørgrav } 1539*7b5038d7SDag-Erling Smørgrav return ((int) rr2_len - (int) rr1_len); 1540*7b5038d7SDag-Erling Smørgrav } 1541*7b5038d7SDag-Erling Smørgrav 1542*7b5038d7SDag-Erling Smørgrav return 0; 1543*7b5038d7SDag-Erling Smørgrav } 1544*7b5038d7SDag-Erling Smørgrav 1545*7b5038d7SDag-Erling Smørgrav int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf) 1546*7b5038d7SDag-Erling Smørgrav { 1547*7b5038d7SDag-Erling Smørgrav size_t rr1_len, rr2_len, min_len, i, offset; 1548*7b5038d7SDag-Erling Smørgrav 1549*7b5038d7SDag-Erling Smørgrav rr1_len = ldns_buffer_capacity(rr1_buf); 1550*7b5038d7SDag-Erling Smørgrav rr2_len = ldns_buffer_capacity(rr2_buf); 1551*7b5038d7SDag-Erling Smørgrav 1552*7b5038d7SDag-Erling Smørgrav /* jump past dname (checked in earlier part) 1553*7b5038d7SDag-Erling Smørgrav * and especially past TTL */ 1554*7b5038d7SDag-Erling Smørgrav offset = 0; 1555*7b5038d7SDag-Erling Smørgrav while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) { 1556*7b5038d7SDag-Erling Smørgrav offset += *ldns_buffer_at(rr1_buf, offset) + 1; 1557*7b5038d7SDag-Erling Smørgrav } 1558*7b5038d7SDag-Erling Smørgrav /* jump to rdata section (PAST the rdata length field, otherwise 1559*7b5038d7SDag-Erling Smørgrav rrs with different lengths might be sorted erroneously */ 1560*7b5038d7SDag-Erling Smørgrav offset += 11; 1561*7b5038d7SDag-Erling Smørgrav min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len; 1562*7b5038d7SDag-Erling Smørgrav /* Compare RRs RDATA byte for byte. */ 1563*7b5038d7SDag-Erling Smørgrav for(i = offset; i < min_len; i++) { 1564*7b5038d7SDag-Erling Smørgrav if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) { 1565*7b5038d7SDag-Erling Smørgrav return -1; 1566*7b5038d7SDag-Erling Smørgrav } else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) { 1567*7b5038d7SDag-Erling Smørgrav return +1; 1568*7b5038d7SDag-Erling Smørgrav } 1569*7b5038d7SDag-Erling Smørgrav } 1570*7b5038d7SDag-Erling Smørgrav 1571*7b5038d7SDag-Erling Smørgrav /* If both RDATAs are the same up to min_len, then the shorter one sorts first. */ 1572*7b5038d7SDag-Erling Smørgrav if (rr1_len < rr2_len) { 1573*7b5038d7SDag-Erling Smørgrav return -1; 1574*7b5038d7SDag-Erling Smørgrav } else if (rr1_len > rr2_len) { 1575*7b5038d7SDag-Erling Smørgrav return +1; 1576*7b5038d7SDag-Erling Smørgrav } 1577*7b5038d7SDag-Erling Smørgrav /* The RDATAs are equal. */ 1578*7b5038d7SDag-Erling Smørgrav return 0; 1579*7b5038d7SDag-Erling Smørgrav 1580*7b5038d7SDag-Erling Smørgrav } 1581*7b5038d7SDag-Erling Smørgrav 1582*7b5038d7SDag-Erling Smørgrav int 1583*7b5038d7SDag-Erling Smørgrav ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2) 1584*7b5038d7SDag-Erling Smørgrav { 1585*7b5038d7SDag-Erling Smørgrav int result; 1586*7b5038d7SDag-Erling Smørgrav size_t rr1_len, rr2_len; 1587*7b5038d7SDag-Erling Smørgrav 1588*7b5038d7SDag-Erling Smørgrav ldns_buffer *rr1_buf; 1589*7b5038d7SDag-Erling Smørgrav ldns_buffer *rr2_buf; 1590*7b5038d7SDag-Erling Smørgrav 1591*7b5038d7SDag-Erling Smørgrav result = ldns_rr_compare_no_rdata(rr1, rr2); 1592*7b5038d7SDag-Erling Smørgrav if (result == 0) { 1593*7b5038d7SDag-Erling Smørgrav rr1_len = ldns_rr_uncompressed_size(rr1); 1594*7b5038d7SDag-Erling Smørgrav rr2_len = ldns_rr_uncompressed_size(rr2); 1595*7b5038d7SDag-Erling Smørgrav 1596*7b5038d7SDag-Erling Smørgrav rr1_buf = ldns_buffer_new(rr1_len); 1597*7b5038d7SDag-Erling Smørgrav rr2_buf = ldns_buffer_new(rr2_len); 1598*7b5038d7SDag-Erling Smørgrav 1599*7b5038d7SDag-Erling Smørgrav if (ldns_rr2buffer_wire_canonical(rr1_buf, 1600*7b5038d7SDag-Erling Smørgrav rr1, 1601*7b5038d7SDag-Erling Smørgrav LDNS_SECTION_ANY) 1602*7b5038d7SDag-Erling Smørgrav != LDNS_STATUS_OK) { 1603*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr1_buf); 1604*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr2_buf); 1605*7b5038d7SDag-Erling Smørgrav return 0; 1606*7b5038d7SDag-Erling Smørgrav } 1607*7b5038d7SDag-Erling Smørgrav if (ldns_rr2buffer_wire_canonical(rr2_buf, 1608*7b5038d7SDag-Erling Smørgrav rr2, 1609*7b5038d7SDag-Erling Smørgrav LDNS_SECTION_ANY) 1610*7b5038d7SDag-Erling Smørgrav != LDNS_STATUS_OK) { 1611*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr1_buf); 1612*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr2_buf); 1613*7b5038d7SDag-Erling Smørgrav return 0; 1614*7b5038d7SDag-Erling Smørgrav } 1615*7b5038d7SDag-Erling Smørgrav 1616*7b5038d7SDag-Erling Smørgrav result = ldns_rr_compare_wire(rr1_buf, rr2_buf); 1617*7b5038d7SDag-Erling Smørgrav 1618*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr1_buf); 1619*7b5038d7SDag-Erling Smørgrav ldns_buffer_free(rr2_buf); 1620*7b5038d7SDag-Erling Smørgrav } 1621*7b5038d7SDag-Erling Smørgrav 1622*7b5038d7SDag-Erling Smørgrav return result; 1623*7b5038d7SDag-Erling Smørgrav } 1624*7b5038d7SDag-Erling Smørgrav 1625*7b5038d7SDag-Erling Smørgrav /* convert dnskey to a ds with the given algorithm, 1626*7b5038d7SDag-Erling Smørgrav * then compare the result with the given ds */ 1627*7b5038d7SDag-Erling Smørgrav static int 1628*7b5038d7SDag-Erling Smørgrav ldns_rr_compare_ds_dnskey(ldns_rr *ds, 1629*7b5038d7SDag-Erling Smørgrav ldns_rr *dnskey) 1630*7b5038d7SDag-Erling Smørgrav { 1631*7b5038d7SDag-Erling Smørgrav ldns_rr *ds_gen; 1632*7b5038d7SDag-Erling Smørgrav bool result = false; 1633*7b5038d7SDag-Erling Smørgrav ldns_hash algo; 1634*7b5038d7SDag-Erling Smørgrav 1635*7b5038d7SDag-Erling Smørgrav if (!dnskey || !ds || 1636*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(ds) != LDNS_RR_TYPE_DS || 1637*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(dnskey) != LDNS_RR_TYPE_DNSKEY) { 1638*7b5038d7SDag-Erling Smørgrav return false; 1639*7b5038d7SDag-Erling Smørgrav } 1640*7b5038d7SDag-Erling Smørgrav 1641*7b5038d7SDag-Erling Smørgrav if (ldns_rr_rdf(ds, 2) == NULL) { 1642*7b5038d7SDag-Erling Smørgrav return false; 1643*7b5038d7SDag-Erling Smørgrav } 1644*7b5038d7SDag-Erling Smørgrav algo = ldns_rdf2native_int8(ldns_rr_rdf(ds, 2)); 1645*7b5038d7SDag-Erling Smørgrav 1646*7b5038d7SDag-Erling Smørgrav ds_gen = ldns_key_rr2ds(dnskey, algo); 1647*7b5038d7SDag-Erling Smørgrav if (ds_gen) { 1648*7b5038d7SDag-Erling Smørgrav result = ldns_rr_compare(ds, ds_gen) == 0; 1649*7b5038d7SDag-Erling Smørgrav ldns_rr_free(ds_gen); 1650*7b5038d7SDag-Erling Smørgrav } 1651*7b5038d7SDag-Erling Smørgrav return result; 1652*7b5038d7SDag-Erling Smørgrav } 1653*7b5038d7SDag-Erling Smørgrav 1654*7b5038d7SDag-Erling Smørgrav bool 1655*7b5038d7SDag-Erling Smørgrav ldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2) 1656*7b5038d7SDag-Erling Smørgrav { 1657*7b5038d7SDag-Erling Smørgrav bool result; 1658*7b5038d7SDag-Erling Smørgrav ldns_rr *rr1 = ldns_rr_clone(orr1); 1659*7b5038d7SDag-Erling Smørgrav ldns_rr *rr2 = ldns_rr_clone(orr2); 1660*7b5038d7SDag-Erling Smørgrav 1661*7b5038d7SDag-Erling Smørgrav /* set ttls to zero */ 1662*7b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(rr1, 0); 1663*7b5038d7SDag-Erling Smørgrav ldns_rr_set_ttl(rr2, 0); 1664*7b5038d7SDag-Erling Smørgrav 1665*7b5038d7SDag-Erling Smørgrav if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DS && 1666*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DNSKEY) { 1667*7b5038d7SDag-Erling Smørgrav result = ldns_rr_compare_ds_dnskey(rr1, rr2); 1668*7b5038d7SDag-Erling Smørgrav } else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DNSKEY && 1669*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DS) { 1670*7b5038d7SDag-Erling Smørgrav result = ldns_rr_compare_ds_dnskey(rr2, rr1); 1671*7b5038d7SDag-Erling Smørgrav } else { 1672*7b5038d7SDag-Erling Smørgrav result = (ldns_rr_compare(rr1, rr2) == 0); 1673*7b5038d7SDag-Erling Smørgrav } 1674*7b5038d7SDag-Erling Smørgrav 1675*7b5038d7SDag-Erling Smørgrav ldns_rr_free(rr1); 1676*7b5038d7SDag-Erling Smørgrav ldns_rr_free(rr2); 1677*7b5038d7SDag-Erling Smørgrav 1678*7b5038d7SDag-Erling Smørgrav return result; 1679*7b5038d7SDag-Erling Smørgrav } 1680*7b5038d7SDag-Erling Smørgrav 1681*7b5038d7SDag-Erling Smørgrav int 1682*7b5038d7SDag-Erling Smørgrav ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2) 1683*7b5038d7SDag-Erling Smørgrav { 1684*7b5038d7SDag-Erling Smørgrav size_t i = 0; 1685*7b5038d7SDag-Erling Smørgrav int rr_cmp; 1686*7b5038d7SDag-Erling Smørgrav 1687*7b5038d7SDag-Erling Smørgrav assert(rrl1 != NULL); 1688*7b5038d7SDag-Erling Smørgrav assert(rrl2 != NULL); 1689*7b5038d7SDag-Erling Smørgrav 1690*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_list_rr_count(rrl1) && i < ldns_rr_list_rr_count(rrl2); i++) { 1691*7b5038d7SDag-Erling Smørgrav rr_cmp = ldns_rr_compare(ldns_rr_list_rr(rrl1, i), ldns_rr_list_rr(rrl2, i)); 1692*7b5038d7SDag-Erling Smørgrav if (rr_cmp != 0) { 1693*7b5038d7SDag-Erling Smørgrav return rr_cmp; 1694*7b5038d7SDag-Erling Smørgrav } 1695*7b5038d7SDag-Erling Smørgrav } 1696*7b5038d7SDag-Erling Smørgrav 1697*7b5038d7SDag-Erling Smørgrav if (i == ldns_rr_list_rr_count(rrl1) && 1698*7b5038d7SDag-Erling Smørgrav i != ldns_rr_list_rr_count(rrl2)) { 1699*7b5038d7SDag-Erling Smørgrav return 1; 1700*7b5038d7SDag-Erling Smørgrav } else if (i == ldns_rr_list_rr_count(rrl2) && 1701*7b5038d7SDag-Erling Smørgrav i != ldns_rr_list_rr_count(rrl1)) { 1702*7b5038d7SDag-Erling Smørgrav return -1; 1703*7b5038d7SDag-Erling Smørgrav } else { 1704*7b5038d7SDag-Erling Smørgrav return 0; 1705*7b5038d7SDag-Erling Smørgrav } 1706*7b5038d7SDag-Erling Smørgrav } 1707*7b5038d7SDag-Erling Smørgrav 1708*7b5038d7SDag-Erling Smørgrav size_t 1709*7b5038d7SDag-Erling Smørgrav ldns_rr_uncompressed_size(const ldns_rr *r) 1710*7b5038d7SDag-Erling Smørgrav { 1711*7b5038d7SDag-Erling Smørgrav size_t rrsize; 1712*7b5038d7SDag-Erling Smørgrav size_t i; 1713*7b5038d7SDag-Erling Smørgrav 1714*7b5038d7SDag-Erling Smørgrav rrsize = 0; 1715*7b5038d7SDag-Erling Smørgrav /* add all the rdf sizes */ 1716*7b5038d7SDag-Erling Smørgrav for(i = 0; i < ldns_rr_rd_count(r); i++) { 1717*7b5038d7SDag-Erling Smørgrav rrsize += ldns_rdf_size(ldns_rr_rdf(r, i)); 1718*7b5038d7SDag-Erling Smørgrav } 1719*7b5038d7SDag-Erling Smørgrav /* ownername */ 1720*7b5038d7SDag-Erling Smørgrav rrsize += ldns_rdf_size(ldns_rr_owner(r)); 1721*7b5038d7SDag-Erling Smørgrav rrsize += LDNS_RR_OVERHEAD; 1722*7b5038d7SDag-Erling Smørgrav return rrsize; 1723*7b5038d7SDag-Erling Smørgrav } 1724*7b5038d7SDag-Erling Smørgrav 1725*7b5038d7SDag-Erling Smørgrav void 1726*7b5038d7SDag-Erling Smørgrav ldns_rr2canonical(ldns_rr *rr) 1727*7b5038d7SDag-Erling Smørgrav { 1728*7b5038d7SDag-Erling Smørgrav uint16_t i; 1729*7b5038d7SDag-Erling Smørgrav 1730*7b5038d7SDag-Erling Smørgrav if (!rr) { 1731*7b5038d7SDag-Erling Smørgrav return; 1732*7b5038d7SDag-Erling Smørgrav } 1733*7b5038d7SDag-Erling Smørgrav 1734*7b5038d7SDag-Erling Smørgrav ldns_dname2canonical(ldns_rr_owner(rr)); 1735*7b5038d7SDag-Erling Smørgrav 1736*7b5038d7SDag-Erling Smørgrav /* 1737*7b5038d7SDag-Erling Smørgrav * lowercase the rdata dnames if the rr type is one 1738*7b5038d7SDag-Erling Smørgrav * of the list in chapter 7 of RFC3597 1739*7b5038d7SDag-Erling Smørgrav * Also added RRSIG, because a "Signer's Name" should be canonicalized 1740*7b5038d7SDag-Erling Smørgrav * too. See dnssec-bis-updates-16. We can add it to this list because 1741*7b5038d7SDag-Erling Smørgrav * the "Signer's Name" is the only dname type rdata field in a RRSIG. 1742*7b5038d7SDag-Erling Smørgrav */ 1743*7b5038d7SDag-Erling Smørgrav switch(ldns_rr_get_type(rr)) { 1744*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_NS: 1745*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_MD: 1746*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_MF: 1747*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_CNAME: 1748*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_SOA: 1749*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_MB: 1750*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_MG: 1751*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_MR: 1752*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_PTR: 1753*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_MINFO: 1754*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_MX: 1755*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_RP: 1756*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_AFSDB: 1757*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_RT: 1758*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_SIG: 1759*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_PX: 1760*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_NXT: 1761*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_NAPTR: 1762*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_KX: 1763*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_SRV: 1764*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_DNAME: 1765*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_A6: 1766*7b5038d7SDag-Erling Smørgrav case LDNS_RR_TYPE_RRSIG: 1767*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_rd_count(rr); i++) { 1768*7b5038d7SDag-Erling Smørgrav ldns_dname2canonical(ldns_rr_rdf(rr, i)); 1769*7b5038d7SDag-Erling Smørgrav } 1770*7b5038d7SDag-Erling Smørgrav return; 1771*7b5038d7SDag-Erling Smørgrav default: 1772*7b5038d7SDag-Erling Smørgrav /* do nothing */ 1773*7b5038d7SDag-Erling Smørgrav return; 1774*7b5038d7SDag-Erling Smørgrav } 1775*7b5038d7SDag-Erling Smørgrav } 1776*7b5038d7SDag-Erling Smørgrav 1777*7b5038d7SDag-Erling Smørgrav void 1778*7b5038d7SDag-Erling Smørgrav ldns_rr_list2canonical(ldns_rr_list *rr_list) 1779*7b5038d7SDag-Erling Smørgrav { 1780*7b5038d7SDag-Erling Smørgrav size_t i; 1781*7b5038d7SDag-Erling Smørgrav for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { 1782*7b5038d7SDag-Erling Smørgrav ldns_rr2canonical(ldns_rr_list_rr(rr_list, i)); 1783*7b5038d7SDag-Erling Smørgrav } 1784*7b5038d7SDag-Erling Smørgrav } 1785*7b5038d7SDag-Erling Smørgrav 1786*7b5038d7SDag-Erling Smørgrav uint8_t 1787*7b5038d7SDag-Erling Smørgrav ldns_rr_label_count(ldns_rr *rr) 1788*7b5038d7SDag-Erling Smørgrav { 1789*7b5038d7SDag-Erling Smørgrav if (!rr) { 1790*7b5038d7SDag-Erling Smørgrav return 0; 1791*7b5038d7SDag-Erling Smørgrav } 1792*7b5038d7SDag-Erling Smørgrav return ldns_dname_label_count( 1793*7b5038d7SDag-Erling Smørgrav ldns_rr_owner(rr)); 1794*7b5038d7SDag-Erling Smørgrav } 1795*7b5038d7SDag-Erling Smørgrav 1796*7b5038d7SDag-Erling Smørgrav /** \cond */ 1797*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; 1798*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A }; 1799*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ns_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1800*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_md_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1801*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mf_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1802*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_cname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1803*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_soa_wireformat[] = { 1804*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_INT32, 1805*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, 1806*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_PERIOD 1807*7b5038d7SDag-Erling Smørgrav }; 1808*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mb_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1809*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mg_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1810*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1811*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_wks_wireformat[] = { 1812*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_A, LDNS_RDF_TYPE_WKS 1813*7b5038d7SDag-Erling Smørgrav }; 1814*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ptr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1815*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_hinfo_wireformat[] = { 1816*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR 1817*7b5038d7SDag-Erling Smørgrav }; 1818*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_minfo_wireformat[] = { 1819*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1820*7b5038d7SDag-Erling Smørgrav }; 1821*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_mx_wireformat[] = { 1822*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1823*7b5038d7SDag-Erling Smørgrav }; 1824*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rp_wireformat[] = { 1825*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1826*7b5038d7SDag-Erling Smørgrav }; 1827*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_afsdb_wireformat[] = { 1828*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1829*7b5038d7SDag-Erling Smørgrav }; 1830*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_x25_wireformat[] = { LDNS_RDF_TYPE_STR }; 1831*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_isdn_wireformat[] = { 1832*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR 1833*7b5038d7SDag-Erling Smørgrav }; 1834*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rt_wireformat[] = { 1835*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1836*7b5038d7SDag-Erling Smørgrav }; 1837*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsap_wireformat[] = { 1838*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_NSAP 1839*7b5038d7SDag-Erling Smørgrav }; 1840*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsap_ptr_wireformat[] = { 1841*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_STR 1842*7b5038d7SDag-Erling Smørgrav }; 1843*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sig_wireformat[] = { 1844*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, 1845*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, 1846*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 1847*7b5038d7SDag-Erling Smørgrav }; 1848*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_key_wireformat[] = { 1849*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 1850*7b5038d7SDag-Erling Smørgrav }; 1851*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_px_wireformat[] = { 1852*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1853*7b5038d7SDag-Erling Smørgrav }; 1854*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_gpos_wireformat[] = { 1855*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_STR, 1856*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_STR, 1857*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_STR 1858*7b5038d7SDag-Erling Smørgrav }; 1859*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA }; 1860*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC }; 1861*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nxt_wireformat[] = { 1862*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_UNKNOWN 1863*7b5038d7SDag-Erling Smørgrav }; 1864*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_eid_wireformat[] = { 1865*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_HEX 1866*7b5038d7SDag-Erling Smørgrav }; 1867*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nimloc_wireformat[] = { 1868*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_HEX 1869*7b5038d7SDag-Erling Smørgrav }; 1870*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_srv_wireformat[] = { 1871*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1872*7b5038d7SDag-Erling Smørgrav }; 1873*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_atma_wireformat[] = { 1874*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_ATMA 1875*7b5038d7SDag-Erling Smørgrav }; 1876*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_naptr_wireformat[] = { 1877*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_DNAME 1878*7b5038d7SDag-Erling Smørgrav }; 1879*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_kx_wireformat[] = { 1880*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME 1881*7b5038d7SDag-Erling Smørgrav }; 1882*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_cert_wireformat[] = { 1883*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_CERT_ALG, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_B64 1884*7b5038d7SDag-Erling Smørgrav }; 1885*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_a6_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; 1886*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; 1887*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sink_wireformat[] = { LDNS_RDF_TYPE_INT8, 1888*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 1889*7b5038d7SDag-Erling Smørgrav }; 1890*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_apl_wireformat[] = { 1891*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_APL 1892*7b5038d7SDag-Erling Smørgrav }; 1893*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ds_wireformat[] = { 1894*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX 1895*7b5038d7SDag-Erling Smørgrav }; 1896*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_sshfp_wireformat[] = { 1897*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX 1898*7b5038d7SDag-Erling Smørgrav }; 1899*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_ipseckey_wireformat[] = { 1900*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_IPSECKEY 1901*7b5038d7SDag-Erling Smørgrav }; 1902*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_rrsig_wireformat[] = { 1903*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, 1904*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 1905*7b5038d7SDag-Erling Smørgrav }; 1906*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec_wireformat[] = { 1907*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_NSEC 1908*7b5038d7SDag-Erling Smørgrav }; 1909*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dhcid_wireformat[] = { 1910*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_B64 1911*7b5038d7SDag-Erling Smørgrav }; 1912*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_talink_wireformat[] = { 1913*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME 1914*7b5038d7SDag-Erling Smørgrav }; 1915*7b5038d7SDag-Erling Smørgrav /* nsec3 is some vars, followed by same type of data of nsec */ 1916*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec3_wireformat[] = { 1917*7b5038d7SDag-Erling Smørgrav /* LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/ 1918*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC3_SALT, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC 1919*7b5038d7SDag-Erling Smørgrav }; 1920*7b5038d7SDag-Erling Smørgrav 1921*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_nsec3param_wireformat[] = { 1922*7b5038d7SDag-Erling Smørgrav /* LDNS_RDF_TYPE_NSEC3_PARAMS_VARS*/ 1923*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT8, 1924*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT8, 1925*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, 1926*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_NSEC3_SALT 1927*7b5038d7SDag-Erling Smørgrav }; 1928*7b5038d7SDag-Erling Smørgrav 1929*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_dnskey_wireformat[] = { 1930*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, 1931*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT8, 1932*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_ALG, 1933*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_B64 1934*7b5038d7SDag-Erling Smørgrav }; 1935*7b5038d7SDag-Erling Smørgrav static const ldns_rdf_type type_tsig_wireformat[] = { 1936*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_DNAME, 1937*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_TSIGTIME, 1938*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, 1939*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16_DATA, 1940*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, 1941*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16, 1942*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT16_DATA 1943*7b5038d7SDag-Erling Smørgrav }; 1944*7b5038d7SDag-Erling Smørgrav /** \endcond */ 1945*7b5038d7SDag-Erling Smørgrav 1946*7b5038d7SDag-Erling Smørgrav /** \cond */ 1947*7b5038d7SDag-Erling Smørgrav /* All RR's defined in 1035 are well known and can thus 1948*7b5038d7SDag-Erling Smørgrav * be compressed. See RFC3597. These RR's are: 1949*7b5038d7SDag-Erling Smørgrav * CNAME HINFO MB MD MF MG MINFO MR MX NULL NS PTR SOA TXT 1950*7b5038d7SDag-Erling Smørgrav */ 1951*7b5038d7SDag-Erling Smørgrav static ldns_rr_descriptor rdata_field_descriptors[] = { 1952*7b5038d7SDag-Erling Smørgrav /* 0 */ 1953*7b5038d7SDag-Erling Smørgrav { 0, NULL, 0, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1954*7b5038d7SDag-Erling Smørgrav /* 1 */ 1955*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_A, "A", 1, 1, type_a_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1956*7b5038d7SDag-Erling Smørgrav /* 2 */ 1957*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NS, "NS", 1, 1, type_ns_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1958*7b5038d7SDag-Erling Smørgrav /* 3 */ 1959*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_MD, "MD", 1, 1, type_md_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1960*7b5038d7SDag-Erling Smørgrav /* 4 */ 1961*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_MF, "MF", 1, 1, type_mf_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1962*7b5038d7SDag-Erling Smørgrav /* 5 */ 1963*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1964*7b5038d7SDag-Erling Smørgrav /* 6 */ 1965*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, 1966*7b5038d7SDag-Erling Smørgrav /* 7 */ 1967*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_MB, "MB", 1, 1, type_mb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1968*7b5038d7SDag-Erling Smørgrav /* 8 */ 1969*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_MG, "MG", 1, 1, type_mg_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1970*7b5038d7SDag-Erling Smørgrav /* 9 */ 1971*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_MR, "MR", 1, 1, type_mr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1972*7b5038d7SDag-Erling Smørgrav /* 10 */ 1973*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "NULL", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1974*7b5038d7SDag-Erling Smørgrav /* 11 */ 1975*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1976*7b5038d7SDag-Erling Smørgrav /* 12 */ 1977*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1978*7b5038d7SDag-Erling Smørgrav /* 13 */ 1979*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1980*7b5038d7SDag-Erling Smørgrav /* 14 */ 1981*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, 1982*7b5038d7SDag-Erling Smørgrav /* 15 */ 1983*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_MX, "MX", 2, 2, type_mx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, 1984*7b5038d7SDag-Erling Smørgrav /* 16 */ 1985*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_TXT, "TXT", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, 1986*7b5038d7SDag-Erling Smørgrav /* 17 */ 1987*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_RP, "RP", 2, 2, type_rp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, 1988*7b5038d7SDag-Erling Smørgrav /* 18 */ 1989*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 1990*7b5038d7SDag-Erling Smørgrav /* 19 */ 1991*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_X25, "X25", 1, 1, type_x25_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1992*7b5038d7SDag-Erling Smørgrav /* 20 */ 1993*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1994*7b5038d7SDag-Erling Smørgrav /* 21 */ 1995*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_RT, "RT", 2, 2, type_rt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 1996*7b5038d7SDag-Erling Smørgrav /* 22 */ 1997*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NSAP, "NSAP", 1, 1, type_nsap_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 1998*7b5038d7SDag-Erling Smørgrav /* 23 */ 1999*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NSAP_PTR, "NSAP-PTR", 1, 1, type_nsap_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2000*7b5038d7SDag-Erling Smørgrav /* 24 */ 2001*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2002*7b5038d7SDag-Erling Smørgrav /* 25 */ 2003*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_KEY, "KEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2004*7b5038d7SDag-Erling Smørgrav /* 26 */ 2005*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_PX, "PX", 3, 3, type_px_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, 2006*7b5038d7SDag-Erling Smørgrav /* 27 */ 2007*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_GPOS, "GPOS", 1, 1, type_gpos_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2008*7b5038d7SDag-Erling Smørgrav /* 28 */ 2009*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2010*7b5038d7SDag-Erling Smørgrav /* 29 */ 2011*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2012*7b5038d7SDag-Erling Smørgrav /* 30 */ 2013*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2014*7b5038d7SDag-Erling Smørgrav /* 31 */ 2015*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_EID, "EID", 1, 1, type_eid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2016*7b5038d7SDag-Erling Smørgrav /* 32 */ 2017*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NIMLOC, "NIMLOC", 1, 1, type_nimloc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2018*7b5038d7SDag-Erling Smørgrav /* 33 */ 2019*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2020*7b5038d7SDag-Erling Smørgrav /* 34 */ 2021*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_ATMA, "ATMA", 1, 1, type_atma_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2022*7b5038d7SDag-Erling Smørgrav /* 35 */ 2023*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2024*7b5038d7SDag-Erling Smørgrav /* 36 */ 2025*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_KX, "KX", 2, 2, type_kx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2026*7b5038d7SDag-Erling Smørgrav /* 37 */ 2027*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2028*7b5038d7SDag-Erling Smørgrav /* 38 */ 2029*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_A6, "A6", 1, 1, type_a6_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2030*7b5038d7SDag-Erling Smørgrav /* 39 */ 2031*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2032*7b5038d7SDag-Erling Smørgrav /* 40 */ 2033*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_SINK, "SINK", 1, 1, type_sink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2034*7b5038d7SDag-Erling Smørgrav /* 41 */ 2035*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2036*7b5038d7SDag-Erling Smørgrav /* 42 */ 2037*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL, LDNS_RR_NO_COMPRESS, 0 }, 2038*7b5038d7SDag-Erling Smørgrav /* 43 */ 2039*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2040*7b5038d7SDag-Erling Smørgrav /* 44 */ 2041*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2042*7b5038d7SDag-Erling Smørgrav /* 45 */ 2043*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_IPSECKEY, "IPSECKEY", 1, 1, type_ipseckey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2044*7b5038d7SDag-Erling Smørgrav /* 46 */ 2045*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, 2046*7b5038d7SDag-Erling Smørgrav /* 47 */ 2047*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NSEC, "NSEC", 1, 2, type_nsec_wireformat, LDNS_RDF_TYPE_NSEC, LDNS_RR_NO_COMPRESS, 1 }, 2048*7b5038d7SDag-Erling Smørgrav /* 48 */ 2049*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2050*7b5038d7SDag-Erling Smørgrav /* 49 */ 2051*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_DHCID, "DHCID", 1, 1, type_dhcid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2052*7b5038d7SDag-Erling Smørgrav /* 50 */ 2053*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NSEC3, "NSEC3", 5, 6, type_nsec3_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2054*7b5038d7SDag-Erling Smørgrav /* 51 */ 2055*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2056*7b5038d7SDag-Erling Smørgrav /* 52 */ 2057*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE52", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2058*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE53", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2059*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2060*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE55", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2061*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE56", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2062*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE57", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2063*7b5038d7SDag-Erling Smørgrav /* 58 */ 2064*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_TALINK, "TALINK", 2, 2, type_talink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, 2065*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE59", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2066*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE60", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2067*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE61", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2068*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE62", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2069*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE63", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2070*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2071*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2072*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2073*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2074*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2075*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE69", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2076*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE70", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2077*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE71", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2078*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE72", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2079*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE73", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2080*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE74", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2081*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE75", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2082*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE76", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2083*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE77", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2084*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE78", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2085*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE79", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2086*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE80", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2087*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE81", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2088*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE82", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2089*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE83", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2090*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE84", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2091*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE85", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2092*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE86", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2093*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE87", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2094*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE88", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2095*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE89", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2096*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE90", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2097*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE91", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2098*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE92", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2099*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE93", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2100*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE94", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2101*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE95", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2102*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE96", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2103*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE97", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2104*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE98", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2105*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_SPF, "SPF", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, 2106*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE100", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2107*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE101", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2108*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE102", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2109*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE103", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2110*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE104", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2111*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE105", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2112*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE106", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2113*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE107", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2114*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE108", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2115*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE109", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2116*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE110", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2117*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE111", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2118*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE112", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2119*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE113", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2120*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE114", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2121*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE115", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2122*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE116", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2123*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE117", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2124*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE118", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2125*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE119", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2126*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE120", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2127*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE121", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2128*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE122", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2129*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE123", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2130*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE124", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2131*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE125", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2132*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE126", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2133*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE127", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2134*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE128", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2135*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE129", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2136*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE130", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2137*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE131", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2138*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE132", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2139*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE133", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2140*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE134", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2141*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE135", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2142*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE136", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2143*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE137", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2144*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE138", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2145*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE139", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2146*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE140", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2147*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE141", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2148*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE142", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2149*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE143", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2150*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE144", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2151*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE145", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2152*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE146", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2153*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE147", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2154*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE148", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2155*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE149", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2156*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE150", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2157*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE151", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2158*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE152", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2159*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE153", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2160*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE154", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2161*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE155", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2162*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE156", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2163*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE157", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2164*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE158", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2165*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE159", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2166*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE160", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2167*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE161", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2168*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE162", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2169*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE163", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2170*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE164", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2171*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE165", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2172*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE166", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2173*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE167", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2174*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE168", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2175*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE169", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2176*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE170", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2177*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE171", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2178*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE172", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2179*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE173", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2180*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE174", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2181*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE175", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2182*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE176", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2183*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE177", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2184*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE178", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2185*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE179", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2186*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE180", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2187*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE181", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2188*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE182", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2189*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE183", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2190*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE184", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2191*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE185", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2192*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE186", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2193*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE187", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2194*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE188", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2195*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE189", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2196*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE190", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2197*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE191", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2198*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE192", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2199*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE193", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2200*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE194", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2201*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE195", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2202*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE196", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2203*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE197", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2204*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE198", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2205*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE199", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2206*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE200", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2207*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE201", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2208*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE202", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2209*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE203", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2210*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE204", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2211*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE205", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2212*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE206", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2213*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE207", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2214*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE208", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2215*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE209", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2216*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE210", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2217*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE211", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2218*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE212", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2219*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE213", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2220*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE214", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2221*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE215", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2222*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE216", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2223*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE217", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2224*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE218", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2225*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE219", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2226*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE220", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2227*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE221", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2228*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE222", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2229*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE223", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2230*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE224", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2231*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE225", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2232*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE226", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2233*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE227", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2234*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE228", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2235*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE229", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2236*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE230", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2237*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE231", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2238*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE232", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2239*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE233", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2240*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE234", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2241*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE235", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2242*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE236", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2243*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE237", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2244*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE238", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2245*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE239", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2246*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE240", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2247*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE241", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2248*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE242", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2249*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE243", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2250*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE244", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2251*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE245", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2252*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE246", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2253*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE247", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2254*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE248", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2255*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_NULL, "TYPE249", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2256*7b5038d7SDag-Erling Smørgrav /* LDNS_RDF_TYPE_INT16_DATA essentially takes two fields (length and data) and 2257*7b5038d7SDag-Erling Smørgrav * makes them into one. So, while in rfc 2845 is specified that a TSIG may have 2258*7b5038d7SDag-Erling Smørgrav * 8 or 9 rdata fields, by this implementation, the min/max are 7 each. 2259*7b5038d7SDag-Erling Smørgrav */ 2260*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_TSIG, "TSIG", 7, 7, type_tsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, 2261*7b5038d7SDag-Erling Smørgrav /* split in array, no longer contiguous */ 2262*7b5038d7SDag-Erling Smørgrav {LDNS_RR_TYPE_DLV, "DLV", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 } 2263*7b5038d7SDag-Erling Smørgrav }; 2264*7b5038d7SDag-Erling Smørgrav /** \endcond */ 2265*7b5038d7SDag-Erling Smørgrav 2266*7b5038d7SDag-Erling Smørgrav /** 2267*7b5038d7SDag-Erling Smørgrav * \def LDNS_RDATA_FIELD_DESCRIPTORS_COUNT 2268*7b5038d7SDag-Erling Smørgrav * computes the number of rdata fields 2269*7b5038d7SDag-Erling Smørgrav */ 2270*7b5038d7SDag-Erling Smørgrav #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \ 2271*7b5038d7SDag-Erling Smørgrav (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0])) 2272*7b5038d7SDag-Erling Smørgrav 2273*7b5038d7SDag-Erling Smørgrav const ldns_rr_descriptor * 2274*7b5038d7SDag-Erling Smørgrav ldns_rr_descript(uint16_t type) 2275*7b5038d7SDag-Erling Smørgrav { 2276*7b5038d7SDag-Erling Smørgrav size_t i; 2277*7b5038d7SDag-Erling Smørgrav if (type <= LDNS_RDATA_FIELD_DESCRIPTORS_COMMON) { 2278*7b5038d7SDag-Erling Smørgrav return &rdata_field_descriptors[type]; 2279*7b5038d7SDag-Erling Smørgrav } else { 2280*7b5038d7SDag-Erling Smørgrav /* because not all array index equals type code */ 2281*7b5038d7SDag-Erling Smørgrav for (i = LDNS_RDATA_FIELD_DESCRIPTORS_COMMON; 2282*7b5038d7SDag-Erling Smørgrav i < LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; 2283*7b5038d7SDag-Erling Smørgrav i++) { 2284*7b5038d7SDag-Erling Smørgrav if (rdata_field_descriptors[i]._type == type) { 2285*7b5038d7SDag-Erling Smørgrav return &rdata_field_descriptors[i]; 2286*7b5038d7SDag-Erling Smørgrav } 2287*7b5038d7SDag-Erling Smørgrav } 2288*7b5038d7SDag-Erling Smørgrav return &rdata_field_descriptors[0]; 2289*7b5038d7SDag-Erling Smørgrav } 2290*7b5038d7SDag-Erling Smørgrav } 2291*7b5038d7SDag-Erling Smørgrav 2292*7b5038d7SDag-Erling Smørgrav size_t 2293*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor) 2294*7b5038d7SDag-Erling Smørgrav { 2295*7b5038d7SDag-Erling Smørgrav if (descriptor) { 2296*7b5038d7SDag-Erling Smørgrav return descriptor->_minimum; 2297*7b5038d7SDag-Erling Smørgrav } else { 2298*7b5038d7SDag-Erling Smørgrav return 0; 2299*7b5038d7SDag-Erling Smørgrav } 2300*7b5038d7SDag-Erling Smørgrav } 2301*7b5038d7SDag-Erling Smørgrav 2302*7b5038d7SDag-Erling Smørgrav size_t 2303*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor) 2304*7b5038d7SDag-Erling Smørgrav { 2305*7b5038d7SDag-Erling Smørgrav if (descriptor) { 2306*7b5038d7SDag-Erling Smørgrav if (descriptor->_variable != LDNS_RDF_TYPE_NONE) { 2307*7b5038d7SDag-Erling Smørgrav /* Should really be SIZE_MAX... bad FreeBSD. */ 2308*7b5038d7SDag-Erling Smørgrav return UINT_MAX; 2309*7b5038d7SDag-Erling Smørgrav } else { 2310*7b5038d7SDag-Erling Smørgrav return descriptor->_maximum; 2311*7b5038d7SDag-Erling Smørgrav } 2312*7b5038d7SDag-Erling Smørgrav } else { 2313*7b5038d7SDag-Erling Smørgrav return 0; 2314*7b5038d7SDag-Erling Smørgrav } 2315*7b5038d7SDag-Erling Smørgrav } 2316*7b5038d7SDag-Erling Smørgrav 2317*7b5038d7SDag-Erling Smørgrav ldns_rdf_type 2318*7b5038d7SDag-Erling Smørgrav ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, 2319*7b5038d7SDag-Erling Smørgrav size_t index) 2320*7b5038d7SDag-Erling Smørgrav { 2321*7b5038d7SDag-Erling Smørgrav assert(descriptor != NULL); 2322*7b5038d7SDag-Erling Smørgrav assert(index < descriptor->_maximum 2323*7b5038d7SDag-Erling Smørgrav || descriptor->_variable != LDNS_RDF_TYPE_NONE); 2324*7b5038d7SDag-Erling Smørgrav if (index < descriptor->_maximum) { 2325*7b5038d7SDag-Erling Smørgrav return descriptor->_wireformat[index]; 2326*7b5038d7SDag-Erling Smørgrav } else { 2327*7b5038d7SDag-Erling Smørgrav return descriptor->_variable; 2328*7b5038d7SDag-Erling Smørgrav } 2329*7b5038d7SDag-Erling Smørgrav } 2330*7b5038d7SDag-Erling Smørgrav 2331*7b5038d7SDag-Erling Smørgrav ldns_rr_type 2332*7b5038d7SDag-Erling Smørgrav ldns_get_rr_type_by_name(const char *name) 2333*7b5038d7SDag-Erling Smørgrav { 2334*7b5038d7SDag-Erling Smørgrav unsigned int i; 2335*7b5038d7SDag-Erling Smørgrav const char *desc_name; 2336*7b5038d7SDag-Erling Smørgrav const ldns_rr_descriptor *desc; 2337*7b5038d7SDag-Erling Smørgrav 2338*7b5038d7SDag-Erling Smørgrav /* TYPEXX representation */ 2339*7b5038d7SDag-Erling Smørgrav if (strlen(name) > 4 && strncasecmp(name, "TYPE", 4) == 0) { 2340*7b5038d7SDag-Erling Smørgrav return atoi(name + 4); 2341*7b5038d7SDag-Erling Smørgrav } 2342*7b5038d7SDag-Erling Smørgrav 2343*7b5038d7SDag-Erling Smørgrav /* Normal types */ 2344*7b5038d7SDag-Erling Smørgrav for (i = 0; i < (unsigned int) LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; i++) { 2345*7b5038d7SDag-Erling Smørgrav desc = &rdata_field_descriptors[i]; 2346*7b5038d7SDag-Erling Smørgrav desc_name = desc->_name; 2347*7b5038d7SDag-Erling Smørgrav if(desc_name && 2348*7b5038d7SDag-Erling Smørgrav strlen(name) == strlen(desc_name) && 2349*7b5038d7SDag-Erling Smørgrav strncasecmp(name, desc_name, strlen(desc_name)) == 0) { 2350*7b5038d7SDag-Erling Smørgrav /* because not all array index equals type code */ 2351*7b5038d7SDag-Erling Smørgrav return desc->_type; 2352*7b5038d7SDag-Erling Smørgrav } 2353*7b5038d7SDag-Erling Smørgrav } 2354*7b5038d7SDag-Erling Smørgrav 2355*7b5038d7SDag-Erling Smørgrav /* special cases for query types */ 2356*7b5038d7SDag-Erling Smørgrav if (strlen(name) == 4 && strncasecmp(name, "IXFR", 4) == 0) { 2357*7b5038d7SDag-Erling Smørgrav return 251; 2358*7b5038d7SDag-Erling Smørgrav } else if (strlen(name) == 4 && strncasecmp(name, "AXFR", 4) == 0) { 2359*7b5038d7SDag-Erling Smørgrav return 252; 2360*7b5038d7SDag-Erling Smørgrav } else if (strlen(name) == 5 && strncasecmp(name, "MAILB", 5) == 0) { 2361*7b5038d7SDag-Erling Smørgrav return 253; 2362*7b5038d7SDag-Erling Smørgrav } else if (strlen(name) == 5 && strncasecmp(name, "MAILA", 5) == 0) { 2363*7b5038d7SDag-Erling Smørgrav return 254; 2364*7b5038d7SDag-Erling Smørgrav } else if (strlen(name) == 3 && strncasecmp(name, "ANY", 3) == 0) { 2365*7b5038d7SDag-Erling Smørgrav return 255; 2366*7b5038d7SDag-Erling Smørgrav } 2367*7b5038d7SDag-Erling Smørgrav 2368*7b5038d7SDag-Erling Smørgrav return 0; 2369*7b5038d7SDag-Erling Smørgrav } 2370*7b5038d7SDag-Erling Smørgrav 2371*7b5038d7SDag-Erling Smørgrav ldns_rr_class 2372*7b5038d7SDag-Erling Smørgrav ldns_get_rr_class_by_name(const char *name) 2373*7b5038d7SDag-Erling Smørgrav { 2374*7b5038d7SDag-Erling Smørgrav ldns_lookup_table *lt; 2375*7b5038d7SDag-Erling Smørgrav 2376*7b5038d7SDag-Erling Smørgrav /* CLASSXX representation */ 2377*7b5038d7SDag-Erling Smørgrav if (strlen(name) > 5 && strncasecmp(name, "CLASS", 5) == 0) { 2378*7b5038d7SDag-Erling Smørgrav return atoi(name + 5); 2379*7b5038d7SDag-Erling Smørgrav } 2380*7b5038d7SDag-Erling Smørgrav 2381*7b5038d7SDag-Erling Smørgrav /* Normal types */ 2382*7b5038d7SDag-Erling Smørgrav lt = ldns_lookup_by_name(ldns_rr_classes, name); 2383*7b5038d7SDag-Erling Smørgrav 2384*7b5038d7SDag-Erling Smørgrav if (lt) { 2385*7b5038d7SDag-Erling Smørgrav return lt->id; 2386*7b5038d7SDag-Erling Smørgrav } 2387*7b5038d7SDag-Erling Smørgrav return 0; 2388*7b5038d7SDag-Erling Smørgrav } 2389*7b5038d7SDag-Erling Smørgrav 2390*7b5038d7SDag-Erling Smørgrav 2391*7b5038d7SDag-Erling Smørgrav ldns_rr_type 2392*7b5038d7SDag-Erling Smørgrav ldns_rdf2rr_type(const ldns_rdf *rd) 2393*7b5038d7SDag-Erling Smørgrav { 2394*7b5038d7SDag-Erling Smørgrav ldns_rr_type r; 2395*7b5038d7SDag-Erling Smørgrav 2396*7b5038d7SDag-Erling Smørgrav if (!rd) { 2397*7b5038d7SDag-Erling Smørgrav return 0; 2398*7b5038d7SDag-Erling Smørgrav } 2399*7b5038d7SDag-Erling Smørgrav 2400*7b5038d7SDag-Erling Smørgrav if (ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_TYPE) { 2401*7b5038d7SDag-Erling Smørgrav return 0; 2402*7b5038d7SDag-Erling Smørgrav } 2403*7b5038d7SDag-Erling Smørgrav 2404*7b5038d7SDag-Erling Smørgrav r = (ldns_rr_type) ldns_rdf2native_int16(rd); 2405*7b5038d7SDag-Erling Smørgrav return r; 2406*7b5038d7SDag-Erling Smørgrav } 2407*7b5038d7SDag-Erling Smørgrav 2408*7b5038d7SDag-Erling Smørgrav ldns_rr_type 2409*7b5038d7SDag-Erling Smørgrav ldns_rr_list_type(const ldns_rr_list *rr_list) 2410*7b5038d7SDag-Erling Smørgrav { 2411*7b5038d7SDag-Erling Smørgrav if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) { 2412*7b5038d7SDag-Erling Smørgrav return ldns_rr_get_type(ldns_rr_list_rr(rr_list, 0)); 2413*7b5038d7SDag-Erling Smørgrav } else { 2414*7b5038d7SDag-Erling Smørgrav return 0; 2415*7b5038d7SDag-Erling Smørgrav } 2416*7b5038d7SDag-Erling Smørgrav } 2417*7b5038d7SDag-Erling Smørgrav 2418*7b5038d7SDag-Erling Smørgrav ldns_rdf * 2419*7b5038d7SDag-Erling Smørgrav ldns_rr_list_owner(const ldns_rr_list *rr_list) 2420*7b5038d7SDag-Erling Smørgrav { 2421*7b5038d7SDag-Erling Smørgrav if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) { 2422*7b5038d7SDag-Erling Smørgrav return ldns_rr_owner(ldns_rr_list_rr(rr_list, 0)); 2423*7b5038d7SDag-Erling Smørgrav } else { 2424*7b5038d7SDag-Erling Smørgrav return NULL; 2425*7b5038d7SDag-Erling Smørgrav } 2426*7b5038d7SDag-Erling Smørgrav } 2427