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,
134 const char *delimiters;
138 int was_unknown_rr_format = 0;
151 uint16_t hex_data_size;
152 char *hex_data_str = NULL;
153 uint16_t cur_hex_data_size;
155 uint8_t *hex_data = NULL;
168 rr_buf->
_data = NULL;
171 rd_buf->
_data = NULL;
173 if (!
new || !owner || !ttl || !clas || !rdata ||
174 !rr_buf || !rd_buf || !rd || !xtok) {
195 if (strlen(ttl) > 0 && !isdigit((
int) ttl[0])) {
197 if (default_ttl == 0) {
200 ttl_val = default_ttl;
203 *explicit_ttl =
false;
216 type_sz = strlen(ttl) + 1;
225 *explicit_ttl =
true;
239 type_sz = strlen(clas) + 1;
269 if (strncmp(owner,
"@", 1) == 0) {
272 }
else if (prev && *prev) {
288 if (strlen(owner) == 0) {
351 for (done =
false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
367 default : delimiters =
"\n\t ";
370 if (ldns_rdf_type_maybe_quoted(
373 ldns_buffer_remaining(rd_buf) > 0){
376 while (ldns_buffer_remaining(rd_buf) > 0 &&
377 *(ldns_buffer_current(rd_buf)) ==
' ') {
378 ldns_buffer_skip(rd_buf, 1);
381 if (ldns_buffer_remaining(rd_buf) > 0 &&
382 *(ldns_buffer_current(rd_buf)) ==
'\"') {
384 ldns_buffer_skip(rd_buf, 1);
400 while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
401 && *(ldns_buffer_current(rd_buf)) ==
' '
404 ldns_buffer_skip(rd_buf, 1);
407 pre_data_pos = ldns_buffer_position(rd_buf);
419 rd_strlen = strlen(rd);
422 if (strncmp(rd,
"\\#", 2) == 0 && !quoted &&
423 (rd_strlen == 2 || rd[2]==
' ')) {
425 was_unknown_rr_format = 1;
429 ldns_buffer_set_position(rd_buf, pre_data_pos);
430 delimiters =
"\n\t ";
441 hex_data_size = (uint16_t) atoi(rd);
448 cur_hex_data_size = 0;
449 while(cur_hex_data_size < 2 * hex_data_size) {
456 rd_strlen = strlen(rd);
457 if ((
size_t)cur_hex_data_size + rd_strlen >
458 2 * (
size_t)hex_data_size) {
462 strlcpy(hex_data_str + cur_hex_data_size, rd,
465 cur_hex_data_size += rd_strlen;
467 hex_data_str[cur_hex_data_size] =
'\0';
479 ldns_write_uint16(hex_data, hex_data_size);
481 hex_data + 2, hex_data_str);
483 hex_data_size + 2, &hex_pos);
501 }
else if(rd_strlen > 0 || quoted) {
511 if (r_cnt == r_max - 1) {
515 (void) strncat(rd, xtok,
542 (void) strncat(rd,
" ",
545 (void) strncat(rd, xtok,
555 (void) strncat(rd,
" ",
558 (void) strncat(rd, xtok,
593 }
else if (r && rd_strlen >= 1
621 if (ldns_buffer_remaining(rd_buf) > 0) {
628 if (!question && desc && !was_unknown_rr_format &&
646 if (rd_buf && rd_buf->
_data) {
651 if (rr_buf && rr_buf->
_data) {
671 uint32_t default_ttl,
const ldns_rdf *origin,
674 return ldns_rr_new_frm_str_internal(newrr,
687 return ldns_rr_new_frm_str_internal(newrr,
698 ldns_strip_ws(
char *line)
702 for (s = line; *s && isspace((
unsigned char)*s); s++)
705 for (e = strchr(s, 0); e > s+2 && isspace((
unsigned char)e[-1]) && e[-2] !=
'\\'; e--)
721 int *line_nr,
bool *explicit_ttl)
741 if (strncmp(line,
"$ORIGIN", 7) == 0 && isspace((
unsigned char)line[7])) {
747 ldns_strip_ws(line + 8));
755 }
else if (strncmp(line,
"$TTL", 4) == 0 && isspace((
unsigned char)line[4])) {
758 ldns_strip_ws(line + 5), &endptr);
761 }
else if (strncmp(line,
"$INCLUDE", 8) == 0) {
763 }
else if (!*ldns_strip_ws(line)) {
767 if (origin && *origin) {
768 s = ldns_rr_new_frm_str_internal(&rr, (
const char*)line,
769 ttl, *origin, prev,
false, explicit_ttl);
771 s = ldns_rr_new_frm_str_internal(&rr, (
const char*)line,
772 ttl, NULL, prev,
false, explicit_ttl);
792 prev, line_nr, NULL);
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
1971 #ifdef RRTYPE_SVCB_HTTPS
2066 #ifdef RRTYPE_AMTRELAY
2218 #ifdef RRTYPE_OPENPGPKEY
2228 #ifdef RRTYPE_SVCB_HTTPS
2476 #ifdef RRTYPE_AMTRELAY
2500 #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
2501 (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
2545 ldns_rdf_bitmap_known_rr_types_set(
ldns_rdf** rdf,
int value)
2549 uint16_t windows[256]
2558 uint8_t* data = NULL;
2561 assert(rdf != NULL);
2565 for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) {
2566 window = d->
_type >> 8;
2567 subtype = d->
_type & 0xff;
2568 if (windows[window] < subtype) {
2569 windows[window] = subtype;
2576 for (i = 0; i < 256; i++) {
2578 sz += windows[i] / 8 + 3;
2588 memset(data, value, sz);
2589 for (i = 0; i < 256; i++) {
2591 *dptr++ = (uint8_t)i;
2592 *dptr++ = (uint8_t)(windows[i] / 8 + 1);
2610 return ldns_rdf_bitmap_known_rr_types_set(rdf, 0);
2616 return ldns_rdf_bitmap_known_rr_types_set(rdf, 255);
2627 return &rdata_field_descriptors[type];
2633 if (rdata_field_descriptors[i]._type == type) {
2634 return &rdata_field_descriptors[i];
2637 return &rdata_field_descriptors[0];
2670 assert(descriptor != NULL);
2671 assert(index < descriptor->_maximum
2673 if (index < descriptor->_maximum) {
2684 const char *desc_name;
2688 if (strlen(name) > 4 && strncasecmp(name,
"TYPE", 4) == 0) {
2689 return atoi(name + 4);
2694 desc = &rdata_field_descriptors[i];
2695 desc_name = desc->
_name;
2697 strlen(name) == strlen(desc_name) &&
2698 strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
2705 if (strlen(name) == 4 && strncasecmp(name,
"IXFR", 4) == 0) {
2707 }
else if (strlen(name) == 4 && strncasecmp(name,
"AXFR", 4) == 0) {
2709 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILB", 5) == 0) {
2711 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILA", 5) == 0) {
2713 }
else if (strlen(name) == 3 && strncasecmp(name,
"ANY", 3) == 0) {
2726 if (strlen(name) > 5 && strncasecmp(name,
"CLASS", 5) == 0) {
2727 return atoi(name + 5);