19 #define LDNS_SYNTAX_DATALEN 16
20 #define LDNS_TTL_DATALEN 21
21 #define LDNS_RRLIST_INIT 8
23 #define _IS_WHITESPACE(chr) \
24 ( NULL != strchr( LDNS_PARSE_NO_NL, chr) )
26 #define _BUFFER_IS_AT_WHITESPACE(rd_buf) \
27 _IS_WHITESPACE(*(ldns_buffer_current(rd_buf)))
119 ldns_rr_new_frm_str_internal(
ldns_rr **newrr,
const char *str,
120 uint32_t default_ttl,
const ldns_rdf *origin,
140 const char *delimiters;
144 int was_unknown_rr_format = 0;
157 uint16_t hex_data_size;
158 char *hex_data_str = NULL;
159 uint16_t cur_hex_data_size;
161 uint8_t *hex_data = NULL;
174 rr_buf->
_data = NULL;
177 rd_buf->
_data = NULL;
179 if (!
new || !owner || !ttl || !clas || !rdata ||
180 !rr_buf || !rd_buf || !rd || !xtok) {
201 if (strlen(ttl) > 0 && !isdigit((
int) ttl[0])) {
203 if (default_ttl == 0) {
206 ttl_val = default_ttl;
209 *explicit_ttl =
false;
222 type_sz = strlen(ttl) + 1;
231 *explicit_ttl =
true;
245 type_sz = strlen(clas) + 1;
275 if (strncmp(owner,
"@", 1) == 0) {
278 }
else if (prev && *prev) {
294 if (strlen(owner) == 0) {
357 for (done =
false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
373 default : delimiters =
"\n\t ";
376 if (ldns_rdf_type_maybe_quoted(
379 ldns_buffer_remaining(rd_buf) > 0){
382 while (ldns_buffer_remaining(rd_buf) > 0 &&
384 ldns_buffer_skip(rd_buf, 1);
387 if (ldns_buffer_remaining(rd_buf) > 0 &&
388 *(ldns_buffer_current(rd_buf)) ==
'\"') {
390 ldns_buffer_skip(rd_buf, 1);
406 while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
410 ldns_buffer_skip(rd_buf, 1);
413 pre_data_pos = ldns_buffer_position(rd_buf);
425 rd_strlen = strlen(rd);
428 if (strncmp(rd,
"\\#", 2) == 0 && !quoted &&
431 was_unknown_rr_format = 1;
435 ldns_buffer_set_position(rd_buf, pre_data_pos);
436 delimiters =
"\n\t ";
447 hex_data_size = (uint16_t) atoi(rd);
454 cur_hex_data_size = 0;
455 while(cur_hex_data_size < 2 * hex_data_size) {
462 rd_strlen = strlen(rd);
463 if ((
size_t)cur_hex_data_size + rd_strlen >
464 2 * (
size_t)hex_data_size) {
468 strlcpy(hex_data_str + cur_hex_data_size, rd,
471 cur_hex_data_size += rd_strlen;
473 hex_data_str[cur_hex_data_size] =
'\0';
485 ldns_write_uint16(hex_data, hex_data_size);
487 hex_data + 2, hex_data_str);
489 hex_data_size + 2, &hex_pos);
507 }
else if(rd_strlen > 0 || quoted) {
517 if (r_cnt == r_max - 1) {
521 (void) strncat(rd, xtok,
548 (void) strncat(rd,
" ",
551 (void) strncat(rd, xtok,
561 (void) strncat(rd,
" ",
564 (void) strncat(rd, xtok,
599 }
else if (r && rd_strlen >= 1
627 if (ldns_buffer_remaining(rd_buf) > 0) {
634 if (!question && desc && !was_unknown_rr_format &&
652 if (rd_buf && rd_buf->
_data) {
657 if (rr_buf && rr_buf->
_data) {
677 uint32_t default_ttl,
const ldns_rdf *origin,
680 return ldns_rr_new_frm_str_internal(newrr,
693 return ldns_rr_new_frm_str_internal(newrr,
704 ldns_strip_ws(
char *line)
708 for (s = line; *s && isspace((
unsigned char)*s); s++)
711 for (e = strchr(s, 0); e > s+2 && isspace((
unsigned char)e[-1]) && e[-2] !=
'\\'; e--)
727 int *line_nr,
bool *explicit_ttl)
749 if (strncmp(line,
"$ORIGIN", 7) == 0 && isspace((
unsigned char)line[7])) {
755 ldns_strip_ws(line + 8));
763 }
else if (strncmp(line,
"$TTL", 4) == 0 && isspace((
unsigned char)line[4])) {
766 ldns_strip_ws(line + 5), &endptr);
769 }
else if (strncmp(line,
"$INCLUDE", 8) == 0) {
771 }
else if (!*ldns_strip_ws(line)) {
775 if (origin && *origin) {
776 s = ldns_rr_new_frm_str_internal(&rr, (
const char*)line,
777 ttl, *origin, prev,
false, explicit_ttl);
779 s = ldns_rr_new_frm_str_internal(&rr, (
const char*)line,
780 ttl, NULL, prev,
false, explicit_ttl);
800 prev, line_nr, NULL);
846 if (position < rd_count) {
985 assert(count <= rr_list->_rr_capacity);
993 return rr_list->
_rrs[nr];
1003 if(!rr_list)
return NULL;
1006 rr_list->
_rrs = NULL;
1052 for(i = 0; i < r_rr_count; i++) {
1085 for(i = 0; i < l_rr_count; i++) {
1090 for(i = 0; i < r_rr_count; i++) {
1141 if(rr_count+1 > cap) {
1151 rr_list->
_rrs = rrs;
1185 if (rr_count == 0) {
1304 if (rr_count == 0) {
1330 for(i = 0; i < rr_count; i++) {
1461 qsort_schwartz_rr_compare(
const void *a,
const void *b)
1472 ldns_rr *canonical_a, *canonical_b;
1527 if(!sortables)
return;
1528 for (i = 0; i < item_count; i++) {
1546 qsort_schwartz_rr_compare);
1547 for (i = 0; i < item_count; i++) {
1565 assert(rr1 != NULL);
1566 assert(rr2 != NULL);
1590 if (offset > rr1_len || offset > rr2_len) {
1591 if (rr1_len == rr2_len) {
1594 return ((
int) rr2_len - (
int) rr1_len);
1602 size_t rr1_len, rr2_len, min_len, i, offset;
1604 rr1_len = ldns_buffer_capacity(rr1_buf);
1605 rr2_len = ldns_buffer_capacity(rr2_buf);
1610 while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
1611 offset += *ldns_buffer_at(rr1_buf, offset) + 1;
1616 min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
1618 for(i = offset; i < min_len; i++) {
1619 if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
1621 }
else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
1627 if (rr1_len < rr2_len) {
1629 }
else if (rr1_len > rr2_len) {
1641 size_t rr1_len, rr2_len;
1683 ldns_rr_compare_ds_dnskey(
ldns_rr *ds,
1687 bool result =
false;
1690 if (!dnskey || !ds ||
1722 result = ldns_rr_compare_ds_dnskey(rr1, rr2);
1725 result = ldns_rr_compare_ds_dnskey(rr2, rr1);
1742 assert(rrl1 != NULL);
1743 assert(rrl2 != NULL);
1968 #ifdef RRTYPE_OPENPGPKEY
1980 #ifdef RRTYPE_SVCB_HTTPS
2075 #ifdef RRTYPE_AMTRELAY
2227 #ifdef RRTYPE_OPENPGPKEY
2237 #ifdef RRTYPE_SVCB_HTTPS
2485 #ifdef RRTYPE_AMTRELAY
2509 #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
2510 (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
2554 ldns_rdf_bitmap_known_rr_types_set(
ldns_rdf** rdf,
int value)
2558 uint16_t windows[256]
2567 uint8_t* data = NULL;
2570 assert(rdf != NULL);
2574 for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) {
2575 window = d->
_type >> 8;
2576 subtype = d->
_type & 0xff;
2577 if (windows[window] < subtype) {
2578 windows[window] = subtype;
2585 for (i = 0; i < 256; i++) {
2587 sz += windows[i] / 8 + 3;
2597 memset(data, value, sz);
2598 for (i = 0; i < 256; i++) {
2600 *dptr++ = (uint8_t)i;
2601 *dptr++ = (uint8_t)(windows[i] / 8 + 1);
2619 return ldns_rdf_bitmap_known_rr_types_set(rdf, 0);
2625 return ldns_rdf_bitmap_known_rr_types_set(rdf, 255);
2636 return &rdata_field_descriptors[type];
2642 if (rdata_field_descriptors[i]._type == type) {
2643 return &rdata_field_descriptors[i];
2646 return &rdata_field_descriptors[0];
2679 assert(descriptor != NULL);
2680 assert(index < descriptor->_maximum
2682 if (index < descriptor->_maximum) {
2693 const char *desc_name;
2697 if (strlen(name) > 4 && strncasecmp(name,
"TYPE", 4) == 0) {
2698 return atoi(name + 4);
2703 desc = &rdata_field_descriptors[i];
2704 desc_name = desc->
_name;
2706 strlen(name) == strlen(desc_name) &&
2707 strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
2714 if (strlen(name) == 4 && strncasecmp(name,
"IXFR", 4) == 0) {
2716 }
else if (strlen(name) == 4 && strncasecmp(name,
"AXFR", 4) == 0) {
2718 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILB", 5) == 0) {
2720 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILA", 5) == 0) {
2722 }
else if (strlen(name) == 3 && strncasecmp(name,
"ANY", 3) == 0) {
2735 if (strlen(name) > 5 && strncasecmp(name,
"CLASS", 5) == 0) {
2736 return atoi(name + 5);