19 #define LDNS_SYNTAX_DATALEN 16
20 #define LDNS_TTL_DATALEN 21
21 #define LDNS_RRLIST_INIT 8
113 ldns_rr_new_frm_str_internal(
ldns_rr **newrr,
const char *str,
114 uint32_t default_ttl,
const ldns_rdf *origin,
133 const char *delimiters;
137 int was_unknown_rr_format = 0;
150 uint16_t hex_data_size;
151 char *hex_data_str = NULL;
152 uint16_t cur_hex_data_size;
154 uint8_t *hex_data = NULL;
167 rr_buf->
_data = NULL;
170 rd_buf->
_data = NULL;
172 if (!
new || !owner || !ttl || !clas || !rdata ||
173 !rr_buf || !rd_buf || !rd || !xtok) {
194 if (strlen(ttl) > 0 && !isdigit((
int) ttl[0])) {
196 if (default_ttl == 0) {
199 ttl_val = default_ttl;
212 type_sz = strlen(ttl) + 1;
232 type_sz = strlen(clas) + 1;
262 if (strlen(owner) <= 1 && strncmp(owner,
"@", 1) == 0) {
265 }
else if (prev && *prev) {
281 if (strlen(owner) == 0) {
344 for (done =
false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
359 default : delimiters =
"\n\t ";
362 if (ldns_rdf_type_maybe_quoted(
365 ldns_buffer_remaining(rd_buf) > 0){
368 while (*(ldns_buffer_current(rd_buf)) ==
' ') {
369 ldns_buffer_skip(rd_buf, 1);
372 if (*(ldns_buffer_current(rd_buf)) ==
'\"') {
374 ldns_buffer_skip(rd_buf, 1);
389 while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
390 && *(ldns_buffer_current(rd_buf)) ==
' '
393 ldns_buffer_skip(rd_buf, 1);
396 pre_data_pos = ldns_buffer_position(rd_buf);
408 rd_strlen = strlen(rd);
411 if (strncmp(rd,
"\\#", 2) == 0 && !quoted &&
412 (rd_strlen == 2 || rd[2]==
' ')) {
414 was_unknown_rr_format = 1;
418 ldns_buffer_set_position(rd_buf, pre_data_pos);
419 delimiters =
"\n\t ";
430 hex_data_size = (uint16_t) atoi(rd);
437 cur_hex_data_size = 0;
438 while(cur_hex_data_size < 2 * hex_data_size) {
445 rd_strlen = strlen(rd);
446 if ((
size_t)cur_hex_data_size + rd_strlen >
447 2 * (
size_t)hex_data_size) {
451 strlcpy(hex_data_str + cur_hex_data_size, rd,
454 cur_hex_data_size += rd_strlen;
456 hex_data_str[cur_hex_data_size] =
'\0';
468 ldns_write_uint16(hex_data, hex_data_size);
470 hex_data + 2, hex_data_str);
472 hex_data_size + 2, &hex_pos);
490 }
else if(rd_strlen > 0 || quoted) {
500 if (r_cnt == r_max - 1) {
504 (void) strncat(rd, xtok,
531 (void) strncat(rd,
" ",
534 (void) strncat(rd, xtok,
544 (void) strncat(rd,
" ",
547 (void) strncat(rd, xtok,
582 }
else if (r && rd_strlen >= 1 && origin &&
604 if (ldns_buffer_available(rd_buf, 1)) {
605 ldns_buffer_skip(rd_buf, 1);
616 if (ldns_buffer_remaining(rd_buf) > 0) {
623 if (!question && desc && !was_unknown_rr_format &&
641 if (rd_buf && rd_buf->
_data) {
646 if (rr_buf && rr_buf->
_data) {
666 uint32_t default_ttl,
const ldns_rdf *origin,
669 return ldns_rr_new_frm_str_internal(newrr,
681 return ldns_rr_new_frm_str_internal(newrr,
691 ldns_strip_ws(
char *line)
695 for (s = line; *s && isspace((
unsigned char)*s); s++)
698 for (e = strchr(s, 0); e > s+2 && isspace((
unsigned char)e[-1]) && e[-2] !=
'\\'; e--)
751 if (strncmp(line,
"$ORIGIN", 7) == 0 && isspace((
unsigned char)line[7])) {
757 ldns_strip_ws(line + 8));
765 }
else if (strncmp(line,
"$TTL", 4) == 0 && isspace((
unsigned char)line[4])) {
768 ldns_strip_ws(line + 5), &endptr);
771 }
else if (strncmp(line,
"$INCLUDE", 8) == 0) {
773 }
else if (!*ldns_strip_ws(line)) {
777 if (origin && *origin) {
838 if (position < rd_count) {
977 assert(count <= rr_list->_rr_capacity);
985 return rr_list->
_rrs[nr];
995 if(!rr_list)
return NULL;
998 rr_list->
_rrs = NULL;
1044 for(i = 0; i < r_rr_count; i++) {
1077 for(i = 0; i < l_rr_count; i++) {
1082 for(i = 0; i < r_rr_count; i++) {
1133 if(rr_count+1 > cap) {
1143 rr_list->
_rrs = rrs;
1177 if (rr_count == 0) {
1295 if (rr_count == 0) {
1321 for(i = 0; i < rr_count; i++) {
1452 qsort_schwartz_rr_compare(
const void *a,
const void *b)
1463 ldns_rr *canonical_a, *canonical_b;
1518 if(!sortables)
return;
1519 for (i = 0; i < item_count; i++) {
1537 qsort_schwartz_rr_compare);
1538 for (i = 0; i < item_count; i++) {
1556 assert(rr1 != NULL);
1557 assert(rr2 != NULL);
1581 if (offset > rr1_len || offset > rr2_len) {
1582 if (rr1_len == rr2_len) {
1585 return ((
int) rr2_len - (
int) rr1_len);
1593 size_t rr1_len, rr2_len, min_len, i, offset;
1595 rr1_len = ldns_buffer_capacity(rr1_buf);
1596 rr2_len = ldns_buffer_capacity(rr2_buf);
1601 while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
1602 offset += *ldns_buffer_at(rr1_buf, offset) + 1;
1607 min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
1609 for(i = offset; i < min_len; i++) {
1610 if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
1612 }
else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
1618 if (rr1_len < rr2_len) {
1620 }
else if (rr1_len > rr2_len) {
1632 size_t rr1_len, rr2_len;
1674 ldns_rr_compare_ds_dnskey(
ldns_rr *ds,
1678 bool result =
false;
1681 if (!dnskey || !ds ||
1713 result = ldns_rr_compare_ds_dnskey(rr1, rr2);
1716 result = ldns_rr_compare_ds_dnskey(rr2, rr1);
1733 assert(rrl1 != NULL);
1734 assert(rrl2 != NULL);
1959 #ifdef RRTYPE_OPENPGPKEY
2060 #ifdef RRTYPE_AMTRELAY
2212 #ifdef RRTYPE_OPENPGPKEY
2461 #ifdef RRTYPE_AMTRELAY
2485 #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
2486 (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
2530 ldns_rdf_bitmap_known_rr_types_set(
ldns_rdf** rdf,
int value)
2534 uint16_t windows[256]
2543 uint8_t* data = NULL;
2546 assert(rdf != NULL);
2550 for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) {
2551 window = d->
_type >> 8;
2552 subtype = d->
_type & 0xff;
2553 if (windows[window] < subtype) {
2554 windows[window] = subtype;
2561 for (i = 0; i < 256; i++) {
2563 sz += windows[i] / 8 + 3;
2573 memset(data, value, sz);
2574 for (i = 0; i < 256; i++) {
2576 *dptr++ = (uint8_t)i;
2577 *dptr++ = (uint8_t)(windows[i] / 8 + 1);
2595 return ldns_rdf_bitmap_known_rr_types_set(rdf, 0);
2601 return ldns_rdf_bitmap_known_rr_types_set(rdf, 255);
2612 return &rdata_field_descriptors[type];
2618 if (rdata_field_descriptors[i]._type == type) {
2619 return &rdata_field_descriptors[i];
2622 return &rdata_field_descriptors[0];
2655 assert(descriptor != NULL);
2656 assert(index < descriptor->_maximum
2658 if (index < descriptor->_maximum) {
2669 const char *desc_name;
2673 if (strlen(name) > 4 && strncasecmp(name,
"TYPE", 4) == 0) {
2674 return atoi(name + 4);
2679 desc = &rdata_field_descriptors[i];
2680 desc_name = desc->
_name;
2682 strlen(name) == strlen(desc_name) &&
2683 strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
2690 if (strlen(name) == 4 && strncasecmp(name,
"IXFR", 4) == 0) {
2692 }
else if (strlen(name) == 4 && strncasecmp(name,
"AXFR", 4) == 0) {
2694 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILB", 5) == 0) {
2696 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILA", 5) == 0) {
2698 }
else if (strlen(name) == 3 && strncasecmp(name,
"ANY", 3) == 0) {
2711 if (strlen(name) > 5 && strncasecmp(name,
"CLASS", 5) == 0) {
2712 return atoi(name + 5);