19 #define LDNS_SYNTAX_DATALEN 16
20 #define LDNS_TTL_DATALEN 21
21 #define LDNS_RRLIST_INIT 8
105 ldns_rr_new_frm_str_internal(
ldns_rr **newrr,
const char *str,
106 uint32_t default_ttl,
ldns_rdf *origin,
124 const char *delimiters;
128 int was_unknown_rr_format = 0;
151 if (!
new || !owner || !ttl || !clas || !rdata || !rr_buf || !rd_buf || !rd || !b64 ) {
173 if (strlen(ttl) > 0 && !isdigit((
int) ttl[0])) {
175 if (default_ttl == 0) {
178 ttl_val = default_ttl;
197 strncpy(type, ttl, strlen(ttl) + 1);
217 strncpy(type, clas, strlen(clas) + 1);
244 if (strlen(owner) <= 1 && strncmp(owner,
"@", 1) == 0) {
247 }
else if (prev && *prev) {
265 if (strlen(owner) == 0) {
342 for (r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
359 delimiters =
"\n\t ";
364 ldns_buffer_remaining(rd_buf) > 0) {
366 while (*(ldns_buffer_current(rd_buf)) ==
' ') {
367 ldns_buffer_skip(rd_buf, 1);
370 if (*(ldns_buffer_current(rd_buf)) ==
'\"') {
372 ldns_buffer_skip(rd_buf, 1);
380 while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf) &&
381 *(ldns_buffer_current(rd_buf)) ==
' ' && !quoted
383 ldns_buffer_skip(rd_buf, 1);
386 pre_data_pos = ldns_buffer_position(rd_buf);
393 rd_strlen = strlen(rd);
396 if (strncmp(rd,
"\\#", 2) == 0 && !quoted && (rd_strlen == 2 || rd[2]==
' ')) {
397 uint16_t hex_data_size;
399 uint16_t cur_hex_data_size;
401 was_unknown_rr_format = 1;
403 ldns_buffer_set_position(rd_buf, pre_data_pos);
404 delimiters =
"\n\t ";
418 hex_data_size = (uint16_t) atoi(rd);
420 hex_data_str =
LDNS_XMALLOC(
char, 2 * hex_data_size + 1);
431 cur_hex_data_size = 0;
432 while(cur_hex_data_size < 2 * hex_data_size) {
435 rd_strlen = strlen(rd);
437 if (c == -1 || (
size_t)cur_hex_data_size + rd_strlen > 2 * (
size_t)hex_data_size) {
447 strncpy(hex_data_str + cur_hex_data_size, rd, rd_strlen);
448 cur_hex_data_size += rd_strlen;
450 hex_data_str[cur_hex_data_size] =
'\0';
456 uint8_t *hex_data =
LDNS_XMALLOC(uint8_t, hex_data_size + 2);
468 ldns_write_uint16(hex_data, hex_data_size);
471 hex_data_size+2, &hex_pos);
580 if (ldns_buffer_available(rd_buf, 1)) {
581 ldns_buffer_skip(rd_buf, 1);
597 if (!question && desc && !was_unknown_rr_format &&
ldns_rr_rd_count(
new) < r_min) {
625 uint32_t default_ttl,
ldns_rdf *origin,
628 return ldns_rr_new_frm_str_internal(newrr,
640 return ldns_rr_new_frm_str_internal(newrr,
695 if (strncmp(line,
"$ORIGIN", 7) == 0 && isspace(line[7])) {
701 while (isspace(line[offset])) {
712 }
else if (strncmp(line,
"$TTL", 4) == 0 && isspace(line[4])) {
714 while (isspace(line[offset])) {
721 }
else if (strncmp(line,
"$INCLUDE", 8) == 0) {
724 if (origin && *origin) {
785 if (position < rd_count) {
924 assert(count <= rr_list->_rr_capacity);
932 return rr_list->
_rrs[nr];
942 if(!rr_list)
return NULL;
945 rr_list->
_rrs = NULL;
991 for(i = 0; i < r_rr_count; i++) {
1024 for(i = 0; i < l_rr_count; i++) {
1029 for(i = 0; i < r_rr_count; i++) {
1080 if(rr_count+1 > cap) {
1090 rr_list->
_rrs = rrs;
1124 if (rr_count == 0) {
1242 if (rr_count == 0) {
1268 for(i = 0; i < rr_count; i++) {
1404 if (rr1 == NULL && rr2 == NULL) {
1428 ldns_rr *canonical_a, *canonical_b;
1483 if(!sortables)
return;
1484 for (i = 0; i < item_count; i++) {
1503 for (i = 0; i < item_count; i++) {
1521 assert(rr1 != NULL);
1522 assert(rr2 != NULL);
1546 if (offset > rr1_len || offset > rr2_len) {
1547 if (rr1_len == rr2_len) {
1550 return ((
int) rr2_len - (
int) rr1_len);
1558 size_t rr1_len, rr2_len, min_len, i, offset;
1560 rr1_len = ldns_buffer_capacity(rr1_buf);
1561 rr2_len = ldns_buffer_capacity(rr2_buf);
1566 while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
1567 offset += *ldns_buffer_at(rr1_buf, offset) + 1;
1572 min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
1574 for(i = offset; i < min_len; i++) {
1575 if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
1577 }
else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
1583 if (rr1_len < rr2_len) {
1585 }
else if (rr1_len > rr2_len) {
1597 size_t rr1_len, rr2_len;
1639 ldns_rr_compare_ds_dnskey(
ldns_rr *ds,
1643 bool result =
false;
1646 if (!dnskey || !ds ||
1678 result = ldns_rr_compare_ds_dnskey(rr1, rr2);
1681 result = ldns_rr_compare_ds_dnskey(rr2, rr1);
1698 assert(rrl1 != NULL);
1699 assert(rrl2 != NULL);
1817 LDNS_RDF_TYPE_PERIOD
1953 LDNS_RDF_TYPE_INT16_DATA
2288 #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
2289 (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
2296 return &rdata_field_descriptors[type];
2302 if (rdata_field_descriptors[i]._type == type) {
2303 return &rdata_field_descriptors[i];
2306 return &rdata_field_descriptors[0];
2339 assert(descriptor != NULL);
2340 assert(index < descriptor->_maximum
2342 if (index < descriptor->_maximum) {
2353 const char *desc_name;
2357 if (strlen(name) > 4 && strncasecmp(name,
"TYPE", 4) == 0) {
2358 return atoi(name + 4);
2363 desc = &rdata_field_descriptors[i];
2364 desc_name = desc->
_name;
2366 strlen(name) == strlen(desc_name) &&
2367 strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
2374 if (strlen(name) == 4 && strncasecmp(name,
"IXFR", 4) == 0) {
2376 }
else if (strlen(name) == 4 && strncasecmp(name,
"AXFR", 4) == 0) {
2378 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILB", 5) == 0) {
2380 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILA", 5) == 0) {
2382 }
else if (strlen(name) == 3 && strncasecmp(name,
"ANY", 3) == 0) {
2395 if (strlen(name) > 5 && strncasecmp(name,
"CLASS", 5) == 0) {
2396 return atoi(name + 5);