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,
132 const char *delimiters;
136 int was_unknown_rr_format = 0;
149 uint16_t hex_data_size;
150 char *hex_data_str = NULL;
151 uint16_t cur_hex_data_size;
153 uint8_t *hex_data = NULL;
166 rr_buf->
_data = NULL;
169 rd_buf->
_data = NULL;
171 if (!
new || !owner || !ttl || !clas || !rdata ||
172 !rr_buf || !rd_buf || !rd || !xtok) {
193 if (strlen(ttl) > 0 && !isdigit((
int) ttl[0])) {
195 if (default_ttl == 0) {
198 ttl_val = default_ttl;
215 strncpy(type, ttl, strlen(ttl) + 1);
234 strncpy(type, clas, strlen(clas) + 1);
259 if (strlen(owner) <= 1 && strncmp(owner,
"@", 1) == 0) {
262 }
else if (prev && *prev) {
278 if (strlen(owner) == 0) {
341 for (done =
false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
354 default : delimiters =
"\n\t ";
357 if (ldns_rdf_type_maybe_quoted(
360 ldns_buffer_remaining(rd_buf) > 0){
363 while (*(ldns_buffer_current(rd_buf)) ==
' ') {
364 ldns_buffer_skip(rd_buf, 1);
367 if (*(ldns_buffer_current(rd_buf)) ==
'\"') {
369 ldns_buffer_skip(rd_buf, 1);
384 while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
385 && *(ldns_buffer_current(rd_buf)) ==
' '
388 ldns_buffer_skip(rd_buf, 1);
391 pre_data_pos = ldns_buffer_position(rd_buf);
402 rd_strlen = strlen(rd);
405 if (strncmp(rd,
"\\#", 2) == 0 && !quoted &&
406 (rd_strlen == 2 || rd[2]==
' ')) {
408 was_unknown_rr_format = 1;
412 ldns_buffer_set_position(rd_buf, pre_data_pos);
413 delimiters =
"\n\t ";
424 hex_data_size = (uint16_t) atoi(rd);
431 cur_hex_data_size = 0;
432 while(cur_hex_data_size < 2 * hex_data_size) {
436 rd_strlen = strlen(rd);
439 (
size_t)cur_hex_data_size + rd_strlen >
440 2 * (
size_t)hex_data_size) {
445 strncpy(hex_data_str + cur_hex_data_size, rd,
448 cur_hex_data_size += rd_strlen;
450 hex_data_str[cur_hex_data_size] =
'\0';
462 ldns_write_uint16(hex_data, hex_data_size);
464 hex_data + 2, hex_data_str);
466 hex_data_size + 2, &hex_pos);
484 }
else if(rd_strlen > 0 || quoted) {
494 if (r_cnt == r_max - 1) {
498 (void) strncat(rd, xtok,
525 (void) strncat(rd,
" ",
528 (void) strncat(rd, xtok,
538 (void) strncat(rd,
" ",
541 (void) strncat(rd, xtok,
576 }
else if (r && rd_strlen >= 1 && origin &&
598 if (ldns_buffer_available(rd_buf, 1)) {
599 ldns_buffer_skip(rd_buf, 1);
610 if (ldns_buffer_remaining(rd_buf) > 0) {
617 if (!question && desc && !was_unknown_rr_format &&
635 if (rd_buf && rd_buf->
_data) {
640 if (rr_buf && rr_buf->
_data) {
660 uint32_t default_ttl,
const ldns_rdf *origin,
663 return ldns_rr_new_frm_str_internal(newrr,
675 return ldns_rr_new_frm_str_internal(newrr,
685 ldns_strip_ws(
char *line)
689 for (s = line; *s && isspace((
unsigned char)*s); s++)
692 for (e = strchr(s, 0); e > s+2 && isspace((
unsigned char)e[-1]) && e[-2] !=
'\\'; e--)
745 if (strncmp(line,
"$ORIGIN", 7) == 0 && isspace((
unsigned char)line[7])) {
751 ldns_strip_ws(line + 8));
759 }
else if (strncmp(line,
"$TTL", 4) == 0 && isspace((
unsigned char)line[4])) {
762 ldns_strip_ws(line + 5), &endptr);
765 }
else if (strncmp(line,
"$INCLUDE", 8) == 0) {
767 }
else if (!*ldns_strip_ws(line)) {
771 if (origin && *origin) {
832 if (position < rd_count) {
971 assert(count <= rr_list->_rr_capacity);
979 return rr_list->
_rrs[nr];
989 if(!rr_list)
return NULL;
992 rr_list->
_rrs = NULL;
1038 for(i = 0; i < r_rr_count; i++) {
1071 for(i = 0; i < l_rr_count; i++) {
1076 for(i = 0; i < r_rr_count; i++) {
1127 if(rr_count+1 > cap) {
1137 rr_list->
_rrs = rrs;
1171 if (rr_count == 0) {
1289 if (rr_count == 0) {
1315 for(i = 0; i < rr_count; i++) {
1446 qsort_schwartz_rr_compare(
const void *a,
const void *b)
1457 ldns_rr *canonical_a, *canonical_b;
1512 if(!sortables)
return;
1513 for (i = 0; i < item_count; i++) {
1531 qsort_schwartz_rr_compare);
1532 for (i = 0; i < item_count; i++) {
1550 assert(rr1 != NULL);
1551 assert(rr2 != NULL);
1575 if (offset > rr1_len || offset > rr2_len) {
1576 if (rr1_len == rr2_len) {
1579 return ((
int) rr2_len - (
int) rr1_len);
1587 size_t rr1_len, rr2_len, min_len, i, offset;
1589 rr1_len = ldns_buffer_capacity(rr1_buf);
1590 rr2_len = ldns_buffer_capacity(rr2_buf);
1595 while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
1596 offset += *ldns_buffer_at(rr1_buf, offset) + 1;
1601 min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
1603 for(i = offset; i < min_len; i++) {
1604 if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
1606 }
else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
1612 if (rr1_len < rr2_len) {
1614 }
else if (rr1_len > rr2_len) {
1626 size_t rr1_len, rr2_len;
1668 ldns_rr_compare_ds_dnskey(
ldns_rr *ds,
1672 bool result =
false;
1675 if (!dnskey || !ds ||
1707 result = ldns_rr_compare_ds_dnskey(rr1, rr2);
1710 result = ldns_rr_compare_ds_dnskey(rr2, rr1);
1727 assert(rrl1 != NULL);
1728 assert(rrl2 != NULL);
1953 #ifdef RRTYPE_OPENPGPKEY
2185 #ifdef RRTYPE_OPENPGPKEY
2446 #define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
2447 (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
2491 ldns_rdf_bitmap_known_rr_types_set(
ldns_rdf** rdf,
int value)
2495 uint16_t windows[256]
2504 uint8_t* data = NULL;
2507 assert(rdf != NULL);
2511 for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) {
2512 window = d->
_type >> 8;
2513 subtype = d->
_type & 0xff;
2514 if (windows[window] < subtype) {
2515 windows[window] = subtype;
2522 for (i = 0; i < 256; i++) {
2524 sz += windows[i] / 8 + 3;
2531 memset(data, value, sz);
2535 for (i = 0; i < 256; i++) {
2537 *dptr++ = (uint8_t)i;
2538 *dptr++ = (uint8_t)(windows[i] / 8 + 1);
2556 return ldns_rdf_bitmap_known_rr_types_set(rdf, 0);
2562 return ldns_rdf_bitmap_known_rr_types_set(rdf, 255);
2573 return &rdata_field_descriptors[type];
2579 if (rdata_field_descriptors[i]._type == type) {
2580 return &rdata_field_descriptors[i];
2583 return &rdata_field_descriptors[0];
2616 assert(descriptor != NULL);
2617 assert(index < descriptor->_maximum
2619 if (index < descriptor->_maximum) {
2630 const char *desc_name;
2634 if (strlen(name) > 4 && strncasecmp(name,
"TYPE", 4) == 0) {
2635 return atoi(name + 4);
2640 desc = &rdata_field_descriptors[i];
2641 desc_name = desc->
_name;
2643 strlen(name) == strlen(desc_name) &&
2644 strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
2651 if (strlen(name) == 4 && strncasecmp(name,
"IXFR", 4) == 0) {
2653 }
else if (strlen(name) == 4 && strncasecmp(name,
"AXFR", 4) == 0) {
2655 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILB", 5) == 0) {
2657 }
else if (strlen(name) == 5 && strncasecmp(name,
"MAILA", 5) == 0) {
2659 }
else if (strlen(name) == 3 && strncasecmp(name,
"ANY", 3) == 0) {
2672 if (strlen(name) > 5 && strncasecmp(name,
"CLASS", 5) == 0) {
2673 return atoi(name + 5);