rr.c
Go to the documentation of this file.
1/* rr.c
2 *
3 * access functions for ldns_rr -
4 * a Net::DNS like library for C
5 * LibDNS Team @ NLnet Labs
6 *
7 * (c) NLnet Labs, 2004-2006
8 * See the file LICENSE for the license
9 */
10#include <ldns/config.h>
11
12#include <ldns/ldns.h>
13
14#include <strings.h>
15#include <limits.h>
16
17#include <errno.h>
18
19#define LDNS_SYNTAX_DATALEN 16
20#define LDNS_TTL_DATALEN 21
21#define LDNS_RRLIST_INIT 8
22
23#define _IS_WHITESPACE(chr) \
24 ( NULL != strchr( LDNS_PARSE_NO_NL, chr) )
25
26#define _BUFFER_IS_AT_WHITESPACE(rd_buf) \
27 _IS_WHITESPACE(*(ldns_buffer_current(rd_buf)))
28
29ldns_rr *
31{
32 ldns_rr *rr;
33 rr = LDNS_MALLOC(ldns_rr);
34 if (!rr) {
35 return NULL;
36 }
37
38 ldns_rr_set_owner(rr, NULL);
39 ldns_rr_set_question(rr, false);
41 rr->_rdata_fields = NULL;
44 return rr;
45}
46
47ldns_rr *
49{
50 ldns_rr *rr;
51 const ldns_rr_descriptor *desc;
52 size_t i;
53
54 rr = LDNS_MALLOC(ldns_rr);
55 if (!rr) {
56 return NULL;
57 }
58
59 desc = ldns_rr_descript(t);
60
62 if(!rr->_rdata_fields) {
63 LDNS_FREE(rr);
64 return NULL;
65 }
66 for (i = 0; i < ldns_rr_descriptor_minimum(desc); i++) {
67 rr->_rdata_fields[i] = NULL;
68 }
69
70 ldns_rr_set_owner(rr, NULL);
71 ldns_rr_set_question(rr, false);
72 /* set the count to minimum */
76 ldns_rr_set_type(rr, t);
77 return rr;
78}
79
80void
82{
83 size_t i;
84 if (rr) {
85 if (ldns_rr_owner(rr)) {
87 }
88 for (i = 0; i < ldns_rr_rd_count(rr); i++) {
90 }
92 LDNS_FREE(rr);
93 }
94}
95
96/* Syntactic sugar for ldns_rr_new_frm_str_internal */
97INLINE bool
98ldns_rdf_type_maybe_quoted(ldns_rdf_type rdf_type)
99{
100 return rdf_type == LDNS_RDF_TYPE_STR ||
101 rdf_type == LDNS_RDF_TYPE_LONG_STR;
102}
103
104/*
105 * trailing spaces are allowed
106 * leading spaces are not allowed
107 * allow ttl to be optional
108 * class is optional too
109 * if ttl is missing, and default_ttl is 0, use DEF_TTL
110 * allow ttl to be written as 1d3h
111 * So the RR should look like. e.g.
112 * miek.nl. 3600 IN MX 10 elektron.atoom.net
113 * or
114 * miek.nl. 1h IN MX 10 elektron.atoom.net
115 * or
116 * miek.nl. IN MX 10 elektron.atoom.net
117 */
118static ldns_status
119ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
120 uint32_t default_ttl, const ldns_rdf *origin,
121 ldns_rdf **prev, bool question,
122 bool *explicit_ttl)
123{
124 ldns_rr *new;
125 const ldns_rr_descriptor *desc;
126 ldns_rr_type rr_type;
127 ldns_buffer *rr_buf = NULL;
128 ldns_buffer *rd_buf = NULL;
129 uint32_t ttl_val;
130 char *owner = NULL;
131 char *ttl = NULL;
132 ldns_rr_class clas_val;
133 char *clas = NULL;
134 char *type = NULL;
135 size_t type_sz;
136 char *rdata = NULL;
137 char *rd = NULL;
138 char *xtok = NULL; /* For RDF types with spaces (i.e. extra tokens) */
139 size_t rd_strlen;
140 const char *delimiters;
141 ssize_t c;
142 ldns_rdf *owner_dname;
143 const char* endptr;
144 int was_unknown_rr_format = 0;
146
147 /* used for types with unknown number of rdatas */
148 bool done;
149 bool quoted;
150
151 ldns_rdf *r = NULL;
152 uint16_t r_cnt;
153 uint16_t r_min;
154 uint16_t r_max;
155 size_t pre_data_pos;
156
157 uint16_t hex_data_size;
158 char *hex_data_str = NULL;
159 uint16_t cur_hex_data_size;
160 size_t hex_pos = 0;
161 uint8_t *hex_data = NULL;
162
163 new = ldns_rr_new();
164
165 owner = LDNS_XMALLOC(char, LDNS_MAX_DOMAINLEN + 1);
166 ttl = LDNS_XMALLOC(char, LDNS_TTL_DATALEN);
167 clas = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN);
168 rdata = LDNS_XMALLOC(char, LDNS_MAX_PACKETLEN + 1);
169 rr_buf = LDNS_MALLOC(ldns_buffer);
170 rd_buf = LDNS_MALLOC(ldns_buffer);
171 rd = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
172 xtok = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
173 if (rr_buf) {
174 rr_buf->_data = NULL;
175 }
176 if (rd_buf) {
177 rd_buf->_data = NULL;
178 }
179 if (!new || !owner || !ttl || !clas || !rdata ||
180 !rr_buf || !rd_buf || !rd || !xtok) {
181
182 goto memerror;
183 }
184
185 ldns_buffer_new_frm_data(rr_buf, (char*)str, strlen(str));
186
187 /* split the rr in its parts -1 signals trouble */
188 if (ldns_bget_token(rr_buf, owner, "\t\n ", LDNS_MAX_DOMAINLEN) == -1){
189
190 status = LDNS_STATUS_SYNTAX_ERR;
191 goto error;
192 }
193
194 if (ldns_bget_token(rr_buf, ttl, "\t\n ", LDNS_TTL_DATALEN) == -1) {
195
197 goto error;
198 }
199 ttl_val = (uint32_t) ldns_str2period(ttl, &endptr);
200
201 if (strlen(ttl) > 0 && !isdigit((int) ttl[0])) {
202 /* ah, it's not there or something */
203 if (default_ttl == 0) {
204 ttl_val = LDNS_DEFAULT_TTL;
205 } else {
206 ttl_val = default_ttl;
207 }
208 if (explicit_ttl)
209 *explicit_ttl = false;
210
211 /* we not ASSUMING the TTL is missing and that
212 * the rest of the RR is still there. That is
213 * CLASS TYPE RDATA
214 * so ttl value we read is actually the class
215 */
216 clas_val = ldns_get_rr_class_by_name(ttl);
217 /* class can be left out too, assume IN, current
218 * token must be type
219 */
220 if (clas_val == 0) {
221 clas_val = LDNS_RR_CLASS_IN;
222 type_sz = strlen(ttl) + 1;
223 type = LDNS_XMALLOC(char, type_sz);
224 if (!type) {
225 goto memerror;
226 }
227 strlcpy(type, ttl, type_sz);
228 }
229 } else {
230 if (explicit_ttl)
231 *explicit_ttl = true;
232
233 if (-1 == ldns_bget_token(
234 rr_buf, clas, "\t\n ", LDNS_SYNTAX_DATALEN)) {
235
237 goto error;
238 }
239 clas_val = ldns_get_rr_class_by_name(clas);
240 /* class can be left out too, assume IN, current
241 * token must be type
242 */
243 if (clas_val == 0) {
244 clas_val = LDNS_RR_CLASS_IN;
245 type_sz = strlen(clas) + 1;
246 type = LDNS_XMALLOC(char, type_sz);
247 if (!type) {
248 goto memerror;
249 }
250 strlcpy(type, clas, type_sz);
251 }
252 }
253 /* the rest should still be waiting for us */
254
255 if (!type) {
256 type = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN);
257 if (!type) {
258 goto memerror;
259 }
260 if (-1 == ldns_bget_token(
261 rr_buf, type, "\t\n ", LDNS_SYNTAX_DATALEN)) {
262
264 goto error;
265 }
266 }
267
268 if (ldns_bget_token(rr_buf, rdata, "\0", LDNS_MAX_PACKETLEN) == -1) {
269 /* apparently we are done, and it's only a question RR
270 * so do not set status and go to ldnserror here
271 */
272 }
273 ldns_buffer_new_frm_data(rd_buf, rdata, strlen(rdata));
274
275 if (strncmp(owner, "@", 1) == 0) {
276 if (origin) {
277 ldns_rr_set_owner(new, ldns_rdf_clone(origin));
278 } else if (prev && *prev) {
280 } else {
281 /* default to root */
283 }
284
285 /* @ also overrides prev */
286 if (prev) {
287 ldns_rdf_deep_free(*prev);
288 *prev = ldns_rdf_clone(ldns_rr_owner(new));
289 if (!*prev) {
290 goto memerror;
291 }
292 }
293 } else {
294 if (strlen(owner) == 0) {
295 /* no ownername was given, try prev, if that fails
296 * origin, else default to root */
297 if (prev && *prev) {
299 } else if (origin) {
300 ldns_rr_set_owner(new, ldns_rdf_clone(origin));
301 } else {
304 }
305 if(!ldns_rr_owner(new)) {
306 goto memerror;
307 }
308 } else {
309 owner_dname = ldns_dname_new_frm_str(owner);
310 if (!owner_dname) {
311 status = LDNS_STATUS_SYNTAX_ERR;
312 goto error;
313 }
314
315 ldns_rr_set_owner(new, owner_dname);
316 if (!ldns_dname_str_absolute(owner) && origin) {
317 if(ldns_dname_cat(ldns_rr_owner(new), origin)
318 != LDNS_STATUS_OK) {
319
320 status = LDNS_STATUS_SYNTAX_ERR;
321 goto error;
322 }
323 }
324 if (prev) {
325 ldns_rdf_deep_free(*prev);
326 *prev = ldns_rdf_clone(ldns_rr_owner(new));
327 if (!*prev) {
328 goto error;
329 }
330 }
331 }
332 }
333 LDNS_FREE(owner);
334
335 ldns_rr_set_question(new, question);
336
337 ldns_rr_set_ttl(new, ttl_val);
338 LDNS_FREE(ttl);
339
340 ldns_rr_set_class(new, clas_val);
341 LDNS_FREE(clas);
342
343 rr_type = ldns_get_rr_type_by_name(type);
344 LDNS_FREE(type);
345
346 desc = ldns_rr_descript((uint16_t)rr_type);
347 ldns_rr_set_type(new, rr_type);
348 if (desc) {
349 /* only the rdata remains */
350 r_max = ldns_rr_descriptor_maximum(desc);
351 r_min = ldns_rr_descriptor_minimum(desc);
352 } else {
353 r_min = 0;
354 r_max = 1;
355 }
356
357 for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) {
358 quoted = false;
359
360 switch (ldns_rr_descriptor_field_type(desc, r_cnt)) {
361 case LDNS_RDF_TYPE_B64 :
362 case LDNS_RDF_TYPE_HEX : /* These rdf types may con- */
363 case LDNS_RDF_TYPE_NSEC : /* tain whitespace, only if */
364 case LDNS_RDF_TYPE_LOC : /* it is the last rd field. */
365 case LDNS_RDF_TYPE_WKS :
368 case LDNS_RDF_TYPE_SVCPARAMS : if (r_cnt == r_max - 1) {
369 delimiters = "\n";
370 break;
371 }
372 /* fallthrough */
373 default : delimiters = "\n\t ";
374 }
375
376 if (ldns_rdf_type_maybe_quoted(
378 desc, r_cnt)) &&
379 ldns_buffer_remaining(rd_buf) > 0){
380
381 /* skip whitespace */
382 while (ldns_buffer_remaining(rd_buf) > 0 &&
383 _BUFFER_IS_AT_WHITESPACE(rd_buf)) {
384 ldns_buffer_skip(rd_buf, 1);
385 }
386
387 if (ldns_buffer_remaining(rd_buf) > 0 &&
388 *(ldns_buffer_current(rd_buf)) == '\"') {
389 delimiters = "\"\0";
390 ldns_buffer_skip(rd_buf, 1);
391 quoted = true;
392 }
393 }
394
395 /* because number of fields can be variable, we can't rely on
396 * _maximum() only
397 */
398
399 /* skip whitespace */
400 while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
401 && _BUFFER_IS_AT_WHITESPACE(rd_buf)
402 && !quoted) {
403
404 ldns_buffer_skip(rd_buf, 1);
405 }
406
407 pre_data_pos = ldns_buffer_position(rd_buf);
408 if (-1 == ldns_bget_token(
409 rd_buf, rd, delimiters, LDNS_MAX_RDFLEN)) {
410
411 done = true;
412 (void)done; /* we're breaking, so done not read anymore */
413 break;
414 }
415 /* hmmz, rfc3597 specifies that any type can be represented
416 * with \# method, which can contain spaces...
417 * it does specify size though...
418 */
419 rd_strlen = strlen(rd);
420
421 /* unknown RR data */
422 if (strncmp(rd, "\\#", 2) == 0 && !quoted &&
423 (rd_strlen == 2 || _IS_WHITESPACE(rd[2]))) {
424
425 was_unknown_rr_format = 1;
426 /* go back to before \#
427 * and skip it while setting delimiters better
428 */
429 ldns_buffer_set_position(rd_buf, pre_data_pos);
430 delimiters = "\n\t ";
431 (void)ldns_bget_token(rd_buf, rd,
432 delimiters, LDNS_MAX_RDFLEN);
433 /* read rdata octet length */
434 c = ldns_bget_token(rd_buf, rd,
435 delimiters, LDNS_MAX_RDFLEN);
436 if (c == -1) {
437 /* something goes very wrong here */
439 goto error;
440 }
441 hex_data_size = (uint16_t) atoi(rd);
442 /* copy hex chars into hex str (2 chars per byte) */
443 hex_data_str = LDNS_XMALLOC(char, 2*hex_data_size + 1);
444 if (!hex_data_str) {
445 /* malloc error */
446 goto memerror;
447 }
448 cur_hex_data_size = 0;
449 while(cur_hex_data_size < 2 * hex_data_size) {
450 c = ldns_bget_token(rd_buf, rd,
451 delimiters, LDNS_MAX_RDFLEN);
452 if (c == -1) {
454 goto error;
455 }
456 rd_strlen = strlen(rd);
457 if ((size_t)cur_hex_data_size + rd_strlen >
458 2 * (size_t)hex_data_size) {
460 goto error;
461 }
462 strlcpy(hex_data_str + cur_hex_data_size, rd,
463 rd_strlen + 1);
464
465 cur_hex_data_size += rd_strlen;
466 }
467 hex_data_str[cur_hex_data_size] = '\0';
468
469 /* correct the rdf type */
470 /* if *we* know the type, interpret it as wireformat */
471 if (desc) {
472 hex_pos = 0;
473 hex_data =
474 LDNS_XMALLOC(uint8_t, hex_data_size+2);
475
476 if (!hex_data) {
477 goto memerror;
478 }
479 ldns_write_uint16(hex_data, hex_data_size);
481 hex_data + 2, hex_data_str);
482 status = ldns_wire2rdf(new, hex_data,
483 hex_data_size + 2, &hex_pos);
484 if (status != LDNS_STATUS_OK) {
485 goto error;
486 }
487 LDNS_FREE(hex_data);
488 } else {
490 hex_data_str);
491 if (!r) {
492 goto memerror;
493 }
495 if (!ldns_rr_push_rdf(new, r)) {
496 goto memerror;
497 }
498 }
499 LDNS_FREE(hex_data_str);
500
501 } else if(rd_strlen > 0 || quoted) {
502 /* Normal RR */
503 switch(ldns_rr_descriptor_field_type(desc, r_cnt)) {
504
507 /* When this is the last rdata field, then the
508 * rest should be read in (cause then these
509 * rdf types may contain spaces).
510 */
511 if (r_cnt == r_max - 1) {
512 c = ldns_bget_token(rd_buf, xtok,
513 "\n", LDNS_MAX_RDFLEN);
514 if (c != -1) {
515 (void) strncat(rd, xtok,
517 strlen(rd) - 1);
518 }
519 }
522 desc, r_cnt), rd);
523 break;
524
526 /*
527 * In presentation format this RDATA type has
528 * three tokens: An algorithm byte, then a
529 * variable length HIT (in hexbytes) and then
530 * a variable length Public Key (in base64).
531 *
532 * We have just read the algorithm, so we need
533 * two more tokens: HIT and Public Key.
534 */
535 do {
536 /* Read and append HIT */
537 if (ldns_bget_token(rd_buf,
538 xtok, delimiters,
539 LDNS_MAX_RDFLEN) == -1)
540 break;
541
542 (void) strncat(rd, " ",
544 strlen(rd) - 1);
545 (void) strncat(rd, xtok,
547 strlen(rd) - 1);
548
549 /* Read and append Public Key*/
550 if (ldns_bget_token(rd_buf,
551 xtok, delimiters,
552 LDNS_MAX_RDFLEN) == -1)
553 break;
554
555 (void) strncat(rd, " ",
557 strlen(rd) - 1);
558 (void) strncat(rd, xtok,
560 strlen(rd) - 1);
561 } while (false);
562
565 desc, r_cnt), rd);
566 break;
567
571 desc, r_cnt), rd);
572
573 /* check if the origin should be used
574 * or concatenated
575 */
576 if (r && ldns_rdf_size(r) > 1 &&
577 ldns_rdf_data(r)[0] == 1 &&
578 ldns_rdf_data(r)[1] == '@') {
579
581
582 r = origin ? ldns_rdf_clone(origin)
583
584 : ( rr_type == LDNS_RR_TYPE_SOA ?
585
587 ldns_rr_owner(new))
588
591 );
592
593 } else if (r && rd_strlen >= 1
594 && (origin || rr_type == LDNS_RR_TYPE_SOA)
595 && !ldns_dname_str_absolute(rd)) {
596
597 status = ldns_dname_cat(r, origin
598 ? origin : ldns_rr_owner(new));
599 if (status != LDNS_STATUS_OK) {
600 goto error;
601 }
602 }
603 break;
604 default:
607 desc, r_cnt), rd);
608 break;
609 }
610 if (!r) {
612 goto error;
613 }
614 ldns_rr_push_rdf(new, r);
615 }
616 } /* for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) */
617 LDNS_FREE(rd);
618 LDNS_FREE(xtok);
619 ldns_buffer_free(rr_buf);
620 LDNS_FREE(rdata);
621 if (ldns_buffer_remaining(rd_buf) > 0) {
622 ldns_buffer_free(rd_buf);
623 ldns_rr_free(new);
625 }
626 ldns_buffer_free(rd_buf);
627
628 if (!question && desc && !was_unknown_rr_format &&
629 ldns_rr_rd_count(new) < r_min) {
630
631 ldns_rr_free(new);
633 }
634
635 if (newrr) {
636 *newrr = new;
637 } else {
638 /* Maybe the caller just wanted to see if it would parse? */
639 ldns_rr_free(new);
640 }
641 return LDNS_STATUS_OK;
642
643memerror:
644 status = LDNS_STATUS_MEM_ERR;
645error:
646 if (rd_buf && rd_buf->_data) {
647 ldns_buffer_free(rd_buf);
648 } else {
649 LDNS_FREE(rd_buf);
650 }
651 if (rr_buf && rr_buf->_data) {
652 ldns_buffer_free(rr_buf);
653 } else {
654 LDNS_FREE(rr_buf);
655 }
656 LDNS_FREE(type);
657 LDNS_FREE(owner);
658 LDNS_FREE(ttl);
659 LDNS_FREE(clas);
660 LDNS_FREE(hex_data);
661 LDNS_FREE(hex_data_str);
662 LDNS_FREE(xtok);
663 LDNS_FREE(rd);
664 LDNS_FREE(rdata);
665 ldns_rr_free(new);
666 return status;
667}
668
670ldns_rr_new_frm_str(ldns_rr **newrr, const char *str,
671 uint32_t default_ttl, const ldns_rdf *origin,
672 ldns_rdf **prev)
673{
674 return ldns_rr_new_frm_str_internal(newrr,
675 str,
676 default_ttl,
677 origin,
678 prev,
679 false,
680 NULL);
681}
682
684ldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str,
685 const ldns_rdf *origin, ldns_rdf **prev)
686{
687 return ldns_rr_new_frm_str_internal(newrr,
688 str,
689 0,
690 origin,
691 prev,
692 true,
693 NULL);
694}
695
696/* Strip whitespace from the start and the end of <line>. */
697static char *
698ldns_strip_ws(char *line)
699{
700 char *s = line, *e;
701
702 for (s = line; *s && isspace((unsigned char)*s); s++)
703 ;
704
705 for (e = strchr(s, 0); e > s+2 && isspace((unsigned char)e[-1]) && e[-2] != '\\'; e--)
706 ;
707 *e = 0;
708
709 return s;
710}
711
713ldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev)
714{
715 return ldns_rr_new_frm_fp_l(newrr, fp, ttl, origin, prev, NULL);
716}
717
720 uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev,
721 int *line_nr, bool *explicit_ttl);
724 uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev,
725 int *line_nr, bool *explicit_ttl)
726{
727 char *line = NULL;
728 size_t limit = 0;
729 const char *endptr; /* unused */
730 ldns_rr *rr;
731 uint32_t ttl;
732 ldns_rdf *tmp;
733 ldns_status s;
734
735 if (default_ttl) {
736 ttl = *default_ttl;
737 } else {
738 ttl = 0;
739 }
740 /* read an entire line in from the file */
741 if ((s = ldns_fget_token_l_st( fp, &line, &limit, false
742 , LDNS_PARSE_SKIP_SPACE, line_nr))) {
743 LDNS_FREE(line);
744 return s;
745 }
746
747 if (strncmp(line, "$ORIGIN", 7) == 0 && isspace((unsigned char)line[7])) {
748 if (*origin) {
749 ldns_rdf_deep_free(*origin);
750 *origin = NULL;
751 }
753 ldns_strip_ws(line + 8));
754 if (!tmp) {
755 /* could not parse what next to $ORIGIN */
756 LDNS_FREE(line);
758 }
759 *origin = tmp;
761 } else if (strncmp(line, "$TTL", 4) == 0 && isspace((unsigned char)line[4])) {
762 if (default_ttl) {
763 *default_ttl = ldns_str2period(
764 ldns_strip_ws(line + 5), &endptr);
765 }
767 } else if (strncmp(line, "$INCLUDE", 8) == 0) {
769 } else if (!*ldns_strip_ws(line)) {
770 LDNS_FREE(line);
772 } else {
773 if (origin && *origin) {
774 s = ldns_rr_new_frm_str_internal(&rr, (const char*)line,
775 ttl, *origin, prev, false, explicit_ttl);
776 } else {
777 s = ldns_rr_new_frm_str_internal(&rr, (const char*)line,
778 ttl, NULL, prev, false, explicit_ttl);
779 }
780 }
781 LDNS_FREE(line);
782 if (s == LDNS_STATUS_OK) {
783 if (newrr) {
784 *newrr = rr;
785 } else {
786 /* Just testing if it would parse? */
787 ldns_rr_free(rr);
788 }
789 }
790 return s;
791}
792
794ldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl,
795 ldns_rdf **origin, ldns_rdf **prev, int *line_nr)
796{
797 return _ldns_rr_new_frm_fp_l_internal(newrr, fp, default_ttl, origin,
798 prev, line_nr, NULL);
799}
800
801void
803{
804 rr->_owner = owner;
805}
806
807void
808ldns_rr_set_question(ldns_rr *rr, bool question)
809{
810 rr->_rr_question = question;
811}
812
813void
814ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl)
815{
816 rr->_ttl = ttl;
817}
818
819void
821{
822 rr->_rd_count = count;
823}
824
825void
827{
828 rr->_rr_type = rr_type;
829}
830
831void
833{
834 rr->_rr_class = rr_class;
835}
836
837ldns_rdf *
838ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position)
839{
840 size_t rd_count;
841 ldns_rdf *pop;
842
843 rd_count = ldns_rr_rd_count(rr);
844 if (position < rd_count) {
845 /* discard the old one */
846 pop = rr->_rdata_fields[position];
847 rr->_rdata_fields[position] = (ldns_rdf*)f;
848 return pop;
849 } else {
850 return NULL;
851 }
852}
853
854bool
856{
857 size_t rd_count;
858 ldns_rdf **rdata_fields;
859
860 rd_count = ldns_rr_rd_count(rr);
861
862 /* grow the array */
863 rdata_fields = LDNS_XREALLOC(
864 rr->_rdata_fields, ldns_rdf *, rd_count + 1);
865 if (!rdata_fields) {
866 return false;
867 }
868
869 /* add the new member */
870 rr->_rdata_fields = rdata_fields;
871 rr->_rdata_fields[rd_count] = (ldns_rdf*)f;
872
873 ldns_rr_set_rd_count(rr, rd_count + 1);
874 return true;
875}
876
877ldns_rdf *
879{
880 size_t rd_count;
881 ldns_rdf *pop;
882 ldns_rdf** newrd;
883
884 rd_count = ldns_rr_rd_count(rr);
885
886 if (rd_count == 0) {
887 return NULL;
888 }
889
890 pop = rr->_rdata_fields[rd_count - 1];
891
892 /* try to shrink the array */
893 if(rd_count > 1) {
894 newrd = LDNS_XREALLOC(
895 rr->_rdata_fields, ldns_rdf *, rd_count - 1);
896 if(newrd)
897 rr->_rdata_fields = newrd;
898 } else {
900 }
901
902 ldns_rr_set_rd_count(rr, rd_count - 1);
903 return pop;
904}
905
906ldns_rdf *
907ldns_rr_rdf(const ldns_rr *rr, size_t nr)
908{
909 if (rr && nr < ldns_rr_rd_count(rr)) {
910 return rr->_rdata_fields[nr];
911 } else {
912 return NULL;
913 }
914}
915
916ldns_rdf *
918{
919 return rr->_owner;
920}
921
922bool
924{
925 return rr->_rr_question;
926}
927
928uint32_t
930{
931 return rr->_ttl;
932}
933
934size_t
936{
937 return rr->_rd_count;
938}
939
942{
943 return rr->_rr_type;
944}
945
948{
949 return rr->_rr_class;
950}
951
952/* rr_lists */
953
954size_t
956{
957 if (rr_list) {
958 return rr_list->_rr_count;
959 } else {
960 return 0;
961 }
962}
963
964ldns_rr *
965ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count)
966{
967 ldns_rr *old;
968
969 if (count > ldns_rr_list_rr_count(rr_list)) {
970 return NULL;
971 }
972
973 old = ldns_rr_list_rr(rr_list, count);
974
975 /* overwrite old's pointer */
976 rr_list->_rrs[count] = (ldns_rr*)r;
977 return old;
978}
979
980void
982{
983 assert(count <= rr_list->_rr_capacity);
984 rr_list->_rr_count = count;
985}
986
987ldns_rr *
988ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr)
989{
990 if (nr < ldns_rr_list_rr_count(rr_list)) {
991 return rr_list->_rrs[nr];
992 } else {
993 return NULL;
994 }
995}
996
999{
1001 if(!rr_list) return NULL;
1002 rr_list->_rr_count = 0;
1003 rr_list->_rr_capacity = 0;
1004 rr_list->_rrs = NULL;
1005 return rr_list;
1006}
1007
1008void
1010{
1011 if (rr_list) {
1012 LDNS_FREE(rr_list->_rrs);
1013 LDNS_FREE(rr_list);
1014 }
1015}
1016
1017void
1019{
1020 size_t i;
1021
1022 if (rr_list) {
1023 for (i=0; i < ldns_rr_list_rr_count(rr_list); i++) {
1024 ldns_rr_free(ldns_rr_list_rr(rr_list, i));
1025 }
1026 LDNS_FREE(rr_list->_rrs);
1027 LDNS_FREE(rr_list);
1028 }
1029}
1030
1031
1032/* add right to left. So we modify *left! */
1033bool
1035{
1036 size_t r_rr_count;
1037 size_t i;
1038
1039 if (!left) {
1040 return false;
1041 }
1042
1043 if (right) {
1044 r_rr_count = ldns_rr_list_rr_count(right);
1045 } else {
1046 r_rr_count = 0;
1047 }
1048
1049 /* push right to left */
1050 for(i = 0; i < r_rr_count; i++) {
1051 ldns_rr_list_push_rr(left, ldns_rr_list_rr(right, i));
1052 }
1053 return true;
1054}
1055
1058{
1059 size_t l_rr_count;
1060 size_t r_rr_count;
1061 size_t i;
1062 ldns_rr_list *cat;
1063
1064 if (left) {
1065 l_rr_count = ldns_rr_list_rr_count(left);
1066 } else {
1067 return ldns_rr_list_clone(right);
1068 }
1069
1070 if (right) {
1071 r_rr_count = ldns_rr_list_rr_count(right);
1072 } else {
1073 r_rr_count = 0;
1074 }
1075
1076 cat = ldns_rr_list_new();
1077
1078 if (!cat) {
1079 return NULL;
1080 }
1081
1082 /* left */
1083 for(i = 0; i < l_rr_count; i++) {
1085 ldns_rr_clone(ldns_rr_list_rr(left, i)));
1086 }
1087 /* right */
1088 for(i = 0; i < r_rr_count; i++) {
1090 ldns_rr_clone(ldns_rr_list_rr(right, i)));
1091 }
1092 return cat;
1093}
1094
1097{
1098 size_t i;
1099 ldns_rr_list *subtyped;
1100 ldns_rdf *list_rdf;
1101
1102 subtyped = ldns_rr_list_new();
1103
1104 for(i = 0; i < ldns_rr_list_rr_count(l); i++) {
1105 list_rdf = ldns_rr_rdf(
1106 ldns_rr_list_rr(l, i),
1107 pos);
1108 if (!list_rdf) {
1109 /* pos is too large or any other error */
1110 ldns_rr_list_deep_free(subtyped);
1111 return NULL;
1112 }
1113
1114 if (ldns_rdf_compare(list_rdf, r) == 0) {
1115 /* a match */
1116 ldns_rr_list_push_rr(subtyped,
1118 }
1119 }
1120
1121 if (ldns_rr_list_rr_count(subtyped) > 0) {
1122 return subtyped;
1123 } else {
1124 ldns_rr_list_free(subtyped);
1125 return NULL;
1126 }
1127}
1128
1129bool
1131{
1132 size_t rr_count;
1133 size_t cap;
1134
1135 rr_count = ldns_rr_list_rr_count(rr_list);
1136 cap = rr_list->_rr_capacity;
1137
1138 /* grow the array */
1139 if(rr_count+1 > cap) {
1140 ldns_rr **rrs;
1141
1142 if(cap == 0)
1143 cap = LDNS_RRLIST_INIT; /* initial list size */
1144 else cap *= 2;
1145 rrs = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap);
1146 if (!rrs) {
1147 return false;
1148 }
1149 rr_list->_rrs = rrs;
1150 rr_list->_rr_capacity = cap;
1151 }
1152
1153 /* add the new member */
1154 rr_list->_rrs[rr_count] = (ldns_rr*)rr;
1155
1156 ldns_rr_list_set_rr_count(rr_list, rr_count + 1);
1157 return true;
1158}
1159
1160bool
1162{
1163 size_t i;
1164
1165 for(i = 0; i < ldns_rr_list_rr_count(push_list); i++) {
1166 if (!ldns_rr_list_push_rr(rr_list,
1167 ldns_rr_list_rr(push_list, i))) {
1168 return false;
1169 }
1170 }
1171 return true;
1172}
1173
1174ldns_rr *
1176{
1177 size_t rr_count;
1178 size_t cap;
1179 ldns_rr *pop;
1180
1181 rr_count = ldns_rr_list_rr_count(rr_list);
1182
1183 if (rr_count == 0) {
1184 return NULL;
1185 }
1186
1187 cap = rr_list->_rr_capacity;
1188 pop = ldns_rr_list_rr(rr_list, rr_count - 1);
1189
1190 /* shrink the array */
1191 if(cap > LDNS_RRLIST_INIT && rr_count-1 <= cap/2) {
1192 ldns_rr** a;
1193 cap /= 2;
1194 a = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap);
1195 if(a) {
1196 rr_list->_rrs = a;
1197 rr_list->_rr_capacity = cap;
1198 }
1199 /* if the realloc fails, the capacity for the list remains unchanged */
1200 }
1201
1202 ldns_rr_list_set_rr_count(rr_list, rr_count - 1);
1203
1204 return pop;
1205}
1206
1209{
1210 /* pop a number of rr's and put them in a rr_list */
1211 ldns_rr_list *popped;
1212 ldns_rr *p;
1213 size_t i = howmany;
1214
1215 popped = ldns_rr_list_new();
1216
1217 if (!popped) {
1218 return NULL;
1219 }
1220
1221
1222 while(i > 0 &&
1223 (p = ldns_rr_list_pop_rr(rr_list)) != NULL) {
1224 ldns_rr_list_push_rr(popped, p);
1225 i--;
1226 }
1227
1228 if (i == howmany) { /* so i <= 0 */
1229 ldns_rr_list_free(popped);
1230 return NULL;
1231 } else {
1232 return popped;
1233 }
1234}
1235
1236
1237bool
1239{
1240 size_t i;
1241
1242 if (!rr_list || !rr || ldns_rr_list_rr_count(rr_list) == 0) {
1243 return false;
1244 }
1245
1246 for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) {
1247 if (rr == ldns_rr_list_rr(rr_list, i)) {
1248 return true;
1249 } else if (ldns_rr_compare(rr, ldns_rr_list_rr(rr_list, i)) == 0) {
1250 return true;
1251 }
1252 }
1253 return false;
1254}
1255
1256bool
1258{
1259 ldns_rr_type t;
1260 ldns_rr_class c;
1261 ldns_rdf *o;
1262 ldns_rr *tmp;
1263 size_t i;
1264
1265 if (!rr_list || ldns_rr_list_rr_count(rr_list) == 0) {
1266 return false;
1267 }
1268
1269 tmp = ldns_rr_list_rr(rr_list, 0);
1270
1271 t = ldns_rr_get_type(tmp);
1272 c = ldns_rr_get_class(tmp);
1273 o = ldns_rr_owner(tmp);
1274
1275 /* compare these with the rest of the rr_list, start with 1 */
1276 for (i = 1; i < ldns_rr_list_rr_count(rr_list); i++) {
1277 tmp = ldns_rr_list_rr(rr_list, i);
1278 if (t != ldns_rr_get_type(tmp)) {
1279 return false;
1280 }
1281 if (c != ldns_rr_get_class(tmp)) {
1282 return false;
1283 }
1284 if (ldns_dname_compare(o, ldns_rr_owner(tmp)) != 0) {
1285 return false;
1286 }
1287 }
1288 return true;
1289}
1290
1291bool
1293{
1294 ldns_rr_type t;
1295 ldns_rr_class c;
1296 uint32_t l;
1297 ldns_rdf *o;
1298 ldns_rr *tmp;
1299 size_t i;
1300
1301 if (!rr_list || ldns_rr_list_rr_count(rr_list) == 0) {
1302 return false;
1303 }
1304
1305 tmp = ldns_rr_list_rr(rr_list, 0);
1306
1307 t = ldns_rr_get_type(tmp);
1308 c = ldns_rr_get_class(tmp);
1309 l = ldns_rr_ttl(tmp);
1310 o = ldns_rr_owner(tmp);
1311
1312 /* compare these with the rest of the rr_list, start with 1 */
1313 for (i = 1; i < ldns_rr_list_rr_count(rr_list); i++) {
1314 tmp = ldns_rr_list_rr(rr_list, i);
1315 if (t != ldns_rr_get_type(tmp)) {
1316 return false;
1317 }
1318 if (c != ldns_rr_get_class(tmp)) {
1319 return false;
1320 }
1321 if (l != ldns_rr_ttl(tmp)) {
1322 return false;
1323 }
1324 if (ldns_dname_compare(o, ldns_rr_owner(tmp)) != 0) {
1325 return false;
1326 }
1327 }
1328 return true;
1329}
1330
1331bool
1333{
1334 size_t rr_count;
1335 size_t i;
1336 ldns_rr *last;
1337
1338 assert(rr != NULL);
1339
1340 rr_count = ldns_rr_list_rr_count(rr_list);
1341
1342 if (rr_count == 0) {
1343 /* nothing there, so checking it is
1344 * not needed */
1345 return ldns_rr_list_push_rr(rr_list, rr);
1346 } else {
1347 /* check with the final rr in the rr_list */
1348 last = ldns_rr_list_rr(rr_list, rr_count - 1);
1349
1350 if (ldns_rr_get_class(last) != ldns_rr_get_class(rr)) {
1351 return false;
1352 }
1353 if (ldns_rr_get_type(last) != ldns_rr_get_type(rr)) {
1354 return false;
1355 }
1356 /* only check if not equal to RRSIG */
1358 if (ldns_rr_ttl(last) != ldns_rr_ttl(rr)) {
1359 return false;
1360 }
1361 }
1363 ldns_rr_owner(rr)) != 0) {
1364 return false;
1365 }
1366 /* ok, still alive - check if the rr already
1367 * exists - if so, don't add it */
1368 for(i = 0; i < rr_count; i++) {
1369 if(ldns_rr_compare(
1370 ldns_rr_list_rr(rr_list, i), rr) == 0) {
1371 return false;
1372 }
1373 }
1374 /* it's safe, push it */
1375 return ldns_rr_list_push_rr(rr_list, rr);
1376 }
1377}
1378
1379ldns_rr *
1381{
1382 return ldns_rr_list_pop_rr(rr_list);
1383}
1384
1387{
1388 ldns_rr_list *rrset;
1389 ldns_rr *last_rr = NULL;
1390 ldns_rr *next_rr;
1391
1392 if (!rr_list) {
1393 return NULL;
1394 }
1395
1396 rrset = ldns_rr_list_new();
1397 if (!last_rr) {
1398 last_rr = ldns_rr_list_pop_rr(rr_list);
1399 if (!last_rr) {
1400 ldns_rr_list_free(rrset);
1401 return NULL;
1402 } else {
1403 ldns_rr_list_push_rr(rrset, last_rr);
1404 }
1405 }
1406
1407 if (ldns_rr_list_rr_count(rr_list) > 0) {
1408 next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1);
1409 } else {
1410 next_rr = NULL;
1411 }
1412
1413 while (next_rr) {
1414 if (
1416 ldns_rr_owner(last_rr)) == 0
1417 &&
1418 ldns_rr_get_type(next_rr) == ldns_rr_get_type(last_rr)
1419 &&
1420 ldns_rr_get_class(next_rr) == ldns_rr_get_class(last_rr)
1421 ) {
1423 if (ldns_rr_list_rr_count(rr_list) > 0) {
1424 last_rr = next_rr;
1425 next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1);
1426 } else {
1427 next_rr = NULL;
1428 }
1429 } else {
1430 next_rr = NULL;
1431 }
1432 }
1433
1434 return rrset;
1435}
1436
1437ldns_rr *
1439{
1440 size_t i;
1441 ldns_rr *new_rr;
1442
1443 if (!rr) {
1444 return NULL;
1445 }
1446
1447 new_rr = ldns_rr_new();
1448 if (!new_rr) {
1449 return NULL;
1450 }
1451 if (ldns_rr_owner(rr)) {
1453 }
1454 ldns_rr_set_ttl(new_rr, ldns_rr_ttl(rr));
1458
1459 for (i = 0; i < ldns_rr_rd_count(rr); i++) {
1460 if (ldns_rr_rdf(rr,i)) {
1462 }
1463 }
1464
1465 return new_rr;
1466}
1467
1470{
1471 size_t i;
1472 ldns_rr_list *new_list;
1473 ldns_rr *r;
1474
1475 if (!rrlist) {
1476 return NULL;
1477 }
1478
1479 new_list = ldns_rr_list_new();
1480 if (!new_list) {
1481 return NULL;
1482 }
1483 for (i = 0; i < ldns_rr_list_rr_count(rrlist); i++) {
1484 r = ldns_rr_clone(
1485 ldns_rr_list_rr(rrlist, i)
1486 );
1487 if (!r) {
1488 /* huh, failure in cloning */
1489 ldns_rr_list_deep_free(new_list);
1490 return NULL;
1491 }
1492 ldns_rr_list_push_rr(new_list, r);
1493 }
1494 return new_list;
1495}
1496
1497
1498static int
1499qsort_schwartz_rr_compare(const void *a, const void *b)
1500{
1501 int result = 0;
1502 ldns_rr *rr1, *rr2;
1503 ldns_buffer *rr1_buf, *rr2_buf;
1506 /* if we are doing 2wire, we need to do lowercasing on the dname (and maybe on the rdata)
1507 * this must be done for comparison only, so we need to have a temp var for both buffers,
1508 * which is only used when the transformed object value isn't there yet
1509 */
1510 ldns_rr *canonical_a, *canonical_b;
1511
1512 rr1 = (ldns_rr *) sa->original_object;
1513 rr2 = (ldns_rr *) sb->original_object;
1514
1515 result = ldns_rr_compare_no_rdata(rr1, rr2);
1516
1517 if (result == 0) {
1518 if (!sa->transformed_object) {
1519 canonical_a = ldns_rr_clone(sa->original_object);
1520 ldns_rr2canonical(canonical_a);
1521 sa->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_a));
1522 if (ldns_rr2buffer_wire(sa->transformed_object, canonical_a, LDNS_SECTION_ANY) != LDNS_STATUS_OK) {
1523 ldns_buffer_free((ldns_buffer *)sa->transformed_object);
1524 sa->transformed_object = NULL;
1525 ldns_rr_free(canonical_a);
1526 return 0;
1527 }
1528 ldns_rr_free(canonical_a);
1529 }
1530 if (!sb->transformed_object) {
1531 canonical_b = ldns_rr_clone(sb->original_object);
1532 ldns_rr2canonical(canonical_b);
1533 sb->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_b));
1534 if (ldns_rr2buffer_wire(sb->transformed_object, canonical_b, LDNS_SECTION_ANY) != LDNS_STATUS_OK) {
1535 ldns_buffer_free((ldns_buffer *)sa->transformed_object);
1536 ldns_buffer_free((ldns_buffer *)sb->transformed_object);
1537 sa->transformed_object = NULL;
1538 sb->transformed_object = NULL;
1539 ldns_rr_free(canonical_b);
1540 return 0;
1541 }
1542 ldns_rr_free(canonical_b);
1543 }
1544 rr1_buf = (ldns_buffer *) sa->transformed_object;
1545 rr2_buf = (ldns_buffer *) sb->transformed_object;
1546
1547 result = ldns_rr_compare_wire(rr1_buf, rr2_buf);
1548 }
1549
1550 return result;
1551}
1552
1553void
1555{
1556 struct ldns_schwartzian_compare_struct **sortables;
1557 size_t item_count;
1558 size_t i;
1559
1560 if (unsorted) {
1561 item_count = ldns_rr_list_rr_count(unsorted);
1562
1563 sortables = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct *,
1564 item_count);
1565 if(!sortables) return; /* no way to return error */
1566 for (i = 0; i < item_count; i++) {
1567 sortables[i] = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct, 1);
1568 if(!sortables[i]) {
1569 /* free the allocated parts */
1570 while(i>0) {
1571 i--;
1572 LDNS_FREE(sortables[i]);
1573 }
1574 /* no way to return error */
1575 LDNS_FREE(sortables);
1576 return;
1577 }
1578 sortables[i]->original_object = ldns_rr_list_rr(unsorted, i);
1579 sortables[i]->transformed_object = NULL;
1580 }
1581 qsort(sortables,
1582 item_count,
1583 sizeof(struct ldns_schwartzian_compare_struct *),
1584 qsort_schwartz_rr_compare);
1585 for (i = 0; i < item_count; i++) {
1586 unsorted->_rrs[i] = sortables[i]->original_object;
1587 if (sortables[i]->transformed_object) {
1588 ldns_buffer_free(sortables[i]->transformed_object);
1589 }
1590 LDNS_FREE(sortables[i]);
1591 }
1592 LDNS_FREE(sortables);
1593 }
1594}
1595
1596int
1598{
1599 size_t rr1_len;
1600 size_t rr2_len;
1601 size_t offset;
1602
1603 assert(rr1 != NULL);
1604 assert(rr2 != NULL);
1605
1606 rr1_len = ldns_rr_uncompressed_size(rr1);
1607 rr2_len = ldns_rr_uncompressed_size(rr2);
1608
1609 if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) < 0) {
1610 return -1;
1611 } else if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) > 0) {
1612 return 1;
1613 }
1614
1615 /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */
1616 if (ldns_rr_get_class(rr1) != ldns_rr_get_class(rr2)) {
1617 return ldns_rr_get_class(rr1) - ldns_rr_get_class(rr2);
1618 }
1619
1620 /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */
1621 if (ldns_rr_get_type(rr1) != ldns_rr_get_type(rr2)) {
1622 return ldns_rr_get_type(rr1) - ldns_rr_get_type(rr2);
1623 }
1624
1625 /* offset is the owername length + ttl + type + class + rdlen == start of wire format rdata */
1626 offset = ldns_rdf_size(ldns_rr_owner(rr1)) + 4 + 2 + 2 + 2;
1627 /* if either record doesn't have any RDATA... */
1628 if (offset > rr1_len || offset > rr2_len) {
1629 if (rr1_len == rr2_len) {
1630 return 0;
1631 }
1632 return ((int) rr2_len - (int) rr1_len);
1633 }
1634
1635 return 0;
1636}
1637
1638int ldns_rr_compare_wire(const ldns_buffer *rr1_buf, const ldns_buffer *rr2_buf)
1639{
1640 size_t rr1_len, rr2_len, min_len, i, offset;
1641
1642 rr1_len = ldns_buffer_capacity(rr1_buf);
1643 rr2_len = ldns_buffer_capacity(rr2_buf);
1644
1645 /* jump past dname (checked in earlier part)
1646 * and especially past TTL */
1647 offset = 0;
1648 while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
1649 offset += *ldns_buffer_at(rr1_buf, offset) + 1;
1650 }
1651 /* jump to rdata section (PAST the rdata length field, otherwise
1652 rrs with different lengths might be sorted erroneously */
1653 offset += 11;
1654 min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
1655 /* Compare RRs RDATA byte for byte. */
1656 for(i = offset; i < min_len; i++) {
1657 if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
1658 return -1;
1659 } else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
1660 return +1;
1661 }
1662 }
1663
1664 /* If both RDATAs are the same up to min_len, then the shorter one sorts first. */
1665 if (rr1_len < rr2_len) {
1666 return -1;
1667 } else if (rr1_len > rr2_len) {
1668 return +1;
1669 }
1670 /* The RDATAs are equal. */
1671 return 0;
1672
1673}
1674
1675int
1676ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2)
1677{
1678 int result;
1679 size_t rr1_len, rr2_len;
1680
1681 ldns_buffer *rr1_buf;
1682 ldns_buffer *rr2_buf;
1683
1684 result = ldns_rr_compare_no_rdata(rr1, rr2);
1685 if (result == 0) {
1686 rr1_len = ldns_rr_uncompressed_size(rr1);
1687 rr2_len = ldns_rr_uncompressed_size(rr2);
1688
1689 rr1_buf = ldns_buffer_new(rr1_len);
1690 rr2_buf = ldns_buffer_new(rr2_len);
1691
1693 rr1,
1695 != LDNS_STATUS_OK) {
1696 ldns_buffer_free(rr1_buf);
1697 ldns_buffer_free(rr2_buf);
1698 return 0;
1699 }
1701 rr2,
1703 != LDNS_STATUS_OK) {
1704 ldns_buffer_free(rr1_buf);
1705 ldns_buffer_free(rr2_buf);
1706 return 0;
1707 }
1708
1709 result = ldns_rr_compare_wire(rr1_buf, rr2_buf);
1710
1711 ldns_buffer_free(rr1_buf);
1712 ldns_buffer_free(rr2_buf);
1713 }
1714
1715 return result;
1716}
1717
1718/* convert (c)dnskey to a (c)ds with the given algorithm,
1719 * then compare the result with the given (c)ds */
1720static int
1721ldns_rr_compare_ds_dnskey(ldns_rr *ds,
1722 ldns_rr *dnskey)
1723{
1724 ldns_rr *ds_gen;
1725 bool result = false;
1726 ldns_hash algo;
1727
1728 if (!dnskey || !ds ||
1733 return false;
1734 }
1735
1736 if (ldns_rr_rdf(ds, 2) == NULL) {
1737 return false;
1738 }
1739 algo = ldns_rdf2native_int8(ldns_rr_rdf(ds, 2));
1740
1741 ds_gen = ldns_key_rr2ds(dnskey, algo);
1742 if (ds_gen) {
1743 result = ldns_rr_compare(ds, ds_gen) == 0;
1744 ldns_rr_free(ds_gen);
1745 }
1746 return result;
1747}
1748
1749bool
1750ldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2)
1751{
1752 bool result;
1753 ldns_rr *rr1 = ldns_rr_clone(orr1);
1754 ldns_rr *rr2 = ldns_rr_clone(orr2);
1755
1756 /* set ttls to zero */
1757 ldns_rr_set_ttl(rr1, 0);
1758 ldns_rr_set_ttl(rr2, 0);
1759
1760 if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DS &&
1762 result = ldns_rr_compare_ds_dnskey(rr1, rr2);
1763 } else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DNSKEY &&
1765 result = ldns_rr_compare_ds_dnskey(rr2, rr1);
1766 } else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_CDS &&
1768 result = ldns_rr_compare_ds_dnskey(rr1, rr2);
1769 } else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_CDNSKEY &&
1771 result = ldns_rr_compare_ds_dnskey(rr2, rr1);
1772 } else {
1773 result = (ldns_rr_compare(rr1, rr2) == 0);
1774 }
1775
1776 ldns_rr_free(rr1);
1777 ldns_rr_free(rr2);
1778
1779 return result;
1780}
1781
1782int
1784{
1785 size_t i = 0;
1786 int rr_cmp;
1787
1788 assert(rrl1 != NULL);
1789 assert(rrl2 != NULL);
1790
1791 for (i = 0; i < ldns_rr_list_rr_count(rrl1) && i < ldns_rr_list_rr_count(rrl2); i++) {
1792 rr_cmp = ldns_rr_compare(ldns_rr_list_rr(rrl1, i), ldns_rr_list_rr(rrl2, i));
1793 if (rr_cmp != 0) {
1794 return rr_cmp;
1795 }
1796 }
1797
1798 if (i == ldns_rr_list_rr_count(rrl1) &&
1799 i != ldns_rr_list_rr_count(rrl2)) {
1800 return 1;
1801 } else if (i == ldns_rr_list_rr_count(rrl2) &&
1802 i != ldns_rr_list_rr_count(rrl1)) {
1803 return -1;
1804 } else {
1805 return 0;
1806 }
1807}
1808
1809size_t
1811{
1812 size_t rrsize;
1813 size_t i;
1814
1815 rrsize = 0;
1816 /* add all the rdf sizes */
1817 for(i = 0; i < ldns_rr_rd_count(r); i++) {
1818 rrsize += ldns_rdf_size(ldns_rr_rdf(r, i));
1819 }
1820 /* ownername */
1821 rrsize += ldns_rdf_size(ldns_rr_owner(r));
1822 rrsize += LDNS_RR_OVERHEAD;
1823 return rrsize;
1824}
1825
1826void
1828{
1829 uint16_t i;
1830
1831 if (!rr) {
1832 return;
1833 }
1834
1836
1837 /*
1838 * lowercase the rdata dnames if the rr type is one
1839 * of the list in chapter 7 of RFC3597
1840 * Also added RRSIG, because a "Signer's Name" should be canonicalized
1841 * too. See dnssec-bis-updates-16. We can add it to this list because
1842 * the "Signer's Name" is the only dname type rdata field in a RRSIG.
1843 */
1844 switch(ldns_rr_get_type(rr)) {
1845 case LDNS_RR_TYPE_NS:
1846 case LDNS_RR_TYPE_MD:
1847 case LDNS_RR_TYPE_MF:
1848 case LDNS_RR_TYPE_CNAME:
1849 case LDNS_RR_TYPE_SOA:
1850 case LDNS_RR_TYPE_MB:
1851 case LDNS_RR_TYPE_MG:
1852 case LDNS_RR_TYPE_MR:
1853 case LDNS_RR_TYPE_PTR:
1854 case LDNS_RR_TYPE_MINFO:
1855 case LDNS_RR_TYPE_MX:
1856 case LDNS_RR_TYPE_RP:
1857 case LDNS_RR_TYPE_AFSDB:
1858 case LDNS_RR_TYPE_RT:
1859 case LDNS_RR_TYPE_SIG:
1860 case LDNS_RR_TYPE_PX:
1861 case LDNS_RR_TYPE_NXT:
1862 case LDNS_RR_TYPE_NAPTR:
1863 case LDNS_RR_TYPE_KX:
1864 case LDNS_RR_TYPE_SRV:
1865 case LDNS_RR_TYPE_DNAME:
1866 case LDNS_RR_TYPE_A6:
1867 case LDNS_RR_TYPE_RRSIG:
1868 for (i = 0; i < ldns_rr_rd_count(rr); i++) {
1870 }
1871 return;
1872 default:
1873 /* do nothing */
1874 return;
1875 }
1876}
1877
1878void
1880{
1881 size_t i;
1882 for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) {
1884 }
1885}
1886
1887uint8_t
1889{
1890 if (!rr) {
1891 return 0;
1892 }
1894 ldns_rr_owner(rr));
1895}
1896
1898static const ldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN };
1899static const ldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A };
1900static const ldns_rdf_type type_ns_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1901static const ldns_rdf_type type_md_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1902static const ldns_rdf_type type_mf_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1903static const ldns_rdf_type type_cname_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1904static const ldns_rdf_type type_soa_wireformat[] = {
1908};
1909static const ldns_rdf_type type_mb_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1910static const ldns_rdf_type type_mg_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1911static const ldns_rdf_type type_mr_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1912static const ldns_rdf_type type_wks_wireformat[] = {
1914};
1915static const ldns_rdf_type type_ptr_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1916static const ldns_rdf_type type_hinfo_wireformat[] = {
1918};
1919static const ldns_rdf_type type_minfo_wireformat[] = {
1921};
1922static const ldns_rdf_type type_mx_wireformat[] = {
1924};
1925static const ldns_rdf_type type_rp_wireformat[] = {
1927};
1928static const ldns_rdf_type type_afsdb_wireformat[] = {
1930};
1931static const ldns_rdf_type type_x25_wireformat[] = { LDNS_RDF_TYPE_STR };
1932static const ldns_rdf_type type_isdn_wireformat[] = {
1934};
1935static const ldns_rdf_type type_rt_wireformat[] = {
1937};
1938static const ldns_rdf_type type_nsap_wireformat[] = {
1940};
1941static const ldns_rdf_type type_nsap_ptr_wireformat[] = {
1943};
1944static const ldns_rdf_type type_sig_wireformat[] = {
1948};
1949static const ldns_rdf_type type_key_wireformat[] = {
1951};
1952static const ldns_rdf_type type_px_wireformat[] = {
1954};
1955static const ldns_rdf_type type_gpos_wireformat[] = {
1957};
1958static const ldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA };
1959static const ldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC };
1960static const ldns_rdf_type type_nxt_wireformat[] = {
1962};
1963static const ldns_rdf_type type_eid_wireformat[] = {
1965};
1966static const ldns_rdf_type type_nimloc_wireformat[] = {
1968};
1969static const ldns_rdf_type type_srv_wireformat[] = {
1971};
1972static const ldns_rdf_type type_atma_wireformat[] = {
1974};
1975static const ldns_rdf_type type_naptr_wireformat[] = {
1977};
1978static const ldns_rdf_type type_kx_wireformat[] = {
1980};
1981static const ldns_rdf_type type_cert_wireformat[] = {
1983};
1984static const ldns_rdf_type type_a6_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN };
1985static const ldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME };
1986static const ldns_rdf_type type_sink_wireformat[] = { LDNS_RDF_TYPE_INT8,
1988};
1989static const ldns_rdf_type type_apl_wireformat[] = {
1991};
1992static const ldns_rdf_type type_ds_wireformat[] = {
1994};
1995static const ldns_rdf_type type_sshfp_wireformat[] = {
1997};
1998static const ldns_rdf_type type_ipseckey_wireformat[] = {
2000};
2001static const ldns_rdf_type type_rrsig_wireformat[] = {
2004};
2005static const ldns_rdf_type type_nsec_wireformat[] = {
2007};
2008static const ldns_rdf_type type_dhcid_wireformat[] = {
2010};
2011static const ldns_rdf_type type_talink_wireformat[] = {
2013};
2014#ifdef RRTYPE_OPENPGPKEY
2015static const ldns_rdf_type type_openpgpkey_wireformat[] = {
2017};
2018#endif
2019static const ldns_rdf_type type_csync_wireformat[] = {
2021};
2022static const ldns_rdf_type type_zonemd_wireformat[] = {
2025};
2026#ifdef RRTYPE_SVCB_HTTPS
2027static const ldns_rdf_type type_svcb_wireformat[] = {
2031};
2032#endif
2033#ifdef RRTYPE_DSYNC
2034static const ldns_rdf_type type_dsync_wireformat[] = {
2039};
2040#endif
2041#ifdef RRTYPE_HHIT_BRID
2042static const ldns_rdf_type type_hhit_wireformat[] = {
2044};
2045static const ldns_rdf_type type_brid_wireformat[] = {
2047};
2048#endif
2049
2050/* nsec3 is some vars, followed by same type of data of nsec */
2051static const ldns_rdf_type type_nsec3_wireformat[] = {
2052/* LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/
2054};
2055
2056static const ldns_rdf_type type_nsec3param_wireformat[] = {
2057/* LDNS_RDF_TYPE_NSEC3_PARAMS_VARS*/
2062};
2063
2064static const ldns_rdf_type type_dnskey_wireformat[] = {
2069};
2070static const ldns_rdf_type type_tkey_wireformat[] = {
2078};
2079static const ldns_rdf_type type_tsig_wireformat[] = {
2087};
2088static const ldns_rdf_type type_tlsa_wireformat[] = {
2093};
2094static const ldns_rdf_type type_hip_wireformat[] = {
2096};
2097static const ldns_rdf_type type_nid_wireformat[] = {
2100};
2101static const ldns_rdf_type type_l32_wireformat[] = {
2104};
2105static const ldns_rdf_type type_l64_wireformat[] = {
2108};
2109static const ldns_rdf_type type_lp_wireformat[] = {
2112};
2113static const ldns_rdf_type type_eui48_wireformat[] = {
2115};
2116static const ldns_rdf_type type_eui64_wireformat[] = {
2118};
2119static const ldns_rdf_type type_uri_wireformat[] = {
2123};
2124static const ldns_rdf_type type_caa_wireformat[] = {
2128};
2129#ifdef RRTYPE_DOA
2130static const ldns_rdf_type type_doa_wireformat[] = {
2136};
2137#endif
2138#ifdef RRTYPE_AMTRELAY
2139static const ldns_rdf_type type_amtrelay_wireformat[] = {
2141};
2142#endif
2143#ifdef RRTYPE_CLA_IPN
2144static const ldns_rdf_type type_ipn_wireformat[] = {
2146};
2147#endif
2148
2149
2150
2154/* All RR's defined in 1035 are well known and can thus
2155 * be compressed. See RFC3597. These RR's are:
2156 * CNAME HINFO MB MD MF MG MINFO MR MX NULL NS PTR SOA TXT
2157 */
2158static ldns_rr_descriptor rdata_field_descriptors[] = {
2159 /* 0 */
2160 { 0, NULL, 0, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2161 /* 1 */
2162 {LDNS_RR_TYPE_A, "A", 1, 1, type_a_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2163 /* 2 */
2164 {LDNS_RR_TYPE_NS, "NS", 1, 1, type_ns_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2165 /* 3 */
2166 {LDNS_RR_TYPE_MD, "MD", 1, 1, type_md_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2167 /* 4 */
2168 {LDNS_RR_TYPE_MF, "MF", 1, 1, type_mf_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2169 /* 5 */
2170 {LDNS_RR_TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2171 /* 6 */
2172 {LDNS_RR_TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 },
2173 /* 7 */
2174 {LDNS_RR_TYPE_MB, "MB", 1, 1, type_mb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2175 /* 8 */
2176 {LDNS_RR_TYPE_MG, "MG", 1, 1, type_mg_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2177 /* 9 */
2178 {LDNS_RR_TYPE_MR, "MR", 1, 1, type_mr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2179 /* 10 */
2180 {LDNS_RR_TYPE_NULL, "NULL", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2181 /* 11 */
2182 {LDNS_RR_TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2183 /* 12 */
2184 {LDNS_RR_TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2185 /* 13 */
2186 {LDNS_RR_TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2187 /* 14 */
2188 {LDNS_RR_TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 },
2189 /* 15 */
2190 {LDNS_RR_TYPE_MX, "MX", 2, 2, type_mx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 },
2191 /* 16 */
2192 {LDNS_RR_TYPE_TXT, "TXT", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2193 /* 17 */
2194 {LDNS_RR_TYPE_RP, "RP", 2, 2, type_rp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
2195 /* 18 */
2196 {LDNS_RR_TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2197 /* 19 */
2198 {LDNS_RR_TYPE_X25, "X25", 1, 1, type_x25_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2199 /* 20 */
2200 {LDNS_RR_TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2201 /* 21 */
2202 {LDNS_RR_TYPE_RT, "RT", 2, 2, type_rt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2203 /* 22 */
2204 {LDNS_RR_TYPE_NSAP, "NSAP", 1, 1, type_nsap_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2205 /* 23 */
2206 {LDNS_RR_TYPE_NSAP_PTR, "NSAP-PTR", 1, 1, type_nsap_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2207 /* 24 */
2208 {LDNS_RR_TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2209 /* 25 */
2210 {LDNS_RR_TYPE_KEY, "KEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2211 /* 26 */
2212 {LDNS_RR_TYPE_PX, "PX", 3, 3, type_px_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
2213 /* 27 */
2214 {LDNS_RR_TYPE_GPOS, "GPOS", 3, 3, type_gpos_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2215 /* 28 */
2216 {LDNS_RR_TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2217 /* 29 */
2218 {LDNS_RR_TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2219 /* 30 */
2220 {LDNS_RR_TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2221 /* 31 */
2222 {LDNS_RR_TYPE_EID, "EID", 1, 1, type_eid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2223 /* 32 */
2224 {LDNS_RR_TYPE_NIMLOC, "NIMLOC", 1, 1, type_nimloc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2225 /* 33 */
2226 {LDNS_RR_TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2227 /* 34 */
2228 {LDNS_RR_TYPE_ATMA, "ATMA", 1, 1, type_atma_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2229 /* 35 */
2230 {LDNS_RR_TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2231 /* 36 */
2232 {LDNS_RR_TYPE_KX, "KX", 2, 2, type_kx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2233 /* 37 */
2234 {LDNS_RR_TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2235 /* 38 */
2236 {LDNS_RR_TYPE_A6, "A6", 1, 1, type_a6_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2237 /* 39 */
2238 {LDNS_RR_TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2239 /* 40 */
2240 {LDNS_RR_TYPE_SINK, "SINK", 1, 1, type_sink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2241 /* 41 */
2242 {LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2243 /* 42 */
2244 {LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL, LDNS_RR_NO_COMPRESS, 0 },
2245 /* 43 */
2246 {LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2247 /* 44 */
2248 {LDNS_RR_TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2249 /* 45 */
2250 {LDNS_RR_TYPE_IPSECKEY, "IPSECKEY", 1, 1, type_ipseckey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2251 /* 46 */
2252 {LDNS_RR_TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2253 /* 47 */
2254 {LDNS_RR_TYPE_NSEC, "NSEC", 1, 2, type_nsec_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2255 /* 48 */
2256 {LDNS_RR_TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2257 /* 49 */
2258 {LDNS_RR_TYPE_DHCID, "DHCID", 1, 1, type_dhcid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2259 /* 50 */
2260 {LDNS_RR_TYPE_NSEC3, "NSEC3", 5, 6, type_nsec3_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2261 /* 51 */
2262 {LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2263 /* 52 */
2264 {LDNS_RR_TYPE_TLSA, "TLSA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2265
2266 {LDNS_RR_TYPE_SMIMEA, "SMIMEA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2267{LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2268
2269 /* 55
2270 * Hip ends with 0 or more Rendezvous Servers represented as dname's.
2271 * Hence the LDNS_RDF_TYPE_DNAME _variable field and the _maximum field
2272 * set to 0.
2273 */
2274 {LDNS_RR_TYPE_HIP, "HIP", 1, 1, type_hip_wireformat, LDNS_RDF_TYPE_DNAME, LDNS_RR_NO_COMPRESS, 0 },
2275
2276#ifdef RRTYPE_NINFO
2277 /* 56 */
2278 {LDNS_RR_TYPE_NINFO, "NINFO", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2279#else
2280{LDNS_RR_TYPE_NULL, "TYPE56", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2281#endif
2282#ifdef RRTYPE_RKEY
2283 /* 57 */
2284 {LDNS_RR_TYPE_RKEY, "RKEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2285#else
2286{LDNS_RR_TYPE_NULL, "TYPE57", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2287#endif
2288 /* 58 */
2289 {LDNS_RR_TYPE_TALINK, "TALINK", 2, 2, type_talink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 },
2290
2291 /* 59 */
2292 {LDNS_RR_TYPE_CDS, "CDS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2293 /* 60 */
2294 {LDNS_RR_TYPE_CDNSKEY, "CDNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2295
2296#ifdef RRTYPE_OPENPGPKEY
2297 /* 61 */
2298 {LDNS_RR_TYPE_OPENPGPKEY, "OPENPGPKEY", 1, 1, type_openpgpkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2299#else
2300{LDNS_RR_TYPE_NULL, "TYPE61", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2301#endif
2302 /* 62 */
2303 {LDNS_RR_TYPE_CSYNC, "CSYNC", 3, 3, type_csync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2304 /* 63 */
2305 {LDNS_RR_TYPE_ZONEMD, "ZONEMD", 4, 4, type_zonemd_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2306#ifdef RRTYPE_SVCB_HTTPS
2307 /* 64 */
2308 {LDNS_RR_TYPE_SVCB, "SVCB", 2, 3, type_svcb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2309 /* 65 */
2310 {LDNS_RR_TYPE_HTTPS, "HTTPS", 2, 3, type_svcb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2311
2312#else
2313{LDNS_RR_TYPE_NULL, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2314{LDNS_RR_TYPE_NULL, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2315#endif
2316#ifdef RRTYPE_DSYNC
2317 /* 66 */
2318 {LDNS_RR_TYPE_DSYNC, "DSYNC", 4, 4, type_dsync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2319#else
2320{LDNS_RR_TYPE_NULL, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2321#endif
2322#ifdef RRTYPE_HHIT_BRID
2323 /* 67 */
2324 {LDNS_RR_TYPE_HHIT, "HHIT", 1, 1, type_hhit_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2325 /* 68 */
2326 {LDNS_RR_TYPE_BRID, "BRID", 1, 1, type_brid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2327#else
2328{LDNS_RR_TYPE_NULL, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2329{LDNS_RR_TYPE_NULL, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2330#endif
2331{LDNS_RR_TYPE_NULL, "TYPE69", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2332{LDNS_RR_TYPE_NULL, "TYPE70", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2333{LDNS_RR_TYPE_NULL, "TYPE71", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2334{LDNS_RR_TYPE_NULL, "TYPE72", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2335{LDNS_RR_TYPE_NULL, "TYPE73", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2336{LDNS_RR_TYPE_NULL, "TYPE74", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2337{LDNS_RR_TYPE_NULL, "TYPE75", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2338{LDNS_RR_TYPE_NULL, "TYPE76", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2339{LDNS_RR_TYPE_NULL, "TYPE77", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2340{LDNS_RR_TYPE_NULL, "TYPE78", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2341{LDNS_RR_TYPE_NULL, "TYPE79", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2342{LDNS_RR_TYPE_NULL, "TYPE80", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2343{LDNS_RR_TYPE_NULL, "TYPE81", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2344{LDNS_RR_TYPE_NULL, "TYPE82", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2345{LDNS_RR_TYPE_NULL, "TYPE83", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2346{LDNS_RR_TYPE_NULL, "TYPE84", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2347{LDNS_RR_TYPE_NULL, "TYPE85", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2348{LDNS_RR_TYPE_NULL, "TYPE86", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2349{LDNS_RR_TYPE_NULL, "TYPE87", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2350{LDNS_RR_TYPE_NULL, "TYPE88", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2351{LDNS_RR_TYPE_NULL, "TYPE89", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2352{LDNS_RR_TYPE_NULL, "TYPE90", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2353{LDNS_RR_TYPE_NULL, "TYPE91", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2354{LDNS_RR_TYPE_NULL, "TYPE92", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2355{LDNS_RR_TYPE_NULL, "TYPE93", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2356{LDNS_RR_TYPE_NULL, "TYPE94", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2357{LDNS_RR_TYPE_NULL, "TYPE95", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2358{LDNS_RR_TYPE_NULL, "TYPE96", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2359{LDNS_RR_TYPE_NULL, "TYPE97", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2360{LDNS_RR_TYPE_NULL, "TYPE98", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2361
2362 /* 99 */
2363 {LDNS_RR_TYPE_SPF, "SPF", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2364
2365 /* UINFO [IANA-Reserved] */
2366{LDNS_RR_TYPE_NULL, "TYPE100", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2367 /* UID [IANA-Reserved] */
2368{LDNS_RR_TYPE_NULL, "TYPE101", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2369 /* GID [IANA-Reserved] */
2370{LDNS_RR_TYPE_NULL, "TYPE102", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2371 /* UNSPEC [IANA-Reserved] */
2372{LDNS_RR_TYPE_NULL, "TYPE103", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2373
2374 /* 104 */
2375 {LDNS_RR_TYPE_NID, "NID", 2, 2, type_nid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2376 /* 105 */
2377 {LDNS_RR_TYPE_L32, "L32", 2, 2, type_l32_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2378 /* 106 */
2379 {LDNS_RR_TYPE_L64, "L64", 2, 2, type_l64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2380 /* 107 */
2381 {LDNS_RR_TYPE_LP, "LP", 2, 2, type_lp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2382 /* 108 */
2383 {LDNS_RR_TYPE_EUI48, "EUI48", 1, 1, type_eui48_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2384 /* 109 */
2385 {LDNS_RR_TYPE_EUI64, "EUI64", 1, 1, type_eui64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2386
2387{LDNS_RR_TYPE_NULL, "TYPE110", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2388{LDNS_RR_TYPE_NULL, "TYPE111", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2389{LDNS_RR_TYPE_NULL, "TYPE112", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2390{LDNS_RR_TYPE_NULL, "TYPE113", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2391{LDNS_RR_TYPE_NULL, "TYPE114", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2392{LDNS_RR_TYPE_NULL, "TYPE115", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2393{LDNS_RR_TYPE_NULL, "TYPE116", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2394{LDNS_RR_TYPE_NULL, "TYPE117", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2395{LDNS_RR_TYPE_NULL, "TYPE118", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2396{LDNS_RR_TYPE_NULL, "TYPE119", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2397{LDNS_RR_TYPE_NULL, "TYPE120", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2398{LDNS_RR_TYPE_NULL, "TYPE121", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2399{LDNS_RR_TYPE_NULL, "TYPE122", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2400{LDNS_RR_TYPE_NULL, "TYPE123", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2401{LDNS_RR_TYPE_NULL, "TYPE124", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2402{LDNS_RR_TYPE_NULL, "TYPE125", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2403{LDNS_RR_TYPE_NULL, "TYPE126", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2404{LDNS_RR_TYPE_NULL, "TYPE127", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2405{LDNS_RR_TYPE_NXNAME, "NXNAME", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2406{LDNS_RR_TYPE_NULL, "TYPE129", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2407{LDNS_RR_TYPE_NULL, "TYPE130", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2408{LDNS_RR_TYPE_NULL, "TYPE131", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2409{LDNS_RR_TYPE_NULL, "TYPE132", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2410{LDNS_RR_TYPE_NULL, "TYPE133", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2411{LDNS_RR_TYPE_NULL, "TYPE134", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2412{LDNS_RR_TYPE_NULL, "TYPE135", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2413{LDNS_RR_TYPE_NULL, "TYPE136", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2414{LDNS_RR_TYPE_NULL, "TYPE137", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2415{LDNS_RR_TYPE_NULL, "TYPE138", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2416{LDNS_RR_TYPE_NULL, "TYPE139", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2417{LDNS_RR_TYPE_NULL, "TYPE140", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2418{LDNS_RR_TYPE_NULL, "TYPE141", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2419{LDNS_RR_TYPE_NULL, "TYPE142", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2420{LDNS_RR_TYPE_NULL, "TYPE143", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2421{LDNS_RR_TYPE_NULL, "TYPE144", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2422{LDNS_RR_TYPE_NULL, "TYPE145", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2423{LDNS_RR_TYPE_NULL, "TYPE146", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2424{LDNS_RR_TYPE_NULL, "TYPE147", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2425{LDNS_RR_TYPE_NULL, "TYPE148", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2426{LDNS_RR_TYPE_NULL, "TYPE149", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2427{LDNS_RR_TYPE_NULL, "TYPE150", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2428{LDNS_RR_TYPE_NULL, "TYPE151", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2429{LDNS_RR_TYPE_NULL, "TYPE152", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2430{LDNS_RR_TYPE_NULL, "TYPE153", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2431{LDNS_RR_TYPE_NULL, "TYPE154", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2432{LDNS_RR_TYPE_NULL, "TYPE155", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2433{LDNS_RR_TYPE_NULL, "TYPE156", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2434{LDNS_RR_TYPE_NULL, "TYPE157", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2435{LDNS_RR_TYPE_NULL, "TYPE158", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2436{LDNS_RR_TYPE_NULL, "TYPE159", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2437{LDNS_RR_TYPE_NULL, "TYPE160", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2438{LDNS_RR_TYPE_NULL, "TYPE161", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2439{LDNS_RR_TYPE_NULL, "TYPE162", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2440{LDNS_RR_TYPE_NULL, "TYPE163", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2441{LDNS_RR_TYPE_NULL, "TYPE164", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2442{LDNS_RR_TYPE_NULL, "TYPE165", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2443{LDNS_RR_TYPE_NULL, "TYPE166", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2444{LDNS_RR_TYPE_NULL, "TYPE167", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2445{LDNS_RR_TYPE_NULL, "TYPE168", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2446{LDNS_RR_TYPE_NULL, "TYPE169", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2447{LDNS_RR_TYPE_NULL, "TYPE170", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2448{LDNS_RR_TYPE_NULL, "TYPE171", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2449{LDNS_RR_TYPE_NULL, "TYPE172", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2450{LDNS_RR_TYPE_NULL, "TYPE173", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2451{LDNS_RR_TYPE_NULL, "TYPE174", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2452{LDNS_RR_TYPE_NULL, "TYPE175", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2453{LDNS_RR_TYPE_NULL, "TYPE176", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2454{LDNS_RR_TYPE_NULL, "TYPE177", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2455{LDNS_RR_TYPE_NULL, "TYPE178", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2456{LDNS_RR_TYPE_NULL, "TYPE179", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2457{LDNS_RR_TYPE_NULL, "TYPE180", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2458{LDNS_RR_TYPE_NULL, "TYPE181", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2459{LDNS_RR_TYPE_NULL, "TYPE182", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2460{LDNS_RR_TYPE_NULL, "TYPE183", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2461{LDNS_RR_TYPE_NULL, "TYPE184", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2462{LDNS_RR_TYPE_NULL, "TYPE185", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2463{LDNS_RR_TYPE_NULL, "TYPE186", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2464{LDNS_RR_TYPE_NULL, "TYPE187", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2465{LDNS_RR_TYPE_NULL, "TYPE188", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2466{LDNS_RR_TYPE_NULL, "TYPE189", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2467{LDNS_RR_TYPE_NULL, "TYPE190", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2468{LDNS_RR_TYPE_NULL, "TYPE191", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2469{LDNS_RR_TYPE_NULL, "TYPE192", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2470{LDNS_RR_TYPE_NULL, "TYPE193", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2471{LDNS_RR_TYPE_NULL, "TYPE194", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2472{LDNS_RR_TYPE_NULL, "TYPE195", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2473{LDNS_RR_TYPE_NULL, "TYPE196", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2474{LDNS_RR_TYPE_NULL, "TYPE197", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2475{LDNS_RR_TYPE_NULL, "TYPE198", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2476{LDNS_RR_TYPE_NULL, "TYPE199", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2477{LDNS_RR_TYPE_NULL, "TYPE200", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2478{LDNS_RR_TYPE_NULL, "TYPE201", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2479{LDNS_RR_TYPE_NULL, "TYPE202", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2480{LDNS_RR_TYPE_NULL, "TYPE203", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2481{LDNS_RR_TYPE_NULL, "TYPE204", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2482{LDNS_RR_TYPE_NULL, "TYPE205", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2483{LDNS_RR_TYPE_NULL, "TYPE206", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2484{LDNS_RR_TYPE_NULL, "TYPE207", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2485{LDNS_RR_TYPE_NULL, "TYPE208", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2486{LDNS_RR_TYPE_NULL, "TYPE209", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2487{LDNS_RR_TYPE_NULL, "TYPE210", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2488{LDNS_RR_TYPE_NULL, "TYPE211", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2489{LDNS_RR_TYPE_NULL, "TYPE212", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2490{LDNS_RR_TYPE_NULL, "TYPE213", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2491{LDNS_RR_TYPE_NULL, "TYPE214", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2492{LDNS_RR_TYPE_NULL, "TYPE215", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2493{LDNS_RR_TYPE_NULL, "TYPE216", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2494{LDNS_RR_TYPE_NULL, "TYPE217", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2495{LDNS_RR_TYPE_NULL, "TYPE218", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2496{LDNS_RR_TYPE_NULL, "TYPE219", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2497{LDNS_RR_TYPE_NULL, "TYPE220", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2498{LDNS_RR_TYPE_NULL, "TYPE221", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2499{LDNS_RR_TYPE_NULL, "TYPE222", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2500{LDNS_RR_TYPE_NULL, "TYPE223", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2501{LDNS_RR_TYPE_NULL, "TYPE224", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2502{LDNS_RR_TYPE_NULL, "TYPE225", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2503{LDNS_RR_TYPE_NULL, "TYPE226", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2504{LDNS_RR_TYPE_NULL, "TYPE227", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2505{LDNS_RR_TYPE_NULL, "TYPE228", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2506{LDNS_RR_TYPE_NULL, "TYPE229", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2507{LDNS_RR_TYPE_NULL, "TYPE230", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2508{LDNS_RR_TYPE_NULL, "TYPE231", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2509{LDNS_RR_TYPE_NULL, "TYPE232", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2510{LDNS_RR_TYPE_NULL, "TYPE233", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2511{LDNS_RR_TYPE_NULL, "TYPE234", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2512{LDNS_RR_TYPE_NULL, "TYPE235", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2513{LDNS_RR_TYPE_NULL, "TYPE236", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2514{LDNS_RR_TYPE_NULL, "TYPE237", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2515{LDNS_RR_TYPE_NULL, "TYPE238", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2516{LDNS_RR_TYPE_NULL, "TYPE239", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2517{LDNS_RR_TYPE_NULL, "TYPE240", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2518{LDNS_RR_TYPE_NULL, "TYPE241", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2519{LDNS_RR_TYPE_NULL, "TYPE242", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2520{LDNS_RR_TYPE_NULL, "TYPE243", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2521{LDNS_RR_TYPE_NULL, "TYPE244", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2522{LDNS_RR_TYPE_NULL, "TYPE245", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2523{LDNS_RR_TYPE_NULL, "TYPE246", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2524{LDNS_RR_TYPE_NULL, "TYPE247", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2525{LDNS_RR_TYPE_NULL, "TYPE248", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2526
2527 /* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one.
2528 * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9.
2529 */
2530 /* 249 */
2531 {LDNS_RR_TYPE_TKEY, "TKEY", 7, 7, type_tkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2532 /* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one.
2533 * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9.
2534 */
2535 /* 250 */
2536 {LDNS_RR_TYPE_TSIG, "TSIG", 7, 7, type_tsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 },
2537
2538 /* IXFR: A request for a transfer of an incremental zone transfer */
2539{LDNS_RR_TYPE_NULL, "TYPE251", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2540 /* AXFR: A request for a transfer of an entire zone */
2541{LDNS_RR_TYPE_NULL, "TYPE252", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2542 /* MAILB: A request for mailbox-related records (MB, MG or MR) */
2543{LDNS_RR_TYPE_NULL, "TYPE253", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2544 /* MAILA: A request for mail agent RRs (Obsolete - see MX) */
2545{LDNS_RR_TYPE_NULL, "TYPE254", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2546 /* ANY: A request for all (available) records */
2547{LDNS_RR_TYPE_NULL, "TYPE255", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2548
2549 /* 256 */
2550 {LDNS_RR_TYPE_URI, "URI", 3, 3, type_uri_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2551 /* 257 */
2552 {LDNS_RR_TYPE_CAA, "CAA", 3, 3, type_caa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2553
2554#ifdef RRTYPE_AVC
2555 /* 258 */
2556 {LDNS_RR_TYPE_AVC, "AVC", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2557#else
2558{LDNS_RR_TYPE_NULL, "TYPE258", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2559#endif
2560#ifdef RRTYPE_DOA
2561 /* 259 */
2562 {LDNS_RR_TYPE_DOA, "DOA", 5, 5, type_doa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2563#else
2564{LDNS_RR_TYPE_NULL, "TYPE259", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2565#endif
2566#ifdef RRTYPE_AMTRELAY
2567 /* 260 */
2568 {LDNS_RR_TYPE_AMTRELAY, "AMTRELAY", 1, 1, type_amtrelay_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2569#else
2570{LDNS_RR_TYPE_NULL, "TYPE260", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2571#endif
2572#ifdef RRTYPE_RESINFO
2573 /* 261 */
2575#else
2576{LDNS_RR_TYPE_NULL, "TYPE261", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2577#endif
2578 /* 262 */
2579 {LDNS_RR_TYPE_WALLET, "WALLET", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2580#ifdef RRTYPE_CLA_IPN
2581 /* 263 */
2582 {LDNS_RR_TYPE_CLA, "CLA", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 },
2583 /* 264 */
2584 {LDNS_RR_TYPE_IPN, "IPN", 1, 1, type_ipn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2585#else
2586{LDNS_RR_TYPE_NULL, "TYPE263", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2587{LDNS_RR_TYPE_NULL, "TYPE264", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2588#endif
2589/* split in array, no longer contiguous */
2590
2591#ifdef RRTYPE_TA
2592 /* 32768 */
2593 {LDNS_RR_TYPE_TA, "TA", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2594#else
2595{LDNS_RR_TYPE_NULL, "TYPE32768", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
2596#endif
2597 /* 32769 */
2598 {LDNS_RR_TYPE_DLV, "DLV", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }
2599};
2606#define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \
2607 (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0]))
2608
2609
2610/*---------------------------------------------------------------------------*
2611 * The functions below return an bitmap RDF with the space required to set
2612 * or unset all known RR types. Arguably these functions are better situated
2613 * in rdata.c, however for the space calculation it is necessary to walk
2614 * through rdata_field_descriptors which is not easily possible from anywhere
2615 * other than rr.c where it is declared static.
2616 *
2617 * Alternatively rr.c could have provided an iterator for rr_type or
2618 * rdf_descriptors, but this seemed overkill for internal use only.
2619 */
2620static ldns_rr_descriptor* rdata_field_descriptors_end =
2621 &rdata_field_descriptors[LDNS_RDATA_FIELD_DESCRIPTORS_COUNT];
2622
2623/* From RFC3845:
2624 *
2625 * 2.1.2. The List of Type Bit Map(s) Field
2626 *
2627 * The RR type space is split into 256 window blocks, each representing
2628 * the low-order 8 bits of the 16-bit RR type space. Each block that
2629 * has at least one active RR type is encoded using a single octet
2630 * window number (from 0 to 255), a single octet bitmap length (from 1
2631 * to 32) indicating the number of octets used for the window block's
2632 * bitmap, and up to 32 octets (256 bits) of bitmap.
2633 *
2634 * Window blocks are present in the NSEC RR RDATA in increasing
2635 * numerical order.
2636 *
2637 * "|" denotes concatenation
2638 *
2639 * Type Bit Map(s) Field = ( Window Block # | Bitmap Length | Bitmap ) +
2640 *
2641 * <cut>
2642 *
2643 * Blocks with no types present MUST NOT be included. Trailing zero
2644 * octets in the bitmap MUST be omitted. The length of each block's
2645 * bitmap is determined by the type code with the largest numerical
2646 * value within that block, among the set of RR types present at the
2647 * NSEC RR's owner name. Trailing zero octets not specified MUST be
2648 * interpreted as zero octets.
2649 */
2650static ldns_status
2651ldns_rdf_bitmap_known_rr_types_set(ldns_rdf** rdf, int value)
2652{
2653 uint8_t window; /* most significant octet of type */
2654 uint8_t subtype; /* least significant octet of type */
2655 uint16_t windows[256] /* Max subtype per window */
2656#ifndef S_SPLINT_S
2657 = { 0 }
2658#endif
2659 ;
2660 ldns_rr_descriptor* d; /* used to traverse rdata_field_descriptors */
2661 size_t i; /* used to traverse windows array */
2662
2663 size_t sz; /* size needed for type bitmap rdf */
2664 uint8_t* data = NULL; /* rdf data */
2665 uint8_t* dptr; /* used to itraverse rdf data */
2666
2667 assert(rdf != NULL);
2668
2669 /* Which windows need to be in the bitmap rdf?
2670 */
2671 for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) {
2672 window = d->_type >> 8;
2673 subtype = d->_type & 0xff;
2674
2675 /* In the code below, windows[window] == 0 means that the
2676 * window is not in use. So subtype == 0 is a problem. The
2677 * easiest solution is to set subtype to 1, that marks the
2678 * window as in use and doesn't have negative effects.
2679 */
2680 if (subtype == 0)
2681 subtype = 1;
2682 if (windows[window] < subtype) {
2683 windows[window] = subtype;
2684 }
2685 }
2686
2687 /* How much space do we need in the rdf for those windows?
2688 */
2689 sz = 0;
2690 for (i = 0; i < 256; i++) {
2691 if (windows[i]) {
2692 sz += windows[i] / 8 + 3;
2693 }
2694 }
2695 if (sz > 0) {
2696 /* Format rdf data according RFC3845 Section 2.1.2 (see above)
2697 */
2698 dptr = data = LDNS_XMALLOC(uint8_t, sz);
2699 if (!data) {
2700 return LDNS_STATUS_MEM_ERR;
2701 }
2702 memset(data, value, sz);
2703 for (i = 0; i < 256; i++) {
2704 if (windows[i]) {
2705 *dptr++ = (uint8_t)i;
2706 *dptr++ = (uint8_t)(windows[i] / 8 + 1);
2707 dptr += dptr[-1];
2708 }
2709 }
2710 }
2711 /* Allocate and return rdf structure for the data
2712 */
2713 *rdf = ldns_rdf_new(LDNS_RDF_TYPE_BITMAP, sz, data);
2714 if (!*rdf) {
2715 LDNS_FREE(data);
2716 return LDNS_STATUS_MEM_ERR;
2717 }
2718 return LDNS_STATUS_OK;
2719}
2720
2723{
2724 return ldns_rdf_bitmap_known_rr_types_set(rdf, 0);
2725}
2726
2729{
2730 return ldns_rdf_bitmap_known_rr_types_set(rdf, 255);
2731}
2732/* End of RDF bitmap functions
2733 *---------------------------------------------------------------------------*/
2734
2735
2736const ldns_rr_descriptor *
2737ldns_rr_descript(uint16_t type)
2738{
2739 size_t i;
2741 return &rdata_field_descriptors[type];
2742 } else {
2743 /* because not all array index equals type code */
2746 i++) {
2747 if (rdata_field_descriptors[i]._type == type) {
2748 return &rdata_field_descriptors[i];
2749 }
2750 }
2751 return &rdata_field_descriptors[0];
2752 }
2753}
2754
2755size_t
2757{
2758 if (descriptor) {
2759 return descriptor->_minimum;
2760 } else {
2761 return 0;
2762 }
2763}
2764
2765size_t
2767{
2768 if (descriptor) {
2769 if (descriptor->_variable != LDNS_RDF_TYPE_NONE) {
2770 /* Should really be SIZE_MAX... bad FreeBSD. */
2771 return UINT_MAX;
2772 } else {
2773 return descriptor->_maximum;
2774 }
2775 } else {
2776 return 0;
2777 }
2778}
2779
2782 size_t index)
2783{
2784 assert(descriptor != NULL);
2785 assert(index < descriptor->_maximum
2786 || descriptor->_variable != LDNS_RDF_TYPE_NONE);
2787 if (index < descriptor->_maximum) {
2788 return descriptor->_wireformat[index];
2789 } else {
2790 return descriptor->_variable;
2791 }
2792}
2793
2796{
2797 unsigned int i;
2798 const char *desc_name;
2799 const ldns_rr_descriptor *desc;
2800
2801 /* TYPEXX representation */
2802 if (strlen(name) > 4 && strncasecmp(name, "TYPE", 4) == 0) {
2803 return atoi(name + 4);
2804 }
2805
2806 /* Normal types */
2807 for (i = 0; i < (unsigned int) LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; i++) {
2808 desc = &rdata_field_descriptors[i];
2809 desc_name = desc->_name;
2810 if(desc_name &&
2811 strlen(name) == strlen(desc_name) &&
2812 strncasecmp(name, desc_name, strlen(desc_name)) == 0) {
2813 /* because not all array index equals type code */
2814 return desc->_type;
2815 }
2816 }
2817
2818 /* special cases for query types */
2819 if (strlen(name) == 4 && strncasecmp(name, "IXFR", 4) == 0) {
2820 return 251;
2821 } else if (strlen(name) == 4 && strncasecmp(name, "AXFR", 4) == 0) {
2822 return 252;
2823 } else if (strlen(name) == 5 && strncasecmp(name, "MAILB", 5) == 0) {
2824 return 253;
2825 } else if (strlen(name) == 5 && strncasecmp(name, "MAILA", 5) == 0) {
2826 return 254;
2827 } else if (strlen(name) == 3 && strncasecmp(name, "ANY", 3) == 0) {
2828 return 255;
2829 }
2830
2831 return 0;
2832}
2833
2836{
2838
2839 /* CLASSXX representation */
2840 if (strlen(name) > 5 && strncasecmp(name, "CLASS", 5) == 0) {
2841 return atoi(name + 5);
2842 }
2843
2844 /* Normal types */
2846
2847 if (lt) {
2848 return lt->id;
2849 }
2850 return 0;
2851}
2852
2853
2856{
2857 ldns_rr_type r;
2858
2859 if (!rd) {
2860 return 0;
2861 }
2862
2864 return 0;
2865 }
2866
2868 return r;
2869}
2870
2873{
2874 if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) {
2875 return ldns_rr_get_type(ldns_rr_list_rr(rr_list, 0));
2876 } else {
2877 return 0;
2878 }
2879}
2880
2881ldns_rdf *
2883{
2884 if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) {
2885 return ldns_rr_owner(ldns_rr_list_rr(rr_list, 0));
2886 } else {
2887 return NULL;
2888 }
2889}
void ldns_buffer_free(ldns_buffer *buffer)
frees the buffer.
Definition buffer.c:137
ldns_buffer * ldns_buffer_new(size_t capacity)
creates a new buffer with the specified capacity.
Definition buffer.c:16
void ldns_buffer_new_frm_data(ldns_buffer *buffer, const void *data, size_t size)
creates a buffer with the specified data.
Definition buffer.c:41
signed char ldns_dname_str_absolute(const char *dname_str)
Checks whether the given dname string is absolute (i.e.
Definition dname.c:518
int ldns_dname_compare(const ldns_rdf *dname1, const ldns_rdf *dname2)
Compares the two dname rdf's according to the algorithm for ordering in RFC4034 Section 6.
Definition dname.c:359
void ldns_dname2canonical(const ldns_rdf *rdf)
Put a dname into canonical fmt - ie.
Definition dname.c:280
uint8_t ldns_dname_label_count(const ldns_rdf *r)
count the number of labels inside a LDNS_RDF_DNAME type rdf.
Definition dname.c:214
ldns_status ldns_dname_cat(ldns_rdf *rd1, const ldns_rdf *rd2)
concatenates rd2 after rd1 (rd2 is copied, rd1 is modified)
Definition dname.c:90
ldns_rdf * ldns_dname_new_frm_str(const char *str)
creates a new dname rdf from a string.
Definition dname.c:268
ldns_rr * ldns_key_rr2ds(const ldns_rr *key, ldns_hash h)
returns a new DS rr that represents the given key rr.
Definition dnssec.c:509
@ LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR
Definition error.h:130
@ LDNS_STATUS_SYNTAX_ERR
Definition error.h:97
@ LDNS_STATUS_SYNTAX_DNAME_ERR
Definition error.h:84
@ LDNS_STATUS_MEM_ERR
Definition error.h:34
@ LDNS_STATUS_SYNTAX_TTL
Definition error.h:88
@ LDNS_STATUS_SYNTAX_RDATA_ERR
Definition error.h:83
@ LDNS_STATUS_SYNTAX_TYPE_ERR
Definition error.h:79
@ LDNS_STATUS_OK
Definition error.h:26
@ LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR
Definition error.h:93
@ LDNS_STATUS_SYNTAX_EMPTY
Definition error.h:91
@ LDNS_STATUS_SYNTAX_CLASS_ERR
Definition error.h:80
@ LDNS_STATUS_SYNTAX_INCLUDE
Definition error.h:90
@ LDNS_STATUS_SYNTAX_TTL_ERR
Definition error.h:81
@ LDNS_STATUS_SYNTAX_ORIGIN
Definition error.h:89
enum ldns_enum_status ldns_status
Definition error.h:149
ldns_status ldns_rr2buffer_wire(ldns_buffer *output, const ldns_rr *rr, int section)
Copies the rr data to the buffer in wire format.
Definition host2wire.c:244
ldns_status ldns_rr2buffer_wire_canonical(ldns_buffer *output, const ldns_rr *rr, int section)
Copies the rr data to the buffer in wire format, in canonical format according to RFC3597 (every dnam...
Definition host2wire.c:171
enum ldns_enum_hash ldns_hash
Definition keys.h:76
Including this file will include all ldns files, and define some lookup tables.
#define LDNS_DEFAULT_TTL
Definition ldns.h:136
ldns_lookup_table ldns_rr_classes[]
rr types
Definition host2str.c:99
#define LDNS_MAX_PACKETLEN
Definition packet.h:24
@ LDNS_SECTION_ANY
bogus section, if not interested
Definition packet.h:283
ldns_status ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, signed char fixed, const char *delim, int *line_nr)
returns a token/char from the stream f.
Definition parse.c:226
#define LDNS_PARSE_SKIP_SPACE
Definition parse.h:20
ssize_t ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit)
returns a token/char from the buffer b.
Definition parse.c:301
uint32_t ldns_str2period(const char *nptr, const char **endptr)
converts a ttl value (like 5d2h) to a long.
Definition rdata.c:697
ldns_rdf * ldns_rdf_new_frm_str(ldns_rdf_type type, const char *str)
creates a new rdf from a string.
Definition rdata.c:249
uint8_t * ldns_rdf_data(const ldns_rdf *rd)
returns the data of the rdf.
Definition rdata.c:38
ldns_rdf * ldns_rdf_clone(const ldns_rdf *rd)
clones a rdf structure.
Definition rdata.c:222
ldns_rdf_type ldns_rdf_get_type(const ldns_rdf *rd)
returns the type of the rdf.
Definition rdata.c:31
void ldns_rdf_set_type(ldns_rdf *rd, ldns_rdf_type type)
sets the size of the rdf.
Definition rdata.c:53
void ldns_rdf_deep_free(ldns_rdf *rd)
frees a rdf structure and frees the data.
Definition rdata.c:230
#define LDNS_MAX_RDFLEN
Definition rdata.h:31
uint16_t ldns_rdf2native_int16(const ldns_rdf *rd)
returns the native uint16_t representation from the rdf.
Definition rdata.c:84
uint8_t ldns_rdf2native_int8(const ldns_rdf *rd)
returns the native uint8_t representation from the rdf.
Definition rdata.c:70
@ LDNS_RDF_TYPE_INT32
32 bits
Definition rdata.h:56
@ LDNS_RDF_TYPE_TAG
A non-zero sequence of US-ASCII letters and numbers in lower case.
Definition rdata.h:132
@ LDNS_RDF_TYPE_NSAP
NSAP.
Definition rdata.h:106
@ LDNS_RDF_TYPE_HIP
Represents the Public Key Algorithm, HIT and Public Key fields for the HIP RR types.
Definition rdata.h:95
@ LDNS_RDF_TYPE_IPN
draft-johnson-dns-ipn-cla-07
Definition rdata.h:155
@ LDNS_RDF_TYPE_NSEC3_NEXT_OWNER
nsec3 base32 string (with length byte on wire
Definition rdata.h:114
@ LDNS_RDF_TYPE_CERT_ALG
certificate algorithm
Definition rdata.h:81
@ LDNS_RDF_TYPE_EUI48
6 * 8 bit hex numbers separated by dashes.
Definition rdata.h:122
@ LDNS_RDF_TYPE_EUI64
8 * 8 bit hex numbers separated by dashes.
Definition rdata.h:124
@ LDNS_RDF_TYPE_PERIOD
period
Definition rdata.h:89
@ LDNS_RDF_TYPE_B64
b64 string
Definition rdata.h:70
@ LDNS_RDF_TYPE_AAAA
AAAA record.
Definition rdata.h:62
@ LDNS_RDF_TYPE_UNKNOWN
unknown types
Definition rdata.h:85
@ LDNS_RDF_TYPE_WKS
well known services
Definition rdata.h:104
@ LDNS_RDF_TYPE_DNAME
domain name
Definition rdata.h:50
@ LDNS_RDF_TYPE_TIME
time (32 bits)
Definition rdata.h:87
@ LDNS_RDF_TYPE_BITMAP
Definition rdata.h:75
@ LDNS_RDF_TYPE_SVCPARAMS
draft-ietf-dnsop-svcb-https
Definition rdata.h:152
@ LDNS_RDF_TYPE_NSEC
nsec type codes
Definition rdata.h:74
@ LDNS_RDF_TYPE_SELECTOR
Definition rdata.h:145
@ LDNS_RDF_TYPE_NSEC3_SALT
nsec3 hash salt
Definition rdata.h:112
@ LDNS_RDF_TYPE_APL
apl data
Definition rdata.h:66
@ LDNS_RDF_TYPE_A
A record.
Definition rdata.h:60
@ LDNS_RDF_TYPE_LONG_STR
A <character-string> encoding of the value field as specified [RFC1035], Section 5....
Definition rdata.h:138
@ LDNS_RDF_TYPE_LOC
location data
Definition rdata.h:102
@ LDNS_RDF_TYPE_INT16_DATA
variable length any type rdata where the length is specified by the first 2 bytes
Definition rdata.h:98
@ LDNS_RDF_TYPE_ILNP64
4 shorts represented as 4 * 16 bit hex numbers separated by colons.
Definition rdata.h:119
@ LDNS_RDF_TYPE_ATMA
ATMA.
Definition rdata.h:108
@ LDNS_RDF_TYPE_HEX
hex string
Definition rdata.h:72
@ LDNS_RDF_TYPE_NONE
none
Definition rdata.h:48
@ LDNS_RDF_TYPE_INT8
8 bits
Definition rdata.h:52
@ LDNS_RDF_TYPE_MATCHING_TYPE
Definition rdata.h:146
@ LDNS_RDF_TYPE_IPSECKEY
IPSECKEY.
Definition rdata.h:110
@ LDNS_RDF_TYPE_CERTIFICATE_USAGE
Since RFC7218 TLSA records can be given with mnemonics, hence these rdata field types.
Definition rdata.h:144
@ LDNS_RDF_TYPE_STR
txt string
Definition rdata.h:64
@ LDNS_RDF_TYPE_INT16
16 bits
Definition rdata.h:54
@ LDNS_RDF_TYPE_ALG
a key algorithm
Definition rdata.h:83
@ LDNS_RDF_TYPE_AMTRELAY
draft-ietf-mboned-driad-amt-discovery
Definition rdata.h:149
@ LDNS_RDF_TYPE_UNQUOTED
Character string without quotes.
Definition rdata.h:127
@ LDNS_RDF_TYPE_TSIGTIME
tsig time 48 bits
Definition rdata.h:91
@ LDNS_RDF_TYPE_TYPE
a RR type
Definition rdata.h:77
size_t ldns_rdf_size(const ldns_rdf *rd)
returns the size of the rdf.
Definition rdata.c:24
ldns_rdf * ldns_rdf_new(ldns_rdf_type type, size_t size, void *data)
allocates a new rdf structure and fills it.
Definition rdata.c:179
int ldns_rdf_compare(const ldns_rdf *rd1, const ldns_rdf *rd2)
compares two rdf's on their wire formats.
Definition rdata.c:663
enum ldns_enum_rdf_type ldns_rdf_type
Definition rdata.h:157
void ldns_rr_list_free(ldns_rr_list *rr_list)
frees an rr_list structure.
Definition rr.c:1009
ldns_rr_class ldns_get_rr_class_by_name(const char *name)
retrieves a class by looking up its name.
Definition rr.c:2835
ldns_status ldns_rr_new_frm_str(ldns_rr **newrr, const char *str, uint32_t default_ttl, const ldns_rdf *origin, ldns_rdf **prev)
creates an rr from a string.
Definition rr.c:670
uint32_t ldns_rr_ttl(const ldns_rr *rr)
returns the ttl of an rr structure.
Definition rr.c:929
ldns_rdf * ldns_rr_pop_rdf(ldns_rr *rr)
removes a rd_field member, it will be popped from the last position.
Definition rr.c:878
ldns_rr_type ldns_rdf2rr_type(const ldns_rdf *rd)
convert an rdf of type LDNS_RDF_TYPE_TYPE to an actual LDNS_RR_TYPE.
Definition rr.c:2855
ldns_status ldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr)
creates a new rr from a file containing a string.
Definition rr.c:794
void ldns_rr_list_deep_free(ldns_rr_list *rr_list)
frees an rr_list structure and all rrs contained therein.
Definition rr.c:1018
void ldns_rr_free(ldns_rr *rr)
frees an RR structure
Definition rr.c:81
void ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner)
sets the owner in the rr structure.
Definition rr.c:802
#define _BUFFER_IS_AT_WHITESPACE(rd_buf)
Definition rr.c:26
ldns_rr_list * ldns_rr_list_new(void)
creates a new rr_list structure.
Definition rr.c:998
ldns_rr_type ldns_rr_list_type(const ldns_rr_list *rr_list)
Returns the type of the first element of the RR If there are no elements present, 0 is returned.
Definition rr.c:2872
ldns_rr * ldns_rr_list_pop_rr(ldns_rr_list *rr_list)
pops the last rr from an rrlist.
Definition rr.c:1175
#define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT
computes the number of rdata fields
Definition rr.c:2606
#define LDNS_TTL_DATALEN
Definition rr.c:20
#define LDNS_RRLIST_INIT
Definition rr.c:21
ldns_rr * ldns_rr_set_pop_rr(ldns_rr_list *rr_list)
pops the last rr from an rrset.
Definition rr.c:1380
ldns_rdf * ldns_rr_list_owner(const ldns_rr_list *rr_list)
Returns the owner domain name rdf of the first element of the RR If there are no elements present,...
Definition rr.c:2882
signed char ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr)
pushes an rr to an rrset (which really are rr_list's).
Definition rr.c:1332
ldns_rr_list * ldns_rr_list_pop_rrset(ldns_rr_list *rr_list)
pops the first rrset from the list, the list must be sorted, so that all rr's from each rrset are nex...
Definition rr.c:1386
ldns_rr * ldns_rr_new(void)
creates a new rr structure.
Definition rr.c:30
ldns_status ldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev)
creates a new rr from a file containing a string.
Definition rr.c:713
signed char ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, const ldns_rr *rr)
returns true if the given rr is one of the rrs in the list, or if it is equal to one
Definition rr.c:1238
void ldns_rr_list_sort(ldns_rr_list *unsorted)
sorts an rr_list (canonical wire format).
Definition rr.c:1554
#define _IS_WHITESPACE(chr)
Definition rr.c:23
ldns_rr * ldns_rr_new_frm_type(ldns_rr_type t)
creates a new rr structure, based on the given type.
Definition rr.c:48
void ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type)
sets the type in the rr.
Definition rr.c:826
ldns_rr_list * ldns_rr_list_cat_clone(const ldns_rr_list *left, const ldns_rr_list *right)
concatenates two ldns_rr_lists together, but makes clones of the rr's (instead of pointer copying).
Definition rr.c:1057
signed char ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr)
pushes an rr to an rrlist.
Definition rr.c:1130
signed char ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list)
pushes an rr_list to an rrlist.
Definition rr.c:1161
signed char ldns_rr_is_question(const ldns_rr *rr)
returns the question flag of an rr structure.
Definition rr.c:923
void ldns_rr2canonical(ldns_rr *rr)
converts each dname in a rr to its canonical form.
Definition rr.c:1827
size_t ldns_rr_rd_count(const ldns_rr *rr)
returns the rd_count of an rr structure.
Definition rr.c:935
ldns_rdf * ldns_rr_rdf(const ldns_rr *rr, size_t nr)
returns the rdata field member counter.
Definition rr.c:907
ldns_rr_list * ldns_rr_list_subtype_by_rdf(const ldns_rr_list *l, const ldns_rdf *r, size_t pos)
Return the rr_list which matches the rdf at position field.
Definition rr.c:1096
uint8_t ldns_rr_label_count(const ldns_rr *rr)
counts the number of labels of the ownername.
Definition rr.c:1888
ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, size_t index)
returns the rdf type for the given rdata field number of the rr type for the given descriptor.
Definition rr.c:2781
signed char ldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2)
returns true of the given rr's are equal.
Definition rr.c:1750
size_t ldns_rr_list_rr_count(const ldns_rr_list *rr_list)
returns the number of rr's in an rr_list.
Definition rr.c:955
#define LDNS_SYNTAX_DATALEN
Definition rr.c:19
int ldns_rr_compare_wire(const ldns_buffer *rr1_buf, const ldns_buffer *rr2_buf)
compares the wireformat of two rrs, contained in the given buffers.
Definition rr.c:1638
void ldns_rr_list2canonical(const ldns_rr_list *rr_list)
converts each dname in each rr in a rr_list to its canonical form.
Definition rr.c:1879
ldns_rr_list * ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t howmany)
pops an rr_list of size s from an rrlist.
Definition rr.c:1208
ldns_rr_type ldns_rr_get_type(const ldns_rr *rr)
returns the type of the rr.
Definition rr.c:941
void ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl)
sets the ttl in the rr structure.
Definition rr.c:814
ldns_rdf * ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position)
sets a rdf member, it will be set on the position given.
Definition rr.c:838
ldns_rr * ldns_rr_clone(const ldns_rr *rr)
clones a rr and all its data
Definition rr.c:1438
ldns_status _ldns_rr_new_frm_fp_l_internal(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr, signed char *explicit_ttl)
Definition rr.c:723
void ldns_rr_set_question(ldns_rr *rr, signed char question)
sets the question flag in the rr structure.
Definition rr.c:808
size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor)
returns the maximum number of rdata fields of the rr type this descriptor describes.
Definition rr.c:2766
int ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2)
compares two rrs, up to the rdata.
Definition rr.c:1597
ldns_rr_class ldns_rr_get_class(const ldns_rr *rr)
returns the class of the rr.
Definition rr.c:947
ldns_rr * ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count)
set a rr on a specific index in a ldns_rr_list
Definition rr.c:965
void ldns_rr_set_rd_count(ldns_rr *rr, size_t count)
sets the rd_count in the rr.
Definition rr.c:820
ldns_rr * ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr)
returns a specific rr of an rrlist.
Definition rr.c:988
ldns_status ldns_rdf_bitmap_known_rr_types_space(ldns_rdf **rdf)
Create a rr type bitmap rdf providing enough space to set all known (to ldns) rr types.
Definition rr.c:2722
void ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class)
sets the class in the rr.
Definition rr.c:832
signed char ldns_is_rrset(const ldns_rr_list *rr_list)
checks if an rr_list is a rrset.
Definition rr.c:1257
signed char ldns_rr_list_cat(ldns_rr_list *left, const ldns_rr_list *right)
concatenates two ldns_rr_lists together.
Definition rr.c:1034
int ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2)
compares two rr lists.
Definition rr.c:1783
signed char ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f)
sets rd_field member, it will be placed in the next available spot.
Definition rr.c:855
ldns_rr_list * ldns_rr_list_clone(const ldns_rr_list *rrlist)
clones an rrlist.
Definition rr.c:1469
ldns_rdf * ldns_rr_owner(const ldns_rr *rr)
returns the owner name of an rr structure.
Definition rr.c:917
int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2)
compares two rrs.
Definition rr.c:1676
void ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count)
sets the number of rr's in an rr_list.
Definition rr.c:981
size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor)
returns the minimum number of rdata fields of the rr type this descriptor describes.
Definition rr.c:2756
ldns_status ldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str, const ldns_rdf *origin, ldns_rdf **prev)
creates an rr for the question section from a string, i.e.
Definition rr.c:684
const ldns_rr_descriptor * ldns_rr_descript(uint16_t type)
returns the resource record descriptor for the given rr type.
Definition rr.c:2737
size_t ldns_rr_uncompressed_size(const ldns_rr *r)
calculates the uncompressed size of an RR.
Definition rr.c:1810
ldns_status ldns_rdf_bitmap_known_rr_types(ldns_rdf **rdf)
Create a rr type bitmap rdf with at least all known (to ldns) rr types set.
Definition rr.c:2728
signed char ldns_is_rrset_strict(const ldns_rr_list *rr_list)
checks if an rr_list is a rrset, including checking for TTL.
Definition rr.c:1292
ldns_rr_type ldns_get_rr_type_by_name(const char *name)
retrieves a rrtype by looking up its name.
Definition rr.c:2795
#define LDNS_RDATA_FIELD_DESCRIPTORS_COMMON
Definition rr.h:263
@ LDNS_RR_NO_COMPRESS
Definition rr.h:70
@ LDNS_RR_COMPRESS
compression is allowed
Definition rr.h:69
enum ldns_enum_rr_type ldns_rr_type
Definition rr.h:260
#define LDNS_RR_OVERHEAD
The bytes TTL, CLASS and length use up in an rr.
Definition rr.h:37
@ LDNS_RR_TYPE_MF
a mail forwarder (Obsolete - use MX)
Definition rr.h:86
@ LDNS_RR_TYPE_CERT
RFC2538.
Definition rr.h:152
@ LDNS_RR_TYPE_RP
RFC1183.
Definition rr.h:112
@ LDNS_RR_TYPE_KX
RFC2230.
Definition rr.h:150
@ LDNS_RR_TYPE_DOA
Definition rr.h:231
@ LDNS_RR_TYPE_SPF
Definition rr.h:201
@ LDNS_RR_TYPE_DSYNC
Definition rr.h:197
@ LDNS_RR_TYPE_RESINFO
RFC 9606.
Definition rr.h:237
@ LDNS_RR_TYPE_OPT
OPT record RFC 6891.
Definition rr.h:160
@ LDNS_RR_TYPE_RRSIG
DNSSEC.
Definition rr.h:170
@ LDNS_RR_TYPE_SINK
dnsind-kitchen-sink-02.txt
Definition rr.h:158
@ LDNS_RR_TYPE_A
a host address
Definition rr.h:80
@ LDNS_RR_TYPE_HIP
Definition rr.h:182
@ LDNS_RR_TYPE_LP
Definition rr.h:211
@ LDNS_RR_TYPE_ISDN
RFC1183.
Definition rr.h:118
@ LDNS_RR_TYPE_MINFO
mailbox or mail list information
Definition rr.h:106
@ LDNS_RR_TYPE_L32
Definition rr.h:209
@ LDNS_RR_TYPE_GPOS
RFC1712.
Definition rr.h:132
@ LDNS_RR_TYPE_TKEY
Definition rr.h:218
@ LDNS_RR_TYPE_ZONEMD
Definition rr.h:194
@ LDNS_RR_TYPE_DNSKEY
Definition rr.h:172
@ LDNS_RR_TYPE_SOA
marks the start of a zone of authority
Definition rr.h:90
@ LDNS_RR_TYPE_SSHFP
SSH Key Fingerprint.
Definition rr.h:166
@ LDNS_RR_TYPE_TSIG
Definition rr.h:219
@ LDNS_RR_TYPE_X25
RFC1183.
Definition rr.h:116
@ LDNS_RR_TYPE_WKS
a well known service description
Definition rr.h:100
@ LDNS_RR_TYPE_TLSA
Definition rr.h:179
@ LDNS_RR_TYPE_PX
RFC2163.
Definition rr.h:130
@ LDNS_RR_TYPE_RT
RFC1183.
Definition rr.h:120
@ LDNS_RR_TYPE_NSEC
Definition rr.h:171
@ LDNS_RR_TYPE_DNAME
RFC2672.
Definition rr.h:156
@ LDNS_RR_TYPE_OPENPGPKEY
Definition rr.h:192
@ LDNS_RR_TYPE_AMTRELAY
RFC 8777.
Definition rr.h:234
@ LDNS_RR_TYPE_DS
RFC4034, RFC3658.
Definition rr.h:164
@ LDNS_RR_TYPE_KEY
2535typecode
Definition rr.h:128
@ LDNS_RR_TYPE_NULL
a null RR (EXPERIMENTAL)
Definition rr.h:98
@ LDNS_RR_TYPE_NSEC3PARAM
Definition rr.h:177
@ LDNS_RR_TYPE_RKEY
draft-reid-dnsext-rkey
Definition rr.h:187
@ LDNS_RR_TYPE_BRID
Definition rr.h:199
@ LDNS_RR_TYPE_NXT
2535typecode
Definition rr.h:138
@ LDNS_RR_TYPE_DLV
Definition rr.h:251
@ LDNS_RR_TYPE_SIG
2535typecode
Definition rr.h:126
@ LDNS_RR_TYPE_CNAME
the canonical name for an alias
Definition rr.h:88
@ LDNS_RR_TYPE_NID
Definition rr.h:208
@ LDNS_RR_TYPE_NSEC3
Definition rr.h:176
@ LDNS_RR_TYPE_DHCID
Definition rr.h:174
@ LDNS_RR_TYPE_CDNSKEY
Definition rr.h:191
@ LDNS_RR_TYPE_TA
DNSSEC Trust Authorities.
Definition rr.h:249
@ LDNS_RR_TYPE_NXNAME
Definition rr.h:216
@ LDNS_RR_TYPE_IPN
https://www.iana.org/assignments/dns-parameters/IPN/ipn-completed-template
Definition rr.h:246
@ LDNS_RR_TYPE_LOC
LOC record RFC1876.
Definition rr.h:136
@ LDNS_RR_TYPE_TXT
text strings
Definition rr.h:110
@ LDNS_RR_TYPE_PTR
a domain name pointer
Definition rr.h:102
@ LDNS_RR_TYPE_AAAA
ipv6 address
Definition rr.h:134
@ LDNS_RR_TYPE_EUI64
Definition rr.h:214
@ LDNS_RR_TYPE_MD
a mail destination (Obsolete - use MX)
Definition rr.h:84
@ LDNS_RR_TYPE_A6
RFC2874.
Definition rr.h:154
@ LDNS_RR_TYPE_NS
an authoritative name server
Definition rr.h:82
@ LDNS_RR_TYPE_MR
a mail rename domain name (EXPERIMENTAL)
Definition rr.h:96
@ LDNS_RR_TYPE_WALLET
https://iana.org/assignments/dns-parameters/WALLET/wallet-completed-template
Definition rr.h:240
@ LDNS_RR_TYPE_CAA
Definition rr.h:229
@ LDNS_RR_TYPE_HHIT
Definition rr.h:198
@ LDNS_RR_TYPE_CLA
https://www.iana.org/assignments/dns-parameters/CLA/cla-completed-template
Definition rr.h:243
@ LDNS_RR_TYPE_SVCB
Definition rr.h:195
@ LDNS_RR_TYPE_EUI48
Definition rr.h:213
@ LDNS_RR_TYPE_HTTPS
Definition rr.h:196
@ LDNS_RR_TYPE_MB
a mailbox domain name (EXPERIMENTAL)
Definition rr.h:92
@ LDNS_RR_TYPE_NINFO
draft-reid-dnsext-zs
Definition rr.h:185
@ LDNS_RR_TYPE_TALINK
draft-ietf-dnsop-trust-history
Definition rr.h:189
@ LDNS_RR_TYPE_ATMA
http://www.jhsoft.com/rfc/af-saa-0069.000.rtf
Definition rr.h:146
@ LDNS_RR_TYPE_HINFO
host information
Definition rr.h:104
@ LDNS_RR_TYPE_CSYNC
Definition rr.h:193
@ LDNS_RR_TYPE_EID
draft-ietf-nimrod-dns-01.txt
Definition rr.h:140
@ LDNS_RR_TYPE_AFSDB
RFC1183.
Definition rr.h:114
@ LDNS_RR_TYPE_L64
Definition rr.h:210
@ LDNS_RR_TYPE_NSAP
RFC1706.
Definition rr.h:122
@ LDNS_RR_TYPE_URI
Definition rr.h:228
@ LDNS_RR_TYPE_AVC
Definition rr.h:230
@ LDNS_RR_TYPE_CDS
Definition rr.h:190
@ LDNS_RR_TYPE_NAPTR
RFC2915.
Definition rr.h:148
@ LDNS_RR_TYPE_SMIMEA
Definition rr.h:180
@ LDNS_RR_TYPE_SRV
SRV record RFC2782.
Definition rr.h:144
@ LDNS_RR_TYPE_IPSECKEY
IPsec Key.
Definition rr.h:168
@ LDNS_RR_TYPE_APL
RFC3123.
Definition rr.h:162
@ LDNS_RR_TYPE_MX
mail exchange
Definition rr.h:108
@ LDNS_RR_TYPE_NIMLOC
draft-ietf-nimrod-dns-01.txt
Definition rr.h:142
@ LDNS_RR_TYPE_MG
a mail group member (EXPERIMENTAL)
Definition rr.h:94
@ LDNS_RR_TYPE_NSAP_PTR
RFC1348.
Definition rr.h:124
enum ldns_enum_rr_class ldns_rr_class
Definition rr.h:61
#define LDNS_MAX_DOMAINLEN
Maximum length of a complete dname.
Definition rr.h:33
@ LDNS_RR_CLASS_IN
the Internet
Definition rr.h:47
Structure to do a Schwartzian-like transformation, for instance when sorting.
Definition util.h:166
implementation of buffers to ease operations
Definition buffer.h:51
uint8_t * _data
The data contained in the buffer.
Definition buffer.h:62
A general purpose lookup table.
Definition util.h:178
Resource record data field.
Definition rdata.h:203
Contains all information about resource record types.
Definition rr.h:368
uint8_t _maximum
Maximum number of rdata fields in the RRs of this type.
Definition rr.h:376
const char * _name
Textual name of the RR type.
Definition rr.h:372
ldns_rdf_type _variable
Special rdf types.
Definition rr.h:380
ldns_rr_type _type
Type of the RR that is described here.
Definition rr.h:370
uint8_t _minimum
Minimum number of rdata fields in the RRs of this type.
Definition rr.h:374
const ldns_rdf_type * _wireformat
Wireformat specification for the rr, i.e.
Definition rr.h:378
List or Set of Resource Records.
Definition rr.h:355
size_t _rr_capacity
Definition rr.h:357
ldns_rr ** _rrs
Definition rr.h:358
size_t _rr_count
Definition rr.h:356
Resource Record.
Definition rr.h:327
ldns_rr_type _rr_type
the type of the RR.
Definition rr.h:335
ldns_rdf * _owner
Owner name, uncompressed.
Definition rr.h:329
ldns_rdf ** _rdata_fields
The array of rdata's.
Definition rr.h:340
signed char _rr_question
question rr [it would be nicer if thous is after _rd_count] ABI change: Fix this in next major releas...
Definition rr.h:344
uint32_t _ttl
Time to live
Definition rr.h:331
ldns_rr_class _rr_class
Class of the resource record.
Definition rr.h:337
size_t _rd_count
Number of data fields.
Definition rr.h:333
int ldns_hexstring_to_data(uint8_t *data, const char *str)
Converts a hex string to binary data.
Definition util.c:138
ldns_lookup_table * ldns_lookup_by_name(ldns_lookup_table table[], const char *name)
Looks up the table entry by name, returns NULL if not found.
#define INLINE
splint static inline workaround
Definition util.h:42
#define LDNS_FREE(ptr)
Definition util.h:60
#define LDNS_MALLOC(type)
Memory management macros.
Definition util.h:49
#define LDNS_XMALLOC(type, count)
Definition util.h:51
#define LDNS_XREALLOC(ptr, type, count)
Definition util.h:57
ldns_status ldns_wire2rdf(ldns_rr *rr, const uint8_t *wire, size_t max, size_t *pos)
converts the data on the uint8_t bytearray (in wire format) to DNS rdata fields, and adds them to the...
Definition wire2host.c:156