4 * conversion routines from the host format
5 * to the presentation format (strings)
7 * a Net::DNS like library for C
9 * (c) NLnet Labs, 2004-2006
11 * See the file LICENSE for the license
13 #include <ldns/config.h>
15 #include <ldns/ldns.h>
19 #ifdef HAVE_SYS_SOCKET_H
20 #include <sys/socket.h>
22 #ifdef HAVE_ARPA_INET_H
23 #include <arpa/inet.h>
32 #include <openssl/bn.h>
33 #include <openssl/rsa.h>
35 #include <openssl/dsa.h>
39 #ifndef INET_ADDRSTRLEN
40 #define INET_ADDRSTRLEN 16
42 #ifndef INET6_ADDRSTRLEN
43 #define INET6_ADDRSTRLEN 46
46 /* Internal helper function */
47 ldns_edns_option_list
*
48 pkt_edns_data2edns_option_list(const ldns_rdf
*edns_data
);
50 /* lookup tables for standard DNS stuff */
52 /* Taken from RFC 2535, section 7. */
53 ldns_lookup_table ldns_algorithms
[] = {
54 { LDNS_RSAMD5
, "RSAMD5" },
58 { LDNS_RSASHA1
, "RSASHA1" },
59 { LDNS_DSA_NSEC3
, "DSA-NSEC3-SHA1" },
60 { LDNS_RSASHA1_NSEC3
, "RSASHA1-NSEC3-SHA1" },
61 { LDNS_RSASHA256
, "RSASHA256"},
62 { LDNS_RSASHA512
, "RSASHA512"},
63 { LDNS_ECC_GOST
, "ECC-GOST"},
64 { LDNS_ECDSAP256SHA256
, "ECDSAP256SHA256"},
65 { LDNS_ECDSAP384SHA384
, "ECDSAP384SHA384"},
66 { LDNS_ED25519
, "ED25519"},
67 { LDNS_ED448
, "ED448"},
68 { LDNS_INDIRECT
, "INDIRECT" },
69 { LDNS_PRIVATEDNS
, "PRIVATEDNS" },
70 { LDNS_PRIVATEOID
, "PRIVATEOID" },
74 /* Hashing algorithms used in the DS record */
75 ldns_lookup_table ldns_hashes
[] = {
76 {LDNS_SHA1
, "SHA1" }, /* RFC 4034 */
77 {LDNS_SHA256
, "SHA256" }, /* RFC 4509 */
78 {LDNS_HASH_GOST
, "HASH-GOST" }, /* RFC 5933 */
79 {LDNS_SHA384
, "SHA384" }, /* RFC 6605 */
83 /* Taken from RFC 4398 */
84 ldns_lookup_table ldns_cert_algorithms
[] = {
85 { LDNS_CERT_PKIX
, "PKIX" },
86 { LDNS_CERT_SPKI
, "SPKI" },
87 { LDNS_CERT_PGP
, "PGP" },
88 { LDNS_CERT_IPKIX
, "IPKIX" },
89 { LDNS_CERT_ISPKI
, "ISPKI" },
90 { LDNS_CERT_IPGP
, "IPGP" },
91 { LDNS_CERT_ACPKIX
, "ACPKIX" },
92 { LDNS_CERT_IACPKIX
, "IACPKIX" },
93 { LDNS_CERT_URI
, "URI" },
94 { LDNS_CERT_OID
, "OID" },
99 ldns_lookup_table ldns_rr_classes
[] = {
100 { LDNS_RR_CLASS_IN
, "IN" },
101 { LDNS_RR_CLASS_CH
, "CH" },
102 { LDNS_RR_CLASS_HS
, "HS" },
103 { LDNS_RR_CLASS_NONE
, "NONE" },
104 { LDNS_RR_CLASS_ANY
, "ANY" },
108 /* if these are used elsewhere */
109 ldns_lookup_table ldns_rcodes
[] = {
110 { LDNS_RCODE_NOERROR
, "NOERROR" },
111 { LDNS_RCODE_FORMERR
, "FORMERR" },
112 { LDNS_RCODE_SERVFAIL
, "SERVFAIL" },
113 { LDNS_RCODE_NXDOMAIN
, "NXDOMAIN" },
114 { LDNS_RCODE_NOTIMPL
, "NOTIMPL" },
115 { LDNS_RCODE_REFUSED
, "REFUSED" },
116 { LDNS_RCODE_YXDOMAIN
, "YXDOMAIN" },
117 { LDNS_RCODE_YXRRSET
, "YXRRSET" },
118 { LDNS_RCODE_NXRRSET
, "NXRRSET" },
119 { LDNS_RCODE_NOTAUTH
, "NOTAUTH" },
120 { LDNS_RCODE_NOTZONE
, "NOTZONE" },
124 ldns_lookup_table ldns_opcodes
[] = {
125 { LDNS_PACKET_QUERY
, "QUERY" },
126 { LDNS_PACKET_IQUERY
, "IQUERY" },
127 { LDNS_PACKET_STATUS
, "STATUS" },
128 { LDNS_PACKET_NOTIFY
, "NOTIFY" },
129 { LDNS_PACKET_UPDATE
, "UPDATE" },
133 const ldns_output_format ldns_output_format_nocomments_record
= { 0, NULL
};
134 const ldns_output_format
*ldns_output_format_nocomments
135 = &ldns_output_format_nocomments_record
;
136 const ldns_output_format ldns_output_format_onlykeyids_record
= {
137 LDNS_COMMENT_KEY
, NULL
139 const ldns_output_format
*ldns_output_format_onlykeyids
140 = &ldns_output_format_onlykeyids_record
;
141 const ldns_output_format
*ldns_output_format_default
142 = &ldns_output_format_onlykeyids_record
;
144 const ldns_output_format ldns_output_format_bubblebabble_record
= {
145 LDNS_COMMENT_KEY
| LDNS_COMMENT_BUBBLEBABBLE
| LDNS_COMMENT_FLAGS
, NULL
147 const ldns_output_format
*ldns_output_format_bubblebabble
148 = &ldns_output_format_bubblebabble_record
;
151 ldns_output_format_covers_type(const ldns_output_format
* fmt
, ldns_rr_type t
)
153 return fmt
&& (fmt
->flags
& LDNS_FMT_RFC3597
) &&
154 ((ldns_output_format_storage
*)fmt
)->bitmap
&&
155 ldns_nsec_bitmap_covers_type(
156 ((ldns_output_format_storage
*)fmt
)->bitmap
, t
);
160 ldns_output_format_set_type(ldns_output_format
* fmt
, ldns_rr_type t
)
162 ldns_output_format_storage
* fmt_st
= (ldns_output_format_storage
*)fmt
;
167 if (!(fmt_st
->flags
& LDNS_FMT_RFC3597
)) {
168 ldns_output_format_set(fmt
, LDNS_FMT_RFC3597
);
170 if (! fmt_st
->bitmap
) {
171 s
= ldns_rdf_bitmap_known_rr_types_space(&fmt_st
->bitmap
);
172 if (s
!= LDNS_STATUS_OK
) {
176 return ldns_nsec_bitmap_set_type(fmt_st
->bitmap
, t
);
180 ldns_output_format_clear_type(ldns_output_format
* fmt
, ldns_rr_type t
)
182 ldns_output_format_storage
* fmt_st
= (ldns_output_format_storage
*)fmt
;
187 if (!(fmt_st
->flags
& LDNS_FMT_RFC3597
)) {
188 ldns_output_format_set(fmt
, LDNS_FMT_RFC3597
);
190 if (! fmt_st
->bitmap
) {
191 s
= ldns_rdf_bitmap_known_rr_types(&fmt_st
->bitmap
);
192 if (s
!= LDNS_STATUS_OK
) {
196 return ldns_nsec_bitmap_clear_type(fmt_st
->bitmap
, t
);
200 ldns_pkt_opcode2buffer_str(ldns_buffer
*output
, ldns_pkt_opcode opcode
)
202 ldns_lookup_table
*lt
= ldns_lookup_by_id(ldns_opcodes
, opcode
);
203 if (lt
&& lt
->name
) {
204 ldns_buffer_printf(output
, "%s", lt
->name
);
206 ldns_buffer_printf(output
, "OPCODE%u", opcode
);
208 return ldns_buffer_status(output
);
212 ldns_pkt_rcode2buffer_str(ldns_buffer
*output
, ldns_pkt_rcode rcode
)
214 ldns_lookup_table
*lt
= ldns_lookup_by_id(ldns_rcodes
, rcode
);
215 if (lt
&& lt
->name
) {
216 ldns_buffer_printf(output
, "%s", lt
->name
);
218 ldns_buffer_printf(output
, "RCODE%u", rcode
);
220 return ldns_buffer_status(output
);
224 ldns_algorithm2buffer_str(ldns_buffer
*output
,
225 ldns_algorithm algorithm
)
227 ldns_lookup_table
*lt
= ldns_lookup_by_id(ldns_algorithms
,
229 if (lt
&& lt
->name
) {
230 ldns_buffer_printf(output
, "%s", lt
->name
);
232 ldns_buffer_printf(output
, "ALG%u", algorithm
);
234 return ldns_buffer_status(output
);
238 ldns_cert_algorithm2buffer_str(ldns_buffer
*output
,
239 ldns_cert_algorithm cert_algorithm
)
241 ldns_lookup_table
*lt
= ldns_lookup_by_id(ldns_cert_algorithms
,
243 if (lt
&& lt
->name
) {
244 ldns_buffer_printf(output
, "%s", lt
->name
);
246 ldns_buffer_printf(output
, "CERT_ALG%u",
249 return ldns_buffer_status(output
);
253 ldns_pkt_opcode2str(ldns_pkt_opcode opcode
)
258 buf
= ldns_buffer_new(12);
264 if (ldns_pkt_opcode2buffer_str(buf
, opcode
) == LDNS_STATUS_OK
) {
265 str
= ldns_buffer_export2str(buf
);
268 ldns_buffer_free(buf
);
273 ldns_pkt_rcode2str(ldns_pkt_rcode rcode
)
278 buf
= ldns_buffer_new(10);
284 if (ldns_pkt_rcode2buffer_str(buf
, rcode
) == LDNS_STATUS_OK
) {
285 str
= ldns_buffer_export2str(buf
);
288 ldns_buffer_free(buf
);
293 ldns_pkt_algorithm2str(ldns_algorithm algorithm
)
298 buf
= ldns_buffer_new(10);
304 if (ldns_algorithm2buffer_str(buf
, algorithm
)
306 str
= ldns_buffer_export2str(buf
);
309 ldns_buffer_free(buf
);
314 ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm
)
319 buf
= ldns_buffer_new(10);
325 if (ldns_cert_algorithm2buffer_str(buf
, cert_algorithm
)
327 str
= ldns_buffer_export2str(buf
);
330 ldns_buffer_free(buf
);
335 /* do NOT pass compressed data here :p */
337 ldns_rdf2buffer_str_dname(ldns_buffer
*output
, const ldns_rdf
*dname
)
339 /* can we do with 1 pos var? or without at all? */
346 data
= (uint8_t*)ldns_rdf_data(dname
);
349 if (ldns_rdf_size(dname
) > LDNS_MAX_DOMAINLEN
) {
350 /* too large, return */
351 return LDNS_STATUS_DOMAINNAME_OVERFLOW
;
354 /* special case: root label */
355 if (1 == ldns_rdf_size(dname
)) {
356 ldns_buffer_printf(output
, ".");
358 while ((len
> 0) && src_pos
< ldns_rdf_size(dname
)) {
360 for(i
= 0; i
< len
; i
++) {
361 /* paranoia check for various 'strange'
364 c
= (unsigned char) data
[src_pos
];
365 if(c
== '.' || c
== ';' ||
366 c
== '(' || c
== ')' ||
368 ldns_buffer_printf(output
, "\\%c",
370 } else if (!(isascii(c
) && isgraph(c
))) {
371 ldns_buffer_printf(output
, "\\%03u",
374 ldns_buffer_printf(output
, "%c", data
[src_pos
]);
379 if (src_pos
< ldns_rdf_size(dname
)) {
380 ldns_buffer_printf(output
, ".");
385 return ldns_buffer_status(output
);
389 ldns_rdf2buffer_str_int8(ldns_buffer
*output
, const ldns_rdf
*rdf
)
391 uint8_t data
= ldns_rdf_data(rdf
)[0];
392 ldns_buffer_printf(output
, "%lu", (unsigned long) data
);
393 return ldns_buffer_status(output
);
397 ldns_rdf2buffer_str_int16(ldns_buffer
*output
, const ldns_rdf
*rdf
)
399 uint16_t data
= ldns_read_uint16(ldns_rdf_data(rdf
));
400 ldns_buffer_printf(output
, "%lu", (unsigned long) data
);
401 return ldns_buffer_status(output
);
405 ldns_rdf2buffer_str_int32(ldns_buffer
*output
, const ldns_rdf
*rdf
)
407 uint32_t data
= ldns_read_uint32(ldns_rdf_data(rdf
));
408 ldns_buffer_printf(output
, "%lu", (unsigned long) data
);
409 return ldns_buffer_status(output
);
413 ldns_rdf2buffer_str_time(ldns_buffer
*output
, const ldns_rdf
*rdf
)
415 /* create a YYYYMMDDHHMMSS string if possible */
419 memset(&tm
, 0, sizeof(tm
));
420 if (ldns_serial_arithmetics_gmtime_r(ldns_rdf2native_int32(rdf
), time(NULL
), &tm
)
421 && strftime(date_buf
, 15, "%Y%m%d%H%M%S", &tm
)) {
422 ldns_buffer_printf(output
, "%s", date_buf
);
424 return ldns_buffer_status(output
);
428 ldns_rdf2buffer_str_a(ldns_buffer
*output
, const ldns_rdf
*rdf
)
430 char str
[INET_ADDRSTRLEN
];
432 if (inet_ntop(AF_INET
, ldns_rdf_data(rdf
), str
, INET_ADDRSTRLEN
)) {
433 ldns_buffer_printf(output
, "%s", str
);
435 return ldns_buffer_status(output
);
439 ldns_rdf2buffer_str_aaaa(ldns_buffer
*output
, const ldns_rdf
*rdf
)
441 char str
[INET6_ADDRSTRLEN
];
443 if (inet_ntop(AF_INET6
, ldns_rdf_data(rdf
), str
, INET6_ADDRSTRLEN
)) {
444 ldns_buffer_printf(output
, "%s", str
);
447 return ldns_buffer_status(output
);
451 ldns_characters2buffer_str(ldns_buffer
* output
,
452 size_t amount
, const uint8_t* characters
)
457 if (isprint((int)ch
) || ch
== '\t') {
458 if (ch
== '\"' || ch
== '\\')
459 ldns_buffer_printf(output
, "\\%c", ch
);
461 ldns_buffer_printf(output
, "%c", ch
);
463 ldns_buffer_printf(output
, "\\%03u",
464 (unsigned)(uint8_t) ch
);
471 ldns_rdf2buffer_str_str(ldns_buffer
*output
, const ldns_rdf
*rdf
)
473 if(ldns_rdf_size(rdf
) < 1) {
474 return LDNS_STATUS_WIRE_RDATA_ERR
;
476 if((int)ldns_rdf_size(rdf
) < (int)ldns_rdf_data(rdf
)[0] + 1) {
477 return LDNS_STATUS_WIRE_RDATA_ERR
;
479 ldns_buffer_printf(output
, "\"");
480 ldns_characters2buffer_str(output
,
481 ldns_rdf_data(rdf
)[0], ldns_rdf_data(rdf
) + 1);
482 ldns_buffer_printf(output
, "\"");
483 return ldns_buffer_status(output
);
487 ldns_rdf2buffer_str_b64(ldns_buffer
*output
, const ldns_rdf
*rdf
)
492 if (ldns_rdf_size(rdf
) == 0) {
493 ldns_buffer_printf(output
, "0");
494 return ldns_buffer_status(output
);
496 size
= ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf
));
498 if (!(b64
= LDNS_XMALLOC(char, size
)))
499 return LDNS_STATUS_MEM_ERR
;
501 if (ldns_b64_ntop(ldns_rdf_data(rdf
), ldns_rdf_size(rdf
), b64
, size
)) {
502 ldns_buffer_printf(output
, "%s", b64
);
505 return ldns_buffer_status(output
);
509 ldns_rdf2buffer_str_b32_ext(ldns_buffer
*output
, const ldns_rdf
*rdf
)
513 if(ldns_rdf_size(rdf
) == 0)
514 return LDNS_STATUS_OK
;
515 /* remove -1 for the b32-hash-len octet */
516 size
= ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf
) - 1);
517 /* add one for the end nul for the string */
518 b32
= LDNS_XMALLOC(char, size
+ 1);
519 if(!b32
) return LDNS_STATUS_MEM_ERR
;
520 size
= (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf
) + 1,
521 ldns_rdf_size(rdf
) - 1, b32
, size
+1);
523 ldns_buffer_printf(output
, "%s", b32
);
526 return ldns_buffer_status(output
);
530 ldns_rdf2buffer_str_hex(ldns_buffer
*output
, const ldns_rdf
*rdf
)
533 for (i
= 0; i
< ldns_rdf_size(rdf
); i
++) {
534 ldns_buffer_printf(output
, "%02x", ldns_rdf_data(rdf
)[i
]);
537 return ldns_buffer_status(output
);
541 ldns_rdf2buffer_str_type_fmt(ldns_buffer
*output
,
542 const ldns_output_format
* fmt
, const ldns_rdf
*rdf
)
544 uint16_t data
= ldns_read_uint16(ldns_rdf_data(rdf
));
546 if (! ldns_output_format_covers_type(fmt
, data
) &&
547 ldns_rr_descript(data
) &&
548 ldns_rr_descript(data
)->_name
) {
550 ldns_buffer_printf(output
, "%s",ldns_rr_descript(data
)->_name
);
552 ldns_buffer_printf(output
, "TYPE%u", data
);
554 return ldns_buffer_status(output
);
558 ldns_rdf2buffer_str_type(ldns_buffer
*output
, const ldns_rdf
*rdf
)
560 return ldns_rdf2buffer_str_type_fmt(output
,
561 ldns_output_format_default
, rdf
);
565 ldns_rdf2buffer_str_class(ldns_buffer
*output
, const ldns_rdf
*rdf
)
567 uint16_t data
= ldns_read_uint16(ldns_rdf_data(rdf
));
568 ldns_lookup_table
*lt
;
570 lt
= ldns_lookup_by_id(ldns_rr_classes
, (int) data
);
572 ldns_buffer_printf(output
, "\t%s", lt
->name
);
574 ldns_buffer_printf(output
, "\tCLASS%d", data
);
576 return ldns_buffer_status(output
);
580 ldns_rdf2buffer_str_cert_alg(ldns_buffer
*output
, const ldns_rdf
*rdf
)
582 uint16_t data
= ldns_read_uint16(ldns_rdf_data(rdf
));
583 ldns_lookup_table
*lt
;
584 lt
= ldns_lookup_by_id(ldns_cert_algorithms
, (int) data
);
586 ldns_buffer_printf(output
, "%s", lt
->name
);
588 ldns_buffer_printf(output
, "%d", data
);
590 return ldns_buffer_status(output
);
594 ldns_rdf2buffer_str_alg(ldns_buffer
*output
, const ldns_rdf
*rdf
)
596 return ldns_rdf2buffer_str_int8(output
, rdf
);
600 loc_cm_print(ldns_buffer
*output
, uint8_t mantissa
, uint8_t exponent
)
603 /* is it 0.<two digits> ? */
607 ldns_buffer_printf(output
, "0.%02ld", (long)mantissa
);
610 /* always <digit><string of zeros> */
611 ldns_buffer_printf(output
, "%d", (int)mantissa
);
612 for(i
=0; i
<exponent
-2; i
++)
613 ldns_buffer_printf(output
, "0");
617 ldns_rr_type2buffer_str(ldns_buffer
*output
, const ldns_rr_type type
)
619 const ldns_rr_descriptor
*descriptor
;
621 descriptor
= ldns_rr_descript(type
);
624 case LDNS_RR_TYPE_IXFR
:
625 ldns_buffer_printf(output
, "IXFR");
627 case LDNS_RR_TYPE_AXFR
:
628 ldns_buffer_printf(output
, "AXFR");
630 case LDNS_RR_TYPE_MAILA
:
631 ldns_buffer_printf(output
, "MAILA");
633 case LDNS_RR_TYPE_MAILB
:
634 ldns_buffer_printf(output
, "MAILB");
636 case LDNS_RR_TYPE_ANY
:
637 ldns_buffer_printf(output
, "ANY");
640 if (descriptor
&& descriptor
->_name
) {
641 ldns_buffer_printf(output
, "%s", descriptor
->_name
);
643 ldns_buffer_printf(output
, "TYPE%u", type
);
646 return ldns_buffer_status(output
);
650 ldns_rr_type2str(const ldns_rr_type type
)
655 buf
= ldns_buffer_new(10);
661 if (ldns_rr_type2buffer_str(buf
, type
) == LDNS_STATUS_OK
) {
662 str
= ldns_buffer_export2str(buf
);
665 ldns_buffer_free(buf
);
671 ldns_rr_class2buffer_str(ldns_buffer
*output
,
672 const ldns_rr_class klass
)
674 ldns_lookup_table
*lt
;
676 lt
= ldns_lookup_by_id(ldns_rr_classes
, klass
);
678 ldns_buffer_printf(output
, "%s", lt
->name
);
680 ldns_buffer_printf(output
, "CLASS%d", klass
);
682 return ldns_buffer_status(output
);
686 ldns_rr_class2str(const ldns_rr_class klass
)
691 buf
= ldns_buffer_new(10);
697 if (ldns_rr_class2buffer_str(buf
, klass
) == LDNS_STATUS_OK
) {
698 str
= ldns_buffer_export2str(buf
);
700 ldns_buffer_free(buf
);
705 ldns_rdf2buffer_str_loc(ldns_buffer
*output
, const ldns_rdf
*rdf
)
707 /* we could do checking (ie degrees < 90 etc)? */
710 uint8_t horizontal_precision
;
711 uint8_t vertical_precision
;
715 char latitude_hemisphere
;
716 char longitude_hemisphere
;
721 uint32_t equator
= (uint32_t) ldns_power(2, 31);
723 if(ldns_rdf_size(rdf
) < 1) {
724 return LDNS_STATUS_WIRE_RDATA_ERR
;
726 version
= ldns_rdf_data(rdf
)[0];
728 if(ldns_rdf_size(rdf
) < 16) {
729 return LDNS_STATUS_WIRE_RDATA_ERR
;
731 size
= ldns_rdf_data(rdf
)[1];
732 horizontal_precision
= ldns_rdf_data(rdf
)[2];
733 vertical_precision
= ldns_rdf_data(rdf
)[3];
735 latitude
= ldns_read_uint32(&ldns_rdf_data(rdf
)[4]);
736 longitude
= ldns_read_uint32(&ldns_rdf_data(rdf
)[8]);
737 altitude
= ldns_read_uint32(&ldns_rdf_data(rdf
)[12]);
739 if (latitude
> equator
) {
740 latitude_hemisphere
= 'N';
741 latitude
= latitude
- equator
;
743 latitude_hemisphere
= 'S';
744 latitude
= equator
- latitude
;
746 h
= latitude
/ (1000 * 60 * 60);
747 latitude
= latitude
% (1000 * 60 * 60);
748 m
= latitude
/ (1000 * 60);
749 latitude
= latitude
% (1000 * 60);
750 s
= (double) latitude
/ 1000.0;
751 ldns_buffer_printf(output
, "%02u %02u %0.3f %c ",
752 h
, m
, s
, latitude_hemisphere
);
754 if (longitude
> equator
) {
755 longitude_hemisphere
= 'E';
756 longitude
= longitude
- equator
;
758 longitude_hemisphere
= 'W';
759 longitude
= equator
- longitude
;
761 h
= longitude
/ (1000 * 60 * 60);
762 longitude
= longitude
% (1000 * 60 * 60);
763 m
= longitude
/ (1000 * 60);
764 longitude
= longitude
% (1000 * 60);
765 s
= (double) longitude
/ (1000.0);
766 ldns_buffer_printf(output
, "%02u %02u %0.3f %c ",
767 h
, m
, s
, longitude_hemisphere
);
769 s
= ((double) altitude
) / 100;
772 if(altitude
%100 != 0)
773 ldns_buffer_printf(output
, "%.2f", s
);
775 ldns_buffer_printf(output
, "%.0f", s
);
777 ldns_buffer_printf(output
, "m ");
779 loc_cm_print(output
, (size
& 0xf0) >> 4, size
& 0x0f);
780 ldns_buffer_printf(output
, "m ");
782 loc_cm_print(output
, (horizontal_precision
& 0xf0) >> 4,
783 horizontal_precision
& 0x0f);
784 ldns_buffer_printf(output
, "m ");
786 loc_cm_print(output
, (vertical_precision
& 0xf0) >> 4,
787 vertical_precision
& 0x0f);
788 ldns_buffer_printf(output
, "m");
790 return ldns_buffer_status(output
);
792 return ldns_rdf2buffer_str_hex(output
, rdf
);
797 ldns_rdf2buffer_str_unknown(ldns_buffer
*output
, const ldns_rdf
*rdf
)
799 ldns_buffer_printf(output
, "\\# %u ", ldns_rdf_size(rdf
));
800 return ldns_rdf2buffer_str_hex(output
, rdf
);
804 ldns_rdf2buffer_str_nsap(ldns_buffer
*output
, const ldns_rdf
*rdf
)
806 ldns_buffer_printf(output
, "0x");
807 return ldns_rdf2buffer_str_hex(output
, rdf
);
811 ldns_rdf2buffer_str_atma(ldns_buffer
*output
, const ldns_rdf
*rdf
)
813 return ldns_rdf2buffer_str_hex(output
, rdf
);
817 ldns_rdf2buffer_str_wks(ldns_buffer
*output
, const ldns_rdf
*rdf
)
819 /* protocol, followed by bitmap of services */
820 struct protoent
*protocol
;
821 char *proto_name
= NULL
;
823 struct servent
*service
;
824 uint16_t current_service
;
826 if(ldns_rdf_size(rdf
) < 1) {
827 return LDNS_STATUS_WIRE_RDATA_ERR
;
829 protocol_nr
= ldns_rdf_data(rdf
)[0];
830 protocol
= getprotobynumber((int) protocol_nr
);
831 if (protocol
&& (protocol
->p_name
!= NULL
)) {
832 proto_name
= protocol
->p_name
;
833 ldns_buffer_printf(output
, "%s ", protocol
->p_name
);
835 ldns_buffer_printf(output
, "%u ", protocol_nr
);
838 #ifdef HAVE_ENDPROTOENT
842 for (current_service
= 0;
843 current_service
< (ldns_rdf_size(rdf
)-1)*8; current_service
++) {
844 if (ldns_get_bit(&(ldns_rdf_data(rdf
)[1]), current_service
)) {
845 service
= getservbyport((int) htons(current_service
),
847 if (service
&& service
->s_name
) {
848 ldns_buffer_printf(output
, "%s ", service
->s_name
);
850 ldns_buffer_printf(output
, "%u ", current_service
);
852 #ifdef HAVE_ENDSERVENT
856 /* exit from loop before integer overflow */
857 if(current_service
== 65535) { break; }
859 return ldns_buffer_status(output
);
863 ldns_rdf2buffer_str_nsec_fmt(ldns_buffer
*output
,
864 const ldns_output_format
* fmt
, const ldns_rdf
*rdf
)
866 /* Note: this code is duplicated in higher.c in
867 * ldns_nsec_type_check() function
869 uint8_t window_block_nr
;
870 uint8_t bitmap_length
;
874 uint8_t *data
= ldns_rdf_data(rdf
);
876 while((size_t)(pos
+ 2) < ldns_rdf_size(rdf
)) {
877 window_block_nr
= data
[pos
];
878 bitmap_length
= data
[pos
+ 1];
880 if (ldns_rdf_size(rdf
) < pos
+ bitmap_length
) {
881 return LDNS_STATUS_WIRE_RDATA_ERR
;
883 for (bit_pos
= 0; bit_pos
< (bitmap_length
) * 8; bit_pos
++) {
884 if (! ldns_get_bit(&data
[pos
], bit_pos
)) {
887 type
= 256 * (uint16_t) window_block_nr
+ bit_pos
;
889 if (! ldns_output_format_covers_type(fmt
, type
) &&
890 ldns_rr_descript(type
) &&
891 ldns_rr_descript(type
)->_name
){
893 ldns_buffer_printf(output
, "%s ",
894 ldns_rr_descript(type
)->_name
);
896 ldns_buffer_printf(output
, "TYPE%u ", type
);
899 pos
+= (uint16_t) bitmap_length
;
901 return ldns_buffer_status(output
);
905 ldns_rdf2buffer_str_nsec(ldns_buffer
*output
, const ldns_rdf
*rdf
)
907 return ldns_rdf2buffer_str_nsec_fmt(output
,
908 ldns_output_format_default
, rdf
);
912 ldns_rdf2buffer_str_nsec3_salt(ldns_buffer
*output
, const ldns_rdf
*rdf
)
917 uint8_t *data
= ldns_rdf_data(rdf
);
919 if(ldns_rdf_size(rdf
) < 1) {
920 return LDNS_STATUS_WIRE_RDATA_ERR
;
922 salt_length
= data
[0];
923 /* from now there are variable length entries so remember pos */
924 if (salt_length
== 0 || ((size_t)salt_length
)+1 > ldns_rdf_size(rdf
)) {
925 ldns_buffer_printf(output
, "- ");
927 for (salt_pos
= 0; salt_pos
< salt_length
; salt_pos
++) {
928 ldns_buffer_printf(output
, "%02x", data
[1 + salt_pos
]);
930 ldns_buffer_printf(output
, " ");
933 return ldns_buffer_status(output
);
937 ldns_rdf2buffer_str_period(ldns_buffer
*output
, const ldns_rdf
*rdf
)
939 /* period is the number of seconds */
940 if (ldns_rdf_size(rdf
) != 4) {
941 return LDNS_STATUS_WIRE_RDATA_ERR
;
943 ldns_buffer_printf(output
, "%u", ldns_read_uint32(ldns_rdf_data(rdf
)));
944 return ldns_buffer_status(output
);
948 ldns_rdf2buffer_str_tsigtime(ldns_buffer
*output
,const ldns_rdf
*rdf
)
950 /* tsigtime is 48 bits network order unsigned integer */
951 uint64_t tsigtime
= 0;
952 uint8_t *data
= ldns_rdf_data(rdf
);
953 uint64_t d0
, d1
, d2
, d3
, d4
, d5
;
955 if (ldns_rdf_size(rdf
) < 6) {
956 return LDNS_STATUS_WIRE_RDATA_ERR
;
958 d0
= data
[0]; /* cast to uint64 for shift operations */
964 tsigtime
= (d0
<<40) | (d1
<<32) | (d2
<<24) | (d3
<<16) | (d4
<<8) | d5
;
966 ldns_buffer_printf(output
, "%llu ", (long long)tsigtime
);
968 return ldns_buffer_status(output
);
972 ldns_rdf2buffer_str_apl(ldns_buffer
*output
, const ldns_rdf
*rdf
)
974 uint8_t *data
= ldns_rdf_data(rdf
);
975 uint16_t address_family
;
982 while (pos
< (unsigned int) ldns_rdf_size(rdf
)) {
983 if(pos
+ 3 >= (unsigned)ldns_rdf_size(rdf
))
984 return LDNS_STATUS_WIRE_RDATA_ERR
;
985 address_family
= ldns_read_uint16(&data
[pos
]);
986 prefix
= data
[pos
+ 2];
987 negation
= data
[pos
+ 3] & LDNS_APL_NEGATION
;
988 adf_length
= data
[pos
+ 3] & LDNS_APL_MASK
;
989 if (address_family
== LDNS_APL_IP4
) {
990 /* check if prefix < 32? */
992 ldns_buffer_printf(output
, "!");
994 ldns_buffer_printf(output
, "%u:", address_family
);
995 /* address is variable length 0 - 4 */
996 for (i
= 0; i
< 4; i
++) {
998 ldns_buffer_printf(output
, ".");
1000 if (i
< (unsigned short) adf_length
) {
1001 if(pos
+i
+4 >= ldns_rdf_size(rdf
))
1002 return LDNS_STATUS_WIRE_RDATA_ERR
;
1003 ldns_buffer_printf(output
, "%d",
1006 ldns_buffer_printf(output
, "0");
1009 ldns_buffer_printf(output
, "/%u ", prefix
);
1010 } else if (address_family
== LDNS_APL_IP6
) {
1011 /* check if prefix < 128? */
1013 ldns_buffer_printf(output
, "!");
1015 ldns_buffer_printf(output
, "%u:", address_family
);
1016 /* address is variable length 0 - 16 */
1017 for (i
= 0; i
< 16; i
++) {
1018 if (i
% 2 == 0 && i
> 0) {
1019 ldns_buffer_printf(output
, ":");
1021 if (i
< (unsigned short) adf_length
) {
1022 if(pos
+i
+4 >= ldns_rdf_size(rdf
))
1023 return LDNS_STATUS_WIRE_RDATA_ERR
;
1024 ldns_buffer_printf(output
, "%02x",
1027 ldns_buffer_printf(output
, "00");
1030 ldns_buffer_printf(output
, "/%u ", prefix
);
1033 /* unknown address family */
1034 ldns_buffer_printf(output
,
1035 "Unknown address family: %u data: ",
1037 for (i
= 1; i
< (unsigned short) (4 + adf_length
); i
++) {
1038 if(pos
+i
>= ldns_rdf_size(rdf
))
1039 return LDNS_STATUS_WIRE_RDATA_ERR
;
1040 ldns_buffer_printf(output
, "%02x", data
[i
]);
1043 pos
+= 4 + adf_length
;
1045 return ldns_buffer_status(output
);
1049 ldns_rdf2buffer_str_int16_data(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1053 if (ldns_rdf_size(rdf
) < 2) {
1054 return LDNS_STATUS_WIRE_RDATA_ERR
;
1056 /* Subtract the size (2) of the number that specifies the length */
1057 size
= ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf
) - 2);
1058 ldns_buffer_printf(output
, "%u ", ldns_rdf_size(rdf
) - 2);
1059 if (ldns_rdf_size(rdf
) > 2) {
1060 b64
= LDNS_XMALLOC(char, size
);
1062 return LDNS_STATUS_MEM_ERR
;
1064 if (ldns_rdf_size(rdf
) > 2 &&
1065 ldns_b64_ntop(ldns_rdf_data(rdf
) + 2,
1066 ldns_rdf_size(rdf
) - 2,
1068 ldns_buffer_printf(output
, "%s", b64
);
1072 return ldns_buffer_status(output
);
1076 ldns_rdf2buffer_str_ipseckey(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1079 http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt
1081 uint8_t *data
= ldns_rdf_data(rdf
);
1083 uint8_t gateway_type
;
1086 ldns_rdf
*gateway
= NULL
;
1087 uint8_t *gateway_data
;
1089 size_t public_key_size
;
1090 uint8_t *public_key_data
;
1091 ldns_rdf
*public_key
;
1096 if (ldns_rdf_size(rdf
) < 3) {
1097 return LDNS_STATUS_WIRE_RDATA_ERR
;
1099 precedence
= data
[0];
1100 gateway_type
= data
[1];
1101 algorithm
= data
[2];
1104 switch (gateway_type
) {
1109 if (ldns_rdf_size(rdf
) < offset
+ LDNS_IP4ADDRLEN
) {
1110 return LDNS_STATUS_ERR
;
1112 gateway_data
= LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN
);
1114 return LDNS_STATUS_MEM_ERR
;
1115 memcpy(gateway_data
, &data
[offset
], LDNS_IP4ADDRLEN
);
1116 gateway
= ldns_rdf_new(LDNS_RDF_TYPE_A
,
1117 LDNS_IP4ADDRLEN
, gateway_data
);
1118 offset
+= LDNS_IP4ADDRLEN
;
1120 LDNS_FREE(gateway_data
);
1121 return LDNS_STATUS_MEM_ERR
;
1125 if (ldns_rdf_size(rdf
) < offset
+ LDNS_IP6ADDRLEN
) {
1126 return LDNS_STATUS_ERR
;
1128 gateway_data
= LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN
);
1130 return LDNS_STATUS_MEM_ERR
;
1131 memcpy(gateway_data
, &data
[offset
], LDNS_IP6ADDRLEN
);
1132 offset
+= LDNS_IP6ADDRLEN
;
1134 ldns_rdf_new(LDNS_RDF_TYPE_AAAA
,
1135 LDNS_IP6ADDRLEN
, gateway_data
);
1137 LDNS_FREE(gateway_data
);
1138 return LDNS_STATUS_MEM_ERR
;
1142 status
= ldns_wire2dname(&gateway
, data
,
1143 ldns_rdf_size(rdf
), &offset
);
1144 if(status
!= LDNS_STATUS_OK
)
1152 if (ldns_rdf_size(rdf
) <= offset
) {
1153 ldns_rdf_deep_free(gateway
);
1154 return LDNS_STATUS_ERR
;
1156 public_key_size
= ldns_rdf_size(rdf
) - offset
;
1157 public_key_data
= LDNS_XMALLOC(uint8_t, public_key_size
);
1158 if(!public_key_data
) {
1159 ldns_rdf_deep_free(gateway
);
1160 return LDNS_STATUS_MEM_ERR
;
1162 memcpy(public_key_data
, &data
[offset
], public_key_size
);
1163 public_key
= ldns_rdf_new(LDNS_RDF_TYPE_B64
,
1164 public_key_size
, public_key_data
);
1166 LDNS_FREE(public_key_data
);
1167 ldns_rdf_deep_free(gateway
);
1168 return LDNS_STATUS_MEM_ERR
;
1171 ldns_buffer_printf(output
, "%u %u %u ", precedence
, gateway_type
, algorithm
);
1173 (void) ldns_rdf2buffer_str(output
, gateway
);
1175 ldns_buffer_printf(output
, ".");
1176 ldns_buffer_printf(output
, " ");
1177 (void) ldns_rdf2buffer_str(output
, public_key
);
1179 ldns_rdf_deep_free(gateway
);
1180 ldns_rdf_deep_free(public_key
);
1182 return ldns_buffer_status(output
);
1186 ldns_rdf2buffer_str_ilnp64(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1188 if (ldns_rdf_size(rdf
) != 8) {
1189 return LDNS_STATUS_WIRE_RDATA_ERR
;
1191 ldns_buffer_printf(output
,"%.4x:%.4x:%.4x:%.4x",
1192 ldns_read_uint16(ldns_rdf_data(rdf
)),
1193 ldns_read_uint16(ldns_rdf_data(rdf
)+2),
1194 ldns_read_uint16(ldns_rdf_data(rdf
)+4),
1195 ldns_read_uint16(ldns_rdf_data(rdf
)+6));
1196 return ldns_buffer_status(output
);
1200 ldns_rdf2buffer_str_eui48(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1202 if (ldns_rdf_size(rdf
) != 6) {
1203 return LDNS_STATUS_WIRE_RDATA_ERR
;
1205 ldns_buffer_printf(output
,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",
1206 ldns_rdf_data(rdf
)[0], ldns_rdf_data(rdf
)[1],
1207 ldns_rdf_data(rdf
)[2], ldns_rdf_data(rdf
)[3],
1208 ldns_rdf_data(rdf
)[4], ldns_rdf_data(rdf
)[5]);
1209 return ldns_buffer_status(output
);
1213 ldns_rdf2buffer_str_eui64(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1215 if (ldns_rdf_size(rdf
) != 8) {
1216 return LDNS_STATUS_WIRE_RDATA_ERR
;
1218 ldns_buffer_printf(output
,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",
1219 ldns_rdf_data(rdf
)[0], ldns_rdf_data(rdf
)[1],
1220 ldns_rdf_data(rdf
)[2], ldns_rdf_data(rdf
)[3],
1221 ldns_rdf_data(rdf
)[4], ldns_rdf_data(rdf
)[5],
1222 ldns_rdf_data(rdf
)[6], ldns_rdf_data(rdf
)[7]);
1223 return ldns_buffer_status(output
);
1227 ldns_rdf2buffer_str_tag(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1230 const uint8_t* chars
;
1232 if (ldns_rdf_size(rdf
) < 2) {
1233 return LDNS_STATUS_WIRE_RDATA_ERR
;
1235 nchars
= ldns_rdf_data(rdf
)[0];
1236 if (nchars
>= ldns_rdf_size(rdf
) || /* should be rdf_size - 1 */
1238 return LDNS_STATUS_WIRE_RDATA_ERR
;
1240 chars
= ldns_rdf_data(rdf
) + 1;
1241 while (nchars
> 0) {
1242 ch
= (char)*chars
++;
1243 if (! isalnum((unsigned char)ch
)) {
1244 return LDNS_STATUS_WIRE_RDATA_ERR
;
1246 ldns_buffer_printf(output
, "%c", ch
);
1249 return ldns_buffer_status(output
);
1253 ldns_rdf2buffer_str_long_str(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1256 ldns_buffer_printf(output
, "\"");
1257 ldns_characters2buffer_str(output
,
1258 ldns_rdf_size(rdf
), ldns_rdf_data(rdf
));
1259 ldns_buffer_printf(output
, "\"");
1260 return ldns_buffer_status(output
);
1264 ldns_rdf2buffer_str_hip(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1266 uint8_t *data
= ldns_rdf_data(rdf
);
1267 size_t rdf_size
= ldns_rdf_size(rdf
);
1273 return LDNS_STATUS_WIRE_RDATA_ERR
;
1275 if ((hit_size
= data
[0]) == 0 ||
1276 (pk_size
= ldns_read_uint16(data
+ 2)) == 0 ||
1277 rdf_size
< (size_t) hit_size
+ pk_size
+ 4) {
1279 return LDNS_STATUS_WIRE_RDATA_ERR
;
1282 ldns_buffer_printf(output
, "%d ", (int) data
[1]);
1284 for (data
+= 4; hit_size
> 0; hit_size
--, data
++) {
1286 ldns_buffer_printf(output
, "%02x", (int) *data
);
1288 ldns_buffer_write_char(output
, (uint8_t) ' ');
1290 if (ldns_buffer_reserve(output
,
1291 ldns_b64_ntop_calculate_size(pk_size
))) {
1293 written
= ldns_b64_ntop(data
, pk_size
,
1294 (char *) ldns_buffer_current(output
),
1295 ldns_buffer_remaining(output
));
1298 written
< (int) ldns_buffer_remaining(output
)) {
1300 output
->_position
+= written
;
1303 return ldns_buffer_status(output
);
1306 /* implementation mimicked from ldns_rdf2buffer_str_ipseckey */
1308 ldns_rdf2buffer_str_amtrelay(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1311 * draft-ietf-mboned-driad-amt-discovery Section 4.2
1313 uint8_t *data
= ldns_rdf_data(rdf
);
1315 uint8_t discovery_optional
;
1318 ldns_rdf
*relay
= NULL
;
1319 uint8_t *relay_data
;
1324 if (ldns_rdf_size(rdf
) < 2) {
1325 return LDNS_STATUS_WIRE_RDATA_ERR
;
1327 precedence
= data
[0];
1328 discovery_optional
= ((data
[1] & 0x80) >> 7);
1329 relay_type
= data
[1] & 0x7F;
1332 switch (relay_type
) {
1337 if (ldns_rdf_size(rdf
) < offset
+ LDNS_IP4ADDRLEN
) {
1338 return LDNS_STATUS_ERR
;
1340 relay_data
= LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN
);
1342 return LDNS_STATUS_MEM_ERR
;
1343 memcpy(relay_data
, &data
[offset
], LDNS_IP4ADDRLEN
);
1344 relay
= ldns_rdf_new(LDNS_RDF_TYPE_A
,
1345 LDNS_IP4ADDRLEN
, relay_data
);
1346 offset
+= LDNS_IP4ADDRLEN
;
1348 LDNS_FREE(relay_data
);
1349 return LDNS_STATUS_MEM_ERR
;
1353 if (ldns_rdf_size(rdf
) < offset
+ LDNS_IP6ADDRLEN
) {
1354 return LDNS_STATUS_ERR
;
1356 relay_data
= LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN
);
1358 return LDNS_STATUS_MEM_ERR
;
1359 memcpy(relay_data
, &data
[offset
], LDNS_IP6ADDRLEN
);
1360 offset
+= LDNS_IP6ADDRLEN
;
1362 ldns_rdf_new(LDNS_RDF_TYPE_AAAA
,
1363 LDNS_IP6ADDRLEN
, relay_data
);
1365 LDNS_FREE(relay_data
);
1366 return LDNS_STATUS_MEM_ERR
;
1370 status
= ldns_wire2dname(&relay
, data
,
1371 ldns_rdf_size(rdf
), &offset
);
1372 if(status
!= LDNS_STATUS_OK
)
1380 if (ldns_rdf_size(rdf
) != offset
) {
1381 ldns_rdf_deep_free(relay
);
1382 return LDNS_STATUS_ERR
;
1384 ldns_buffer_printf(output
, "%u %u %u ",
1385 precedence
, discovery_optional
, relay_type
);
1387 (void) ldns_rdf2buffer_str(output
, relay
);
1389 ldns_rdf_deep_free(relay
);
1390 return ldns_buffer_status(output
);
1393 #ifdef RRTYPE_SVCB_HTTPS
1394 ldns_status
svcparam_key2buffer_str(ldns_buffer
*output
, uint16_t key
);
1397 svcparam_mandatory2buffer_str(ldns_buffer
*output
, size_t sz
, uint8_t *data
)
1400 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1402 svcparam_key2buffer_str(output
, ldns_read_uint16(data
));
1403 for (data
+= 2, sz
-= 2; sz
; data
+= 2, sz
-= 2) {
1404 ldns_buffer_write_char(output
, ',');
1405 svcparam_key2buffer_str(output
, ldns_read_uint16(data
));
1407 return ldns_buffer_status(output
);
1411 svcparam_alpn2buffer_str(ldns_buffer
*output
, size_t sz
, uint8_t *data
)
1413 uint8_t *eod
= data
+ sz
, *dp
;
1417 for (dp
= data
; dp
< eod
&& !quote
; dp
+= 1 + *dp
) {
1418 if (dp
+ 1 + *dp
> eod
)
1419 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1421 for (i
= 0; i
< *dp
; i
++)
1422 if (isspace(dp
[i
+ 1]))
1427 ldns_buffer_write_char(output
, '"');
1428 while (data
< eod
) {
1429 uint8_t *eot
= data
+ 1 + *data
;
1432 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1434 if (eod
- data
< (int)sz
)
1435 ldns_buffer_write_char(output
, ',');
1437 for (data
+= 1; data
< eot
; data
+= 1) {
1440 if (isprint(ch
) || ch
== '\t') {
1441 if (ch
== '"' || ch
== ',' || ch
== '\\')
1442 ldns_buffer_write_char(output
, '\\');
1443 ldns_buffer_write_char(output
, ch
);
1445 ldns_buffer_printf(output
, "\\%03u"
1450 ldns_buffer_write_char(output
, '"');
1451 return ldns_buffer_status(output
);
1455 svcparam_port2buffer_str(ldns_buffer
*output
, size_t sz
, uint8_t *data
)
1458 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1459 ldns_buffer_printf(output
, "%d", (int)ldns_read_uint16(data
));
1460 return ldns_buffer_status(output
);
1464 svcparam_ipv4hint2buffer_str(ldns_buffer
*output
, size_t sz
, uint8_t *data
)
1466 char str
[INET_ADDRSTRLEN
];
1468 if (sz
% 4 || !inet_ntop(AF_INET
, data
, str
, INET_ADDRSTRLEN
))
1469 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1471 ldns_buffer_write_chars(output
, str
);
1473 for (data
+= 4, sz
-= 4; sz
; data
+= 4, sz
-= 4 ) {
1474 ldns_buffer_write_char(output
, ',');
1475 if (!inet_ntop(AF_INET
, data
, str
, INET_ADDRSTRLEN
))
1476 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1478 ldns_buffer_write_chars(output
, str
);
1480 return ldns_buffer_status(output
);
1484 svcparam_ech2buffer_str(ldns_buffer
*output
, size_t sz
, uint8_t *data
)
1486 size_t str_sz
= ldns_b64_ntop_calculate_size(sz
);
1489 if (!ldns_buffer_reserve(output
, str_sz
))
1490 return LDNS_STATUS_MEM_ERR
;
1492 written
= ldns_b64_ntop( data
, sz
1493 , (char *)ldns_buffer_current(output
), str_sz
);
1495 ldns_buffer_skip(output
, written
);
1497 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1499 return ldns_buffer_status(output
);
1503 svcparam_ipv6hint2buffer_str(ldns_buffer
*output
, size_t sz
, uint8_t *data
)
1505 char str
[INET6_ADDRSTRLEN
];
1507 if (sz
% 16 || !inet_ntop(AF_INET6
, data
, str
, INET6_ADDRSTRLEN
))
1508 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1510 ldns_buffer_write_chars(output
, str
);
1512 for (data
+= 16, sz
-= 16; sz
; data
+= 16, sz
-= 16) {
1513 ldns_buffer_write_char(output
, ',');
1514 if (!inet_ntop(AF_INET6
, data
, str
, INET6_ADDRSTRLEN
))
1515 return LDNS_STATUS_INVALID_SVCPARAM_VALUE
;
1517 ldns_buffer_write_chars(output
, str
);
1519 return ldns_buffer_status(output
);
1523 svcparam_value2buffer_str(ldns_buffer
*output
, size_t sz
, uint8_t *data
)
1525 uint8_t *eod
= data
+ sz
, *dp
;
1528 for (dp
= data
; dp
< eod
&& !isspace(*dp
); dp
++)
1531 if ((quote
= dp
< eod
))
1532 ldns_buffer_write_char(output
, '"');
1534 for (dp
= data
; dp
< eod
; dp
++) {
1537 if (isprint(ch
) || ch
== '\t') {
1538 if (ch
== '"' || ch
== '\\')
1539 ldns_buffer_write_char(output
, '\\');
1540 ldns_buffer_write_char(output
, ch
);
1542 ldns_buffer_printf(output
, "\\%03u", (unsigned)ch
);
1545 ldns_buffer_write_char(output
, '"');
1546 return ldns_buffer_status(output
);
1550 ldns_rdf2buffer_str_svcparams(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1552 uint8_t *data
, *dp
, *next_dp
= NULL
;
1557 return LDNS_STATUS_NULL
;
1559 if (!rdf
|| !(data
= ldns_rdf_data(rdf
)) || !(sz
= ldns_rdf_size(rdf
)))
1560 /* No svcparams is just fine. Just nothing to print. */
1561 return LDNS_STATUS_OK
;
1563 for (dp
= data
; dp
+ 4 <= data
+ sz
; dp
= next_dp
) {
1564 ldns_svcparam_key key
= ldns_read_uint16(dp
);
1565 uint16_t val_sz
= ldns_read_uint16(dp
+ 2);
1567 if ((next_dp
= dp
+ 4 + val_sz
) > data
+ sz
)
1568 return LDNS_STATUS_RDATA_OVERFLOW
;
1571 ldns_buffer_write_char(output
, ' ');
1573 if ((st
= svcparam_key2buffer_str(output
, key
)))
1579 ldns_buffer_write_char(output
, '=');
1581 case LDNS_SVCPARAM_KEY_MANDATORY
:
1582 st
= svcparam_mandatory2buffer_str(output
, val_sz
, dp
);
1584 case LDNS_SVCPARAM_KEY_ALPN
:
1585 st
= svcparam_alpn2buffer_str(output
, val_sz
, dp
);
1587 case LDNS_SVCPARAM_KEY_NO_DEFAULT_ALPN
:
1588 return LDNS_STATUS_NO_SVCPARAM_VALUE_EXPECTED
;
1589 case LDNS_SVCPARAM_KEY_PORT
:
1590 st
= svcparam_port2buffer_str(output
, val_sz
, dp
);
1592 case LDNS_SVCPARAM_KEY_IPV4HINT
:
1593 st
= svcparam_ipv4hint2buffer_str(output
, val_sz
, dp
);
1595 case LDNS_SVCPARAM_KEY_ECH
:
1596 st
= svcparam_ech2buffer_str(output
, val_sz
, dp
);
1598 case LDNS_SVCPARAM_KEY_IPV6HINT
:
1599 st
= svcparam_ipv6hint2buffer_str(output
, val_sz
, dp
);
1602 st
= svcparam_value2buffer_str(output
, val_sz
, dp
);
1608 return ldns_buffer_status(output
);
1610 #else /* #ifdef RRTYPE_SVCB_HTTPS */
1612 ldns_rdf2buffer_str_svcparams(ldns_buffer
*output
, const ldns_rdf
*rdf
)
1614 (void)output
; (void)rdf
;
1615 return LDNS_STATUS_NOT_IMPL
;
1617 #endif /* #ifdef RRTYPE_SVCB_HTTPS */
1620 ldns_rdf2buffer_str_fmt(ldns_buffer
*buffer
,
1621 const ldns_output_format
* fmt
, const ldns_rdf
*rdf
)
1623 ldns_status res
= LDNS_STATUS_OK
;
1625 /*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/
1627 switch(ldns_rdf_get_type(rdf
)) {
1628 case LDNS_RDF_TYPE_NONE
:
1630 case LDNS_RDF_TYPE_DNAME
:
1631 res
= ldns_rdf2buffer_str_dname(buffer
, rdf
);
1633 case LDNS_RDF_TYPE_INT8
: /* Don't output mnemonics for these */
1634 case LDNS_RDF_TYPE_ALG
:
1635 case LDNS_RDF_TYPE_CERTIFICATE_USAGE
:
1636 case LDNS_RDF_TYPE_SELECTOR
:
1637 case LDNS_RDF_TYPE_MATCHING_TYPE
:
1638 res
= ldns_rdf2buffer_str_int8(buffer
, rdf
);
1640 case LDNS_RDF_TYPE_INT16
:
1641 res
= ldns_rdf2buffer_str_int16(buffer
, rdf
);
1643 case LDNS_RDF_TYPE_INT32
:
1644 res
= ldns_rdf2buffer_str_int32(buffer
, rdf
);
1646 case LDNS_RDF_TYPE_PERIOD
:
1647 res
= ldns_rdf2buffer_str_period(buffer
, rdf
);
1649 case LDNS_RDF_TYPE_TSIGTIME
:
1650 res
= ldns_rdf2buffer_str_tsigtime(buffer
, rdf
);
1652 case LDNS_RDF_TYPE_A
:
1653 res
= ldns_rdf2buffer_str_a(buffer
, rdf
);
1655 case LDNS_RDF_TYPE_AAAA
:
1656 res
= ldns_rdf2buffer_str_aaaa(buffer
, rdf
);
1658 case LDNS_RDF_TYPE_STR
:
1659 res
= ldns_rdf2buffer_str_str(buffer
, rdf
);
1661 case LDNS_RDF_TYPE_APL
:
1662 res
= ldns_rdf2buffer_str_apl(buffer
, rdf
);
1664 case LDNS_RDF_TYPE_B32_EXT
:
1665 res
= ldns_rdf2buffer_str_b32_ext(buffer
, rdf
);
1667 case LDNS_RDF_TYPE_B64
:
1668 res
= ldns_rdf2buffer_str_b64(buffer
, rdf
);
1670 case LDNS_RDF_TYPE_HEX
:
1671 res
= ldns_rdf2buffer_str_hex(buffer
, rdf
);
1673 case LDNS_RDF_TYPE_NSEC
:
1674 res
= ldns_rdf2buffer_str_nsec_fmt(buffer
, fmt
, rdf
);
1676 case LDNS_RDF_TYPE_NSEC3_SALT
:
1677 res
= ldns_rdf2buffer_str_nsec3_salt(buffer
, rdf
);
1679 case LDNS_RDF_TYPE_TYPE
:
1680 res
= ldns_rdf2buffer_str_type_fmt(buffer
, fmt
, rdf
);
1682 case LDNS_RDF_TYPE_CLASS
:
1683 res
= ldns_rdf2buffer_str_class(buffer
, rdf
);
1685 case LDNS_RDF_TYPE_CERT_ALG
:
1686 res
= ldns_rdf2buffer_str_cert_alg(buffer
, rdf
);
1688 case LDNS_RDF_TYPE_UNKNOWN
:
1689 res
= ldns_rdf2buffer_str_unknown(buffer
, rdf
);
1691 case LDNS_RDF_TYPE_TIME
:
1692 res
= ldns_rdf2buffer_str_time(buffer
, rdf
);
1694 case LDNS_RDF_TYPE_HIP
:
1695 res
= ldns_rdf2buffer_str_hip(buffer
, rdf
);
1697 case LDNS_RDF_TYPE_LOC
:
1698 res
= ldns_rdf2buffer_str_loc(buffer
, rdf
);
1700 case LDNS_RDF_TYPE_WKS
:
1701 case LDNS_RDF_TYPE_SERVICE
:
1702 res
= ldns_rdf2buffer_str_wks(buffer
, rdf
);
1704 case LDNS_RDF_TYPE_NSAP
:
1705 res
= ldns_rdf2buffer_str_nsap(buffer
, rdf
);
1707 case LDNS_RDF_TYPE_ATMA
:
1708 res
= ldns_rdf2buffer_str_atma(buffer
, rdf
);
1710 case LDNS_RDF_TYPE_IPSECKEY
:
1711 res
= ldns_rdf2buffer_str_ipseckey(buffer
, rdf
);
1713 case LDNS_RDF_TYPE_INT16_DATA
:
1714 res
= ldns_rdf2buffer_str_int16_data(buffer
, rdf
);
1716 case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER
:
1717 res
= ldns_rdf2buffer_str_b32_ext(buffer
, rdf
);
1719 case LDNS_RDF_TYPE_ILNP64
:
1720 res
= ldns_rdf2buffer_str_ilnp64(buffer
, rdf
);
1722 case LDNS_RDF_TYPE_EUI48
:
1723 res
= ldns_rdf2buffer_str_eui48(buffer
, rdf
);
1725 case LDNS_RDF_TYPE_EUI64
:
1726 res
= ldns_rdf2buffer_str_eui64(buffer
, rdf
);
1728 case LDNS_RDF_TYPE_TAG
:
1729 res
= ldns_rdf2buffer_str_tag(buffer
, rdf
);
1731 case LDNS_RDF_TYPE_LONG_STR
:
1732 res
= ldns_rdf2buffer_str_long_str(buffer
, rdf
);
1734 case LDNS_RDF_TYPE_AMTRELAY
:
1735 res
= ldns_rdf2buffer_str_amtrelay(buffer
, rdf
);
1737 case LDNS_RDF_TYPE_SVCPARAMS
:
1738 res
= ldns_rdf2buffer_str_svcparams(buffer
, rdf
);
1742 /** This will write mangled RRs */
1743 ldns_buffer_printf(buffer
, "(null) ");
1744 res
= LDNS_STATUS_ERR
;
1750 ldns_rdf2buffer_str(ldns_buffer
*buffer
, const ldns_rdf
*rdf
)
1752 return ldns_rdf2buffer_str_fmt(buffer
,ldns_output_format_default
,rdf
);
1756 ldns_b32_ext2dname(const ldns_rdf
*rdf
)
1761 if(ldns_rdf_size(rdf
) == 0)
1763 /* remove -1 for the b32-hash-len octet */
1764 size
= ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf
) - 1);
1765 /* add one for the end nul for the string */
1766 b32
= LDNS_XMALLOC(char, size
+ 2);
1768 if (ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf
) + 1,
1769 ldns_rdf_size(rdf
) - 1, b32
, size
+1) > 0) {
1772 if (ldns_str2rdf_dname(&out
, b32
) == LDNS_STATUS_OK
) {
1783 ldns_rr2buffer_str_rfc3597(ldns_buffer
*output
, const ldns_rr
*rr
)
1785 size_t total_rdfsize
= 0;
1788 ldns_buffer_printf(output
, "TYPE%u\t", ldns_rr_get_type(rr
));
1789 for (i
= 0; i
< ldns_rr_rd_count(rr
); i
++) {
1790 total_rdfsize
+= ldns_rdf_size(ldns_rr_rdf(rr
, i
));
1792 if (total_rdfsize
== 0) {
1793 ldns_buffer_printf(output
, "\\# 0\n");
1794 return ldns_buffer_status(output
);
1796 ldns_buffer_printf(output
, "\\# %d ", total_rdfsize
);
1797 for (i
= 0; i
< ldns_rr_rd_count(rr
); i
++) {
1798 for (j
= 0; j
< ldns_rdf_size(ldns_rr_rdf(rr
, i
)); j
++) {
1799 ldns_buffer_printf(output
, "%.2x",
1800 ldns_rdf_data(ldns_rr_rdf(rr
, i
))[j
]);
1803 ldns_buffer_printf(output
, "\n");
1804 return ldns_buffer_status(output
);
1808 ldns_rr2buffer_str_fmt(ldns_buffer
*output
,
1809 const ldns_output_format
*fmt
, const ldns_rr
*rr
)
1812 ldns_status status
= LDNS_STATUS_OK
;
1813 ldns_output_format_storage
* fmt_st
= (ldns_output_format_storage
*)fmt
;
1815 if (fmt_st
== NULL
) {
1816 fmt_st
= (ldns_output_format_storage
*)
1817 ldns_output_format_default
;
1819 if (!(fmt_st
->flags
& LDNS_FMT_SHORT
)) {
1821 if (LDNS_COMMENT_NULLS
& fmt_st
->flags
) {
1822 ldns_buffer_printf(output
, "; (null)\n");
1824 return ldns_buffer_status(output
);
1826 if (ldns_rr_owner(rr
)) {
1827 status
= ldns_rdf2buffer_str_dname(output
, ldns_rr_owner(rr
));
1829 if (status
!= LDNS_STATUS_OK
) {
1833 /* TTL should NOT be printed if it is a question */
1834 if (!ldns_rr_is_question(rr
)) {
1835 ldns_buffer_printf(output
, "\t%u", (unsigned)ldns_rr_ttl(rr
));
1838 ldns_buffer_printf(output
, "\t");
1839 status
= ldns_rr_class2buffer_str(output
, ldns_rr_get_class(rr
));
1840 if (status
!= LDNS_STATUS_OK
) {
1843 ldns_buffer_printf(output
, "\t");
1845 if (ldns_output_format_covers_type(fmt
, ldns_rr_get_type(rr
))) {
1846 return ldns_rr2buffer_str_rfc3597(output
, rr
);
1848 status
= ldns_rr_type2buffer_str(output
, ldns_rr_get_type(rr
));
1849 if (status
!= LDNS_STATUS_OK
) {
1853 if (ldns_rr_rd_count(rr
) > 0) {
1854 ldns_buffer_printf(output
, "\t");
1855 } else if (!ldns_rr_is_question(rr
)) {
1856 ldns_buffer_printf(output
, "\t\\# 0");
1858 } else if (ldns_rr_rd_count(rr
) == 0) {
1859 /* assert(fmt_st->flags & LDNS_FMT_SHORT); */
1861 ldns_buffer_printf(output
, "# 0");
1863 for (i
= 0; i
< ldns_rr_rd_count(rr
); i
++) {
1864 /* ldns_rdf2buffer_str handles NULL input fine! */
1865 if ((fmt_st
->flags
& LDNS_FMT_ZEROIZE_RRSIGS
) &&
1866 (ldns_rr_get_type(rr
) == LDNS_RR_TYPE_RRSIG
) &&
1867 ((/* inception */ i
== 4 &&
1868 ldns_rdf_get_type(ldns_rr_rdf(rr
, 4)) ==
1869 LDNS_RDF_TYPE_TIME
) ||
1870 (/* expiration */ i
== 5 &&
1871 ldns_rdf_get_type(ldns_rr_rdf(rr
, 5)) ==
1872 LDNS_RDF_TYPE_TIME
) ||
1873 (/* signature */ i
== 8 &&
1874 ldns_rdf_get_type(ldns_rr_rdf(rr
, 8)) ==
1875 LDNS_RDF_TYPE_B64
))) {
1877 ldns_buffer_printf(output
, "(null)");
1878 status
= ldns_buffer_status(output
);
1879 } else if ((fmt_st
->flags
& LDNS_FMT_PAD_SOA_SERIAL
) &&
1880 (ldns_rr_get_type(rr
) == LDNS_RR_TYPE_SOA
) &&
1881 /* serial */ i
== 2 &&
1882 ldns_rdf_get_type(ldns_rr_rdf(rr
, 2)) ==
1883 LDNS_RDF_TYPE_INT32
) {
1884 ldns_buffer_printf(output
, "%10lu",
1885 (unsigned long) ldns_read_uint32(
1886 ldns_rdf_data(ldns_rr_rdf(rr
, 2))));
1887 status
= ldns_buffer_status(output
);
1889 status
= ldns_rdf2buffer_str_fmt(output
,
1890 fmt
, ldns_rr_rdf(rr
, i
));
1892 if(status
!= LDNS_STATUS_OK
)
1894 if (i
< ldns_rr_rd_count(rr
) - 1) {
1895 ldns_buffer_printf(output
, " ");
1898 /* per RR special comments - handy for DNSSEC types */
1899 /* check to prevent question sec. rr from
1901 if (ldns_rr_rd_count(rr
) > 0) {
1902 switch (ldns_rr_get_type(rr
)) {
1903 case LDNS_RR_TYPE_DNSKEY
:
1904 /* if ldns_rr_rd_count(rr) > 0
1905 then ldns_rr_rdf(rr, 0) exists! */
1906 if (! (fmt_st
->flags
& LDNS_COMMENT_KEY
)) {
1909 flags
= ldns_rdf2native_int16(ldns_rr_rdf(rr
, 0));
1910 ldns_buffer_printf(output
, " ;{");
1911 if (fmt_st
->flags
& LDNS_COMMENT_KEY_ID
) {
1912 ldns_buffer_printf(output
, "id = %u",
1913 (unsigned int) ldns_calc_keytag(rr
));
1915 if ((fmt_st
->flags
& LDNS_COMMENT_KEY_TYPE
) &&
1916 (flags
& LDNS_KEY_ZONE_KEY
)){
1918 if (flags
& LDNS_KEY_SEP_KEY
) {
1919 ldns_buffer_printf(output
, " (ksk)");
1921 ldns_buffer_printf(output
, " (zsk)");
1923 if (fmt_st
->flags
& LDNS_COMMENT_KEY_SIZE
){
1924 ldns_buffer_printf(output
, ", ");
1926 } else if (fmt_st
->flags
1927 & (LDNS_COMMENT_KEY_ID
1928 |LDNS_COMMENT_KEY_SIZE
)) {
1929 ldns_buffer_printf( output
, ", ");
1931 if (fmt_st
->flags
& LDNS_COMMENT_KEY_SIZE
) {
1932 ldns_buffer_printf(output
, "size = %db",
1933 ldns_rr_dnskey_key_size(rr
));
1935 ldns_buffer_printf(output
, "}");
1937 case LDNS_RR_TYPE_RRSIG
:
1938 if ((fmt_st
->flags
& LDNS_COMMENT_KEY
)
1939 && (fmt_st
->flags
& LDNS_COMMENT_RRSIGS
)
1940 && ldns_rr_rdf(rr
, 6) != NULL
) {
1941 ldns_buffer_printf(output
, " ;{id = %d}",
1942 ldns_rdf2native_int16(
1943 ldns_rr_rdf(rr
, 6)));
1946 case LDNS_RR_TYPE_DS
:
1947 if ((fmt_st
->flags
& LDNS_COMMENT_BUBBLEBABBLE
) &&
1948 ldns_rr_rdf(rr
, 3) != NULL
) {
1950 uint8_t *data
= ldns_rdf_data(
1951 ldns_rr_rdf(rr
, 3));
1952 size_t len
= ldns_rdf_size(ldns_rr_rdf(rr
, 3));
1953 char *babble
= ldns_bubblebabble(data
, len
);
1955 ldns_buffer_printf(output
,
1961 case LDNS_RR_TYPE_NSEC3
:
1962 if (! (fmt_st
->flags
& LDNS_COMMENT_FLAGS
) &&
1963 ! (fmt_st
->flags
& LDNS_COMMENT_NSEC3_CHAIN
)) {
1966 ldns_buffer_printf(output
, " ;{");
1967 if ((fmt_st
->flags
& LDNS_COMMENT_FLAGS
)) {
1968 if (ldns_nsec3_optout(rr
)) {
1969 ldns_buffer_printf(output
,
1972 ldns_buffer_printf(output
," flags: -");
1974 if (fmt_st
->flags
& LDNS_COMMENT_NSEC3_CHAIN
&&
1975 fmt_st
->hashmap
!= NULL
) {
1976 ldns_buffer_printf(output
, ", ");
1979 if (fmt_st
->flags
& LDNS_COMMENT_NSEC3_CHAIN
&&
1980 fmt_st
->hashmap
!= NULL
) {
1981 ldns_rbnode_t
*node
;
1982 ldns_rdf
*key
= ldns_dname_label(
1983 ldns_rr_owner(rr
), 0);
1985 node
= ldns_rbtree_search(
1989 ldns_buffer_printf(output
,
1991 (void) ldns_rdf2buffer_str(
1993 ldns_dnssec_name_name(
1998 ldns_rdf_deep_free(key
);
2000 key
= ldns_b32_ext2dname(
2001 ldns_nsec3_next_owner(rr
));
2003 node
= ldns_rbtree_search(
2007 ldns_buffer_printf(output
,
2009 (void) ldns_rdf2buffer_str(
2011 ldns_dnssec_name_name(
2016 ldns_rdf_deep_free(key
);
2019 ldns_buffer_printf(output
, "}");
2027 ldns_buffer_printf(output
, "\n");
2028 return ldns_buffer_status(output
);
2032 ldns_rr2buffer_str(ldns_buffer
*output
, const ldns_rr
*rr
)
2034 return ldns_rr2buffer_str_fmt(output
, ldns_output_format_default
, rr
);
2038 ldns_rr_list2buffer_str_fmt(ldns_buffer
*output
,
2039 const ldns_output_format
*fmt
, const ldns_rr_list
*list
)
2043 for(i
= 0; i
< ldns_rr_list_rr_count(list
); i
++) {
2044 (void) ldns_rr2buffer_str_fmt(output
, fmt
,
2045 ldns_rr_list_rr(list
, i
));
2047 return ldns_buffer_status(output
);
2051 ldns_rr_list2buffer_str(ldns_buffer
*output
, const ldns_rr_list
*list
)
2053 return ldns_rr_list2buffer_str_fmt(
2054 output
, ldns_output_format_default
, list
);
2058 ldns_pktheader2buffer_str(ldns_buffer
*output
, const ldns_pkt
*pkt
)
2060 ldns_lookup_table
*opcode
= ldns_lookup_by_id(ldns_opcodes
,
2061 (int) ldns_pkt_get_opcode(pkt
));
2062 ldns_lookup_table
*rcode
= ldns_lookup_by_id(ldns_rcodes
,
2063 (int) ldns_pkt_get_rcode(pkt
));
2065 ldns_buffer_printf(output
, ";; ->>HEADER<<- ");
2067 ldns_buffer_printf(output
, "opcode: %s, ", opcode
->name
);
2069 ldns_buffer_printf(output
, "opcode: ?? (%u), ",
2070 ldns_pkt_get_opcode(pkt
));
2073 ldns_buffer_printf(output
, "rcode: %s, ", rcode
->name
);
2075 ldns_buffer_printf(output
, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt
));
2077 ldns_buffer_printf(output
, "id: %d\n", ldns_pkt_id(pkt
));
2078 ldns_buffer_printf(output
, ";; flags: ");
2080 if (ldns_pkt_qr(pkt
)) {
2081 ldns_buffer_printf(output
, "qr ");
2083 if (ldns_pkt_aa(pkt
)) {
2084 ldns_buffer_printf(output
, "aa ");
2086 if (ldns_pkt_tc(pkt
)) {
2087 ldns_buffer_printf(output
, "tc ");
2089 if (ldns_pkt_rd(pkt
)) {
2090 ldns_buffer_printf(output
, "rd ");
2092 if (ldns_pkt_cd(pkt
)) {
2093 ldns_buffer_printf(output
, "cd ");
2095 if (ldns_pkt_ra(pkt
)) {
2096 ldns_buffer_printf(output
, "ra ");
2098 if (ldns_pkt_ad(pkt
)) {
2099 ldns_buffer_printf(output
, "ad ");
2101 ldns_buffer_printf(output
, "; ");
2102 ldns_buffer_printf(output
, "QUERY: %u, ", ldns_pkt_qdcount(pkt
));
2103 ldns_buffer_printf(output
, "ANSWER: %u, ", ldns_pkt_ancount(pkt
));
2104 ldns_buffer_printf(output
, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt
));
2105 ldns_buffer_printf(output
, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt
));
2106 return ldns_buffer_status(output
);
2110 /* print EDNS option data in the Dig format: 76 61 6c 69 ... */
2112 ldns_edns_hex_data2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2115 for (j
= 0; j
< len
; j
++) {
2116 ldns_buffer_printf(output
, " %02x", data
[j
]);
2121 ldns_edns_llq2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2124 const char* llq_errors
[] = {"NO-ERROR", "SERV-FULL", "STATIC",
2125 "FORMAT-ERR", "NO-SUCH-LLQ", "BAD-VERS", "UNKNOWN_ERR"};
2126 const unsigned int llq_errors_num
= 7;
2127 const char* llq_opcodes
[] = {"LLQ-SETUP", "LLQ-REFRESH", "LLQ-EVENT"};
2128 const unsigned int llq_opcodes_num
= 3;
2130 uint16_t version
, llq_opcode
, error_code
;
2132 uint32_t lease_life
; /* Requested or granted life of LLQ, in seconds */
2134 ldns_buffer_printf(output
, "; Long-Lived Query:");
2136 /* read the record */
2138 ldns_buffer_printf(output
, " malformed LLQ ");
2139 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2141 return ldns_buffer_status(output
);
2143 version
= ldns_read_uint16(data
);
2144 llq_opcode
= ldns_read_uint16(data
+2);
2145 error_code
= ldns_read_uint16(data
+4);
2146 memmove(&llq_id
, data
+6, sizeof(uint64_t));
2147 lease_life
= ldns_read_uint32(data
+14);
2149 /* print option field entires */
2150 ldns_buffer_printf(output
, "v%d ", (int)version
);
2152 if(llq_opcode
< llq_opcodes_num
) {
2153 ldns_buffer_printf(output
, "%s", llq_opcodes
[llq_opcode
]);
2155 ldns_buffer_printf(output
, "opcode %d", (int)llq_opcode
);
2158 if(error_code
< llq_errors_num
)
2159 ldns_buffer_printf(output
, " %s", llq_errors
[error_code
]);
2161 ldns_buffer_printf(output
, " error %d", (int)error_code
);
2165 ldns_buffer_printf(output
, " id %llx lease-life %lu",
2166 (unsigned long long)llq_id
, (unsigned long)lease_life
);
2168 ldns_buffer_printf(output
, " id %I64x lease-life %lu",
2169 (unsigned long long)llq_id
, (unsigned long)lease_life
);
2171 return ldns_buffer_status(output
);
2176 ldns_edns_ul2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2180 ldns_buffer_printf(output
, "; Update Lease:");
2183 ldns_buffer_printf(output
, " malformed UL ");
2184 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2185 return ldns_buffer_status(output
);
2187 lease
= ldns_read_uint32(data
);
2188 ldns_buffer_printf(output
, "lease %lu", (unsigned long)lease
);
2190 return ldns_buffer_status(output
);
2194 ldns_edns_nsid2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2196 size_t i
, printed
=0;
2198 ldns_buffer_printf(output
, "; NSID:");
2199 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2201 /* print the human-readable text string */
2202 for(i
= 0; i
< len
; i
++) {
2203 if(isprint((unsigned char)data
[i
]) || data
[i
] == '\t') {
2205 ldns_buffer_printf(output
, " (");
2208 ldns_buffer_printf(output
, "%c", (char)data
[i
]);
2212 ldns_buffer_printf(output
, ")");
2213 return ldns_buffer_status(output
);
2218 ldns_edns_dau2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2221 ldns_lookup_table
*lt
;
2223 ldns_buffer_printf(output
, "; DNSSEC Algorithm Understood (DAU):");
2225 for(i
= 0; i
<len
; i
++) {
2226 lt
= ldns_lookup_by_id(ldns_algorithms
, data
[i
]);
2227 if (lt
&& lt
->name
) {
2228 ldns_buffer_printf(output
, " %s", lt
->name
);
2230 ldns_buffer_printf(output
, " ALG%u", data
[i
]);
2233 return ldns_buffer_status(output
);
2237 ldns_edns_dhu2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2240 ldns_lookup_table
*lt
;
2242 ldns_buffer_printf(output
, "; DS Hash Understood (DHU):");
2244 for(i
= 0; i
< len
; i
++) {
2245 lt
= ldns_lookup_by_id(ldns_hashes
, data
[i
]);
2246 if (lt
&& lt
->name
) {
2247 ldns_buffer_printf(output
, " %s", lt
->name
);
2249 ldns_buffer_printf(output
, " ALG%u", data
[i
]);
2252 return ldns_buffer_status(output
);
2256 ldns_edns_d3u2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2260 ldns_buffer_printf(output
, "; NSEC3 Hash Understood (N3U):");
2262 for(i
=0; i
<len
; i
++) {
2264 ldns_buffer_printf(output
, " SHA1");
2266 ldns_buffer_printf(output
, " %d", (int)data
[i
]);
2269 return ldns_buffer_status(output
);
2273 ldns_edns_subnet2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2276 uint8_t source
, scope
;
2278 ldns_buffer_printf(output
, "malformed subnet ");
2279 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2280 return ldns_buffer_status(output
);
2282 family
= ldns_read_uint16(data
);
2289 memset(ip4
, 0, sizeof(ip4
));
2291 ldns_buffer_printf(output
, "trailingdata:");
2292 ldns_edns_hex_data2buffer_str(output
, data
+4+4, len
-4-4);
2293 ldns_buffer_printf(output
, " ");
2296 memmove(ip4
, data
+4, len
-4);
2297 if(!inet_ntop(AF_INET
, ip4
, buf
, (socklen_t
) sizeof(buf
))) {
2298 ldns_buffer_printf(output
, "ip4ntoperror ");
2299 ldns_edns_hex_data2buffer_str(output
, data
+4+4, len
-4-4);
2301 ldns_buffer_printf(output
, "%s", buf
);
2303 } else if(family
== 2) {
2307 memset(ip6
, 0, sizeof(ip6
));
2309 ldns_buffer_printf(output
, "trailingdata:");
2310 ldns_edns_hex_data2buffer_str(output
, data
+4+16, len
-4-16);
2311 ldns_buffer_printf(output
, " ");
2314 memmove(ip6
, data
+4, len
-4);
2316 if(!inet_ntop(AF_INET6
, ip6
, buf
, (socklen_t
) sizeof(buf
))) {
2317 ldns_buffer_printf(output
, "ip6ntoperror ");
2318 ldns_edns_hex_data2buffer_str(output
, data
+4+4, len
-4-4);
2320 ldns_buffer_printf(output
, "%s", buf
);
2323 ldns_edns_hex_data2buffer_str(output
, data
+4+4, len
-4-4);
2327 ldns_buffer_printf(output
, "family %d ", (int)family
);
2328 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2330 ldns_buffer_printf(output
, "/%d scope /%d", (int)source
, (int)scope
);
2332 return ldns_buffer_status(output
);
2336 ldns_edns_expire2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2339 ldns_buffer_printf(output
, "; EXPIRE:");
2341 if (!(len
== 0) || len
== 4) {
2342 ldns_buffer_printf(output
, "malformed expire ");
2343 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2345 return ldns_buffer_status(output
);
2348 // TODO can this output be more accurate?
2349 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2351 return ldns_buffer_status(output
);
2356 ldns_edns_cookie2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2358 ldns_buffer_printf(output
, "; COOKIE:");
2360 /* the size of an EDNS cookie is restricted by RFC 7873 */
2361 if (!(len
== 8 || (len
>= 16 && len
< 40))) {
2362 ldns_buffer_printf(output
, "malformed cookie ");
2363 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2365 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2367 return ldns_buffer_status(output
);
2371 ldns_edns_keepalive2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2375 ldns_buffer_printf(output
, "; KEEPALIVE:");
2377 if(!(len
== 0 || len
== 2)) {
2378 ldns_buffer_printf(output
, "malformed keepalive ");
2379 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2381 return ldns_buffer_status(output
);
2385 ldns_buffer_printf(output
, "no timeout value (only valid for client option)");
2387 timeout
= ldns_read_uint16(data
);
2388 ldns_buffer_printf(output
, "timeout value in units of 100ms %u", (int)timeout
);
2390 return ldns_buffer_status(output
);
2394 ldns_edns_padding2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2396 ldns_buffer_printf(output
, "; PADDING: ");
2397 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2399 return ldns_buffer_status(output
);
2403 ldns_edns_chain2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2405 ldns_rdf
** temp
= NULL
;
2407 ldns_buffer_printf(output
, "; CHAIN: ");
2409 if (ldns_str2rdf_dname(temp
, (char*) data
) != LDNS_STATUS_OK
) {
2410 ldns_buffer_printf(output
, "malformed chain ");
2411 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2413 return ldns_buffer_status(output
);
2416 ldns_characters2buffer_str(output
, len
, data
);
2418 return ldns_buffer_status(output
);
2422 ldns_edns_key_tag2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2426 ldns_buffer_printf(output
, "; KEY TAG: ");
2428 if(len
< 2 || len
% 2 != 0) {
2429 ldns_buffer_printf(output
, "malformed key tag ");
2430 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2432 return ldns_buffer_status(output
);
2435 for (i
= 0; i
< len
; i
+= 2) {
2436 uint16_t tag
= ldns_read_uint16(data
);
2438 ldns_buffer_printf(output
, " %hu", tag
);
2441 return ldns_buffer_status(output
);
2445 ldns_edns_ede2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2449 ldns_buffer_printf(output
, "; EDE:");
2452 ldns_buffer_printf(output
, "malformed ede ");
2453 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2455 return ldns_buffer_status(output
);
2458 ede
= ldns_read_uint16(data
);
2461 case LDNS_EDE_OTHER
:
2462 ldns_buffer_printf(output
, " 0 (Other): ");
2464 case LDNS_EDE_UNSUPPORTED_DNSKEY_ALG
:
2465 ldns_buffer_printf(output
, " 1 (Unsupported DNSKEY Algorithm)");
2467 case LDNS_EDE_UNSUPPORTED_DS_DIGEST
:
2468 ldns_buffer_printf(output
, " 2 (Unsupported DS Digest type)");
2470 case LDNS_EDE_STALE_ANSWER
:
2471 ldns_buffer_printf(output
, " 3 (Stale Answer)");
2473 case LDNS_EDE_FORGED_ANSWER
:
2474 ldns_buffer_printf(output
, " 4 (Forged Answer)");
2476 case LDNS_EDE_DNSSEC_INDETERMINATE
:
2477 ldns_buffer_printf(output
, " 5 (DNSSEC Indeterminate)");
2479 case LDNS_EDE_DNSSEC_BOGUS
:
2480 ldns_buffer_printf(output
, " 6 (DNSSEC Bogus)");
2482 case LDNS_EDE_SIGNATURE_EXPIRED
:
2483 ldns_buffer_printf(output
, " 7 (Signature Expired)");
2485 case LDNS_EDE_SIGNATURE_NOT_YET_VALID
:
2486 ldns_buffer_printf(output
, " 8 (Signature Not Yet Valid)");
2488 case LDNS_EDE_DNSKEY_MISSING
:
2489 ldns_buffer_printf(output
, " 9 (DNSKEY Missing)");
2491 case LDNS_EDE_RRSIGS_MISSING
:
2492 ldns_buffer_printf(output
, " 10 (RRSIGs Missing)");
2494 case LDNS_EDE_NO_ZONE_KEY_BIT_SET
:
2495 ldns_buffer_printf(output
, " 11 (No Zone Key Bit Set)");
2497 case LDNS_EDE_NSEC_MISSING
:
2498 ldns_buffer_printf(output
, " 12 (NSEC Missing)");
2500 case LDNS_EDE_CACHED_ERROR
:
2501 ldns_buffer_printf(output
, " 13 (Cached Error)");
2503 case LDNS_EDE_NOT_READY
:
2504 ldns_buffer_printf(output
, " 14 (Not Ready)");
2506 case LDNS_EDE_BLOCKED
:
2507 ldns_buffer_printf(output
, " 15 (Blocked)");
2509 case LDNS_EDE_CENSORED
:
2510 ldns_buffer_printf(output
, " 16 (Censored)");
2512 case LDNS_EDE_FILTERED
:
2513 ldns_buffer_printf(output
, " 17 (Filtered)");
2515 case LDNS_EDE_PROHIBITED
:
2516 ldns_buffer_printf(output
, " 18 (Prohibited)");
2518 case LDNS_EDE_STALE_NXDOMAIN_ANSWER
:
2519 ldns_buffer_printf(output
, " 19 (NXDOMAIN Answer)");
2521 case LDNS_EDE_NOT_AUTHORITATIVE
:
2522 ldns_buffer_printf(output
, " 20 (Not Authoritative)");
2524 case LDNS_EDE_NOT_SUPPORTED
:
2525 ldns_buffer_printf(output
, " 21 (Not Supported)");
2527 case LDNS_EDE_NO_REACHABLE_AUTHORITY
:
2528 ldns_buffer_printf(output
, " 22 (No Reachable Authority)");
2530 case LDNS_EDE_NETWORK_ERROR
:
2531 ldns_buffer_printf(output
, " 23 (Network Error)");
2533 case LDNS_EDE_INVALID_DATA
:
2534 ldns_buffer_printf(output
, " 24 (Invalid Data)");
2536 case LDNS_EDE_SIGNATURE_EXPIRED_BEFORE_VALID
:
2537 ldns_buffer_printf(output
, " 25 (Signature Expired Before Valid)");
2539 case LDNS_EDE_TOO_EARLY
:
2540 ldns_buffer_printf(output
, " 26 (Too Early)");
2543 ldns_buffer_printf(output
, " %02x", data
[0]);
2544 ldns_buffer_printf(output
, " %02x", data
[1]);
2548 /* skip the EDE code in the output */
2553 /* format the hex bytes */
2554 ldns_buffer_printf(output
, ":");
2555 for (i
= 0; i
< len
; i
++) {
2556 ldns_buffer_printf(output
, " %02x", data
[i
]);
2559 /* format the human-readable string */
2560 ldns_buffer_printf(output
, " (");
2561 ldns_characters2buffer_str(output
, len
, data
);
2562 ldns_buffer_printf(output
, ")");
2565 return ldns_buffer_status(output
);
2569 ldns_edns_client_tag2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2571 ldns_buffer_printf(output
, "; CLIENT-TAG:");
2574 ldns_buffer_printf(output
, "malformed client-tag ");
2575 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2577 return ldns_buffer_status(output
);
2580 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2582 return ldns_buffer_status(output
);
2586 ldns_edns_server_tag2buffer_str(ldns_buffer
* output
, uint8_t* data
, size_t len
)
2588 ldns_buffer_printf(output
, "; SERVER-TAG:");
2591 ldns_buffer_printf(output
, "malformed server-tag ");
2592 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2594 return ldns_buffer_status(output
);
2597 ldns_edns_hex_data2buffer_str(output
, data
, len
);
2599 return ldns_buffer_status(output
);
2603 ldns_edns_option_list2buffer_str(ldns_buffer
*output
, ldns_edns_option_list
* edns_list
)
2605 size_t count
= ldns_edns_option_list_get_count(edns_list
);
2609 for (i
= 0; i
< count
; i
++) {
2610 ldns_edns_option_code code
;
2611 ldns_edns_option
* edns
= ldns_edns_option_list_get_option(edns_list
, i
);
2617 code
= ldns_edns_get_code(edns
);
2618 size
= ldns_edns_get_size(edns
);
2619 data
= ldns_edns_get_data(edns
);
2623 ldns_edns_llq2buffer_str(output
, data
, size
);
2626 ldns_edns_ul2buffer_str(output
, data
, size
);
2628 case LDNS_EDNS_NSID
:
2629 ldns_edns_nsid2buffer_str(output
, data
, size
);
2632 ldns_edns_dau2buffer_str(output
, data
, size
);
2635 ldns_edns_dhu2buffer_str(output
, data
, size
);
2638 ldns_edns_d3u2buffer_str(output
, data
, size
);
2640 case LDNS_EDNS_CLIENT_SUBNET
:
2641 ldns_edns_subnet2buffer_str(output
, data
, size
);
2643 case LDNS_EDNS_EXPIRE
:
2644 ldns_edns_expire2buffer_str(output
, data
, size
);
2646 case LDNS_EDNS_COOKIE
:
2647 ldns_edns_cookie2buffer_str(output
, data
, size
);
2649 case LDNS_EDNS_KEEPALIVE
:
2650 ldns_edns_keepalive2buffer_str(output
, data
, size
);
2652 case LDNS_EDNS_PADDING
:
2653 ldns_edns_padding2buffer_str(output
, data
, size
);
2655 case LDNS_EDNS_CHAIN
:
2656 ldns_edns_chain2buffer_str(output
, data
, size
);
2658 case LDNS_EDNS_KEY_TAG
:
2659 ldns_edns_key_tag2buffer_str(output
, data
, size
);
2662 ldns_edns_ede2buffer_str(output
, data
, size
);
2664 case LDNS_EDNS_CLIENT_TAG
:
2665 ldns_edns_client_tag2buffer_str(output
, data
, size
);
2667 case LDNS_EDNS_SERVER_TAG
:
2668 ldns_edns_server_tag2buffer_str(output
, data
, size
);
2671 ldns_buffer_printf(output
, "; OPT=%d:", code
);
2672 ldns_edns_hex_data2buffer_str(output
, data
, size
);
2675 ldns_buffer_printf(output
, "\n");
2678 return ldns_buffer_status(output
);
2683 ldns_pkt2buffer_str_fmt(ldns_buffer
*output
,
2684 const ldns_output_format
*fmt
, const ldns_pkt
*pkt
)
2687 ldns_status status
= LDNS_STATUS_OK
;
2689 struct timeval time
;
2691 int short_fmt
= fmt
&& (fmt
->flags
& LDNS_FMT_SHORT
);
2694 ldns_buffer_printf(output
, "null");
2695 return LDNS_STATUS_OK
;
2698 if (!ldns_buffer_status_ok(output
)) {
2699 return ldns_buffer_status(output
);
2703 status
= ldns_pktheader2buffer_str(output
, pkt
);
2704 if (status
!= LDNS_STATUS_OK
) {
2708 ldns_buffer_printf(output
, "\n");
2710 ldns_buffer_printf(output
, ";; QUESTION SECTION:\n;; ");
2713 for (i
= 0; i
< ldns_pkt_qdcount(pkt
); i
++) {
2714 status
= ldns_rr2buffer_str_fmt(output
, fmt
,
2716 ldns_pkt_question(pkt
), i
));
2717 if (status
!= LDNS_STATUS_OK
) {
2721 ldns_buffer_printf(output
, "\n");
2723 ldns_buffer_printf(output
, ";; ANSWER SECTION:\n");
2725 for (i
= 0; i
< ldns_pkt_ancount(pkt
); i
++) {
2726 status
= ldns_rr2buffer_str_fmt(output
, fmt
,
2728 ldns_pkt_answer(pkt
), i
));
2729 if (status
!= LDNS_STATUS_OK
) {
2734 ldns_buffer_printf(output
, "\n");
2736 ldns_buffer_printf(output
, ";; AUTHORITY SECTION:\n");
2738 for (i
= 0; i
< ldns_pkt_nscount(pkt
); i
++) {
2739 status
= ldns_rr2buffer_str_fmt(output
, fmt
,
2741 ldns_pkt_authority(pkt
), i
));
2742 if (status
!= LDNS_STATUS_OK
) {
2746 ldns_buffer_printf(output
, "\n");
2748 ldns_buffer_printf(output
, ";; ADDITIONAL SECTION:\n");
2749 for (i
= 0; i
< ldns_pkt_arcount(pkt
); i
++) {
2750 status
= ldns_rr2buffer_str_fmt(output
, fmt
,
2752 ldns_pkt_additional(pkt
), i
));
2753 if (status
!= LDNS_STATUS_OK
) {
2758 ldns_buffer_printf(output
, "\n");
2759 /* add some further fields */
2760 ldns_buffer_printf(output
, ";; Query time: %d msec\n",
2761 ldns_pkt_querytime(pkt
));
2762 if (ldns_pkt_edns(pkt
)) {
2763 ldns_buffer_printf(output
,
2764 ";; EDNS: version %u; flags:",
2765 ldns_pkt_edns_version(pkt
));
2766 if (ldns_pkt_edns_do(pkt
)) {
2767 ldns_buffer_printf(output
, " do");
2769 /* the extended rcode is the value set, shifted four bits,
2770 * and or'd with the original rcode */
2771 if (ldns_pkt_edns_extended_rcode(pkt
)) {
2772 ldns_buffer_printf(output
, " ; ext-rcode: %d",
2773 (ldns_pkt_edns_extended_rcode(pkt
) << 4 | ldns_pkt_get_rcode(pkt
)));
2775 ldns_buffer_printf(output
, " ; udp: %u\n",
2776 ldns_pkt_edns_udp_size(pkt
));
2778 if (pkt
->_edns_list
)
2779 ldns_edns_option_list2buffer_str(output
, pkt
->_edns_list
);
2781 else if (ldns_pkt_edns_data(pkt
)) {
2782 ldns_edns_option_list
* edns_list
;
2783 /* parse the EDNS data into separate EDNS options
2784 * and add them to the list */
2785 if ((edns_list
= pkt_edns_data2edns_option_list(ldns_pkt_edns_data(pkt
)))) {
2786 ldns_edns_option_list2buffer_str(output
, edns_list
);
2787 ldns_edns_option_list_deep_free(edns_list
);
2789 ldns_buffer_printf(output
, ";; Data: ");
2790 (void)ldns_rdf2buffer_str(output
, ldns_pkt_edns_data(pkt
));
2794 if (ldns_pkt_tsig(pkt
)) {
2795 ldns_buffer_printf(output
, ";; TSIG:\n;; ");
2796 (void) ldns_rr2buffer_str_fmt(
2797 output
, fmt
, ldns_pkt_tsig(pkt
));
2798 ldns_buffer_printf(output
, "\n");
2800 if (ldns_pkt_answerfrom(pkt
)) {
2801 tmp
= ldns_rdf2str(ldns_pkt_answerfrom(pkt
));
2802 ldns_buffer_printf(output
, ";; SERVER: %s\n", tmp
);
2805 time
= ldns_pkt_timestamp(pkt
);
2806 time_tt
= (time_t)time
.tv_sec
;
2807 ldns_buffer_printf(output
, ";; WHEN: %s",
2808 (char*)ctime(&time_tt
));
2810 ldns_buffer_printf(output
, ";; MSG SIZE rcvd: %d\n",
2811 (int)ldns_pkt_size(pkt
));
2817 ldns_pkt2buffer_str(ldns_buffer
*output
, const ldns_pkt
*pkt
)
2819 return ldns_pkt2buffer_str_fmt(output
, ldns_output_format_default
, pkt
);
2825 ldns_hmac_key2buffer_str(ldns_buffer
*output
, const ldns_key
*k
)
2829 ldns_rdf
*b64_bignum
;
2831 ldns_buffer_printf(output
, "Key: ");
2833 i
= ldns_key_hmac_size(k
);
2834 b64_bignum
= ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64
, i
, ldns_key_hmac_key(k
));
2835 status
= ldns_rdf2buffer_str(output
, b64_bignum
);
2836 ldns_rdf_deep_free(b64_bignum
);
2837 ldns_buffer_printf(output
, "\n");
2842 #if defined(HAVE_SSL) && defined(USE_GOST)
2844 ldns_gost_key2buffer_str(ldns_buffer
*output
, EVP_PKEY
*p
)
2846 unsigned char* pp
= NULL
;
2848 ldns_rdf
*b64_bignum
;
2851 ldns_buffer_printf(output
, "GostAsn1: ");
2853 ret
= i2d_PrivateKey(p
, &pp
);
2854 b64_bignum
= ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64
, (size_t)ret
, pp
);
2855 status
= ldns_rdf2buffer_str(output
, b64_bignum
);
2857 ldns_rdf_deep_free(b64_bignum
);
2859 ldns_buffer_printf(output
, "\n");
2864 #if defined(HAVE_SSL) && defined(USE_ED25519)
2866 ldns_ed25519_key2buffer_str(ldns_buffer
*output
, EVP_PKEY
*p
)
2868 unsigned char* pp
= NULL
;
2870 ldns_rdf
*b64_bignum
;
2873 ldns_buffer_printf(output
, "PrivateKey: ");
2875 ret
= i2d_PrivateKey(p
, &pp
);
2876 /* 16 byte asn (302e020100300506032b657004220420) + 32byte key */
2877 if(ret
!= 16 + 32) {
2879 return LDNS_STATUS_ERR
;
2881 b64_bignum
= ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64
,
2882 (size_t)ret
-16, pp
+16);
2883 status
= ldns_rdf2buffer_str(output
, b64_bignum
);
2885 ldns_rdf_deep_free(b64_bignum
);
2887 ldns_buffer_printf(output
, "\n");
2892 #if defined(HAVE_SSL) && defined(USE_ED448)
2894 ldns_ed448_key2buffer_str(ldns_buffer
*output
, EVP_PKEY
*p
)
2896 unsigned char* pp
= NULL
;
2898 ldns_rdf
*b64_bignum
;
2901 ldns_buffer_printf(output
, "PrivateKey: ");
2903 ret
= i2d_PrivateKey(p
, &pp
);
2904 /* some-ASN + 57byte key */
2905 if(ret
!= 16 + 57) {
2907 return LDNS_STATUS_ERR
;
2909 b64_bignum
= ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64
,
2910 (size_t)ret
-16, pp
+16);
2911 status
= ldns_rdf2buffer_str(output
, b64_bignum
);
2913 ldns_rdf_deep_free(b64_bignum
);
2915 ldns_buffer_printf(output
, "\n");
2920 #if defined(HAVE_SSL)
2921 /** print one b64 encoded bignum to a line in the keybuffer */
2923 ldns_print_bignum_b64_line(ldns_buffer
* output
, const char* label
, const BIGNUM
* num
)
2925 unsigned char *bignumbuf
= LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN
);
2926 if(!bignumbuf
) return 0;
2928 ldns_buffer_printf(output
, "%s: ", label
);
2930 ldns_rdf
*b64_bignum
= NULL
;
2931 int i
= BN_bn2bin(num
, bignumbuf
);
2932 if (i
> LDNS_MAX_KEYLEN
) {
2933 LDNS_FREE(bignumbuf
);
2936 b64_bignum
= ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64
, (size_t)i
, bignumbuf
);
2937 if (ldns_rdf2buffer_str(output
, b64_bignum
) != LDNS_STATUS_OK
) {
2938 ldns_rdf_deep_free(b64_bignum
);
2939 LDNS_FREE(bignumbuf
);
2942 ldns_rdf_deep_free(b64_bignum
);
2943 ldns_buffer_printf(output
, "\n");
2945 ldns_buffer_printf(output
, "(Not available)\n");
2947 LDNS_FREE(bignumbuf
);
2953 ldns_key2buffer_str(ldns_buffer
*output
, const ldns_key
*k
)
2955 ldns_status status
= LDNS_STATUS_OK
;
2956 unsigned char *bignum
;
2961 #endif /* USE_DSA */
2962 #endif /* HAVE_SSL */
2965 return LDNS_STATUS_ERR
;
2968 bignum
= LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN
);
2970 return LDNS_STATUS_ERR
;
2973 if (ldns_buffer_status_ok(output
)) {
2975 switch(ldns_key_algorithm(k
)) {
2976 case LDNS_SIGN_RSASHA1
:
2977 case LDNS_SIGN_RSASHA1_NSEC3
:
2978 case LDNS_SIGN_RSASHA256
:
2979 case LDNS_SIGN_RSASHA512
:
2980 case LDNS_SIGN_RSAMD5
:
2981 /* copied by looking at dnssec-keygen output */
2983 rsa
= ldns_key_rsa_key(k
);
2985 ldns_buffer_printf(output
,"Private-key-format: v1.2\n");
2986 switch(ldns_key_algorithm(k
)) {
2987 case LDNS_SIGN_RSAMD5
:
2988 ldns_buffer_printf(output
,
2989 "Algorithm: %u (RSA)\n",
2992 case LDNS_SIGN_RSASHA1
:
2993 ldns_buffer_printf(output
,
2994 "Algorithm: %u (RSASHA1)\n",
2997 case LDNS_SIGN_RSASHA1_NSEC3
:
2998 ldns_buffer_printf(output
,
2999 "Algorithm: %u (RSASHA1_NSEC3)\n",
3000 LDNS_RSASHA1_NSEC3
);
3003 case LDNS_SIGN_RSASHA256
:
3004 ldns_buffer_printf(output
,
3005 "Algorithm: %u (RSASHA256)\n",
3008 case LDNS_SIGN_RSASHA512
:
3009 ldns_buffer_printf(output
,
3010 "Algorithm: %u (RSASHA512)\n",
3016 fprintf(stderr
, "Warning: unknown signature ");
3018 "algorithm type %u\n",
3019 ldns_key_algorithm(k
));
3021 ldns_buffer_printf(output
,
3022 "Algorithm: %u (Unknown)\n",
3023 ldns_key_algorithm(k
));
3027 /* print to buf, convert to bin, convert to b64,
3032 const BIGNUM
*n
=NULL
, *e
=NULL
, *d
=NULL
,
3033 *p
=NULL
, *q
=NULL
, *dmp1
=NULL
,
3034 *dmq1
=NULL
, *iqmp
=NULL
;
3035 #if OPENSSL_VERSION_NUMBER < 0x10100000 || (defined(HAVE_LIBRESSL) && LIBRESSL_VERSION_NUMBER < 0x20700000)
3045 RSA_get0_key(rsa
, &n
, &e
, &d
);
3046 RSA_get0_factors(rsa
, &p
, &q
);
3047 RSA_get0_crt_params(rsa
, &dmp1
,
3050 if(!ldns_print_bignum_b64_line(output
, "Modulus", n
))
3052 if(!ldns_print_bignum_b64_line(output
, "PublicExponent", e
))
3054 if(!ldns_print_bignum_b64_line(output
, "PrivateExponent", d
))
3056 if(!ldns_print_bignum_b64_line(output
, "Prime1", p
))
3058 if(!ldns_print_bignum_b64_line(output
, "Prime2", q
))
3060 if(!ldns_print_bignum_b64_line(output
, "Exponent1", dmp1
))
3062 if(!ldns_print_bignum_b64_line(output
, "Exponent2", dmq1
))
3064 if(!ldns_print_bignum_b64_line(output
, "Coefficient", iqmp
))
3073 case LDNS_SIGN_DSA_NSEC3
:
3074 dsa
= ldns_key_dsa_key(k
);
3076 ldns_buffer_printf(output
,"Private-key-format: v1.2\n");
3077 if (ldns_key_algorithm(k
) == LDNS_SIGN_DSA
) {
3078 ldns_buffer_printf(output
,"Algorithm: 3 (DSA)\n");
3079 } else if (ldns_key_algorithm(k
) == LDNS_SIGN_DSA_NSEC3
) {
3080 ldns_buffer_printf(output
,"Algorithm: 6 (DSA_NSEC3)\n");
3083 /* print to buf, convert to bin, convert to b64,
3086 const BIGNUM
*p
=NULL
, *q
=NULL
, *g
=NULL
,
3087 *priv_key
=NULL
, *pub_key
=NULL
;
3088 #if OPENSSL_VERSION_NUMBER < 0x10100000 || (defined(HAVE_LIBRESSL) && LIBRESSL_VERSION_NUMBER < 0x20700000)
3093 priv_key
= dsa
->priv_key
;
3094 pub_key
= dsa
->pub_key
;
3097 DSA_get0_pqg(dsa
, &p
, &q
, &g
);
3098 DSA_get0_key(dsa
, &pub_key
, &priv_key
);
3100 if(!ldns_print_bignum_b64_line(output
, "Prime(p)", p
))
3102 if(!ldns_print_bignum_b64_line(output
, "Subprime(q)", q
))
3104 if(!ldns_print_bignum_b64_line(output
, "Base(g)", g
))
3106 if(!ldns_print_bignum_b64_line(output
, "Private_value(x)", priv_key
))
3108 if(!ldns_print_bignum_b64_line(output
, "Public_value(y)", pub_key
))
3112 #endif /* USE_DSA */
3113 case LDNS_SIGN_ECC_GOST
:
3114 /* no format defined, use blob */
3115 #if defined(HAVE_SSL) && defined(USE_GOST)
3116 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3117 ldns_buffer_printf(output
, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST
);
3118 status
= ldns_gost_key2buffer_str(output
,
3129 case LDNS_SIGN_ECDSAP256SHA256
:
3130 case LDNS_SIGN_ECDSAP384SHA384
:
3132 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3133 ldns_buffer_printf(output
, "Algorithm: %d (", ldns_key_algorithm(k
));
3134 status
=ldns_algorithm2buffer_str(output
, (ldns_algorithm
)ldns_key_algorithm(k
));
3136 ldns_buffer_printf(output
, ")\n");
3138 EC_KEY
* ec
= EVP_PKEY_get1_EC_KEY(k
->_key
.key
);
3139 const BIGNUM
* b
= EC_KEY_get0_private_key(ec
);
3140 if(!ldns_print_bignum_b64_line(output
, "PrivateKey", b
))
3142 /* down reference count in EC_KEY
3143 * its still assigned to the PKEY */
3152 case LDNS_SIGN_ED25519
:
3153 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3154 ldns_buffer_printf(output
, "Algorithm: %d (", ldns_key_algorithm(k
));
3155 status
=ldns_algorithm2buffer_str(output
, (ldns_algorithm
)ldns_key_algorithm(k
));
3156 ldns_buffer_printf(output
, ")\n");
3158 status
= ldns_ed25519_key2buffer_str(output
,
3161 #endif /* USE_ED25519 */
3163 case LDNS_SIGN_ED448
:
3164 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3165 ldns_buffer_printf(output
, "Algorithm: %d (", ldns_key_algorithm(k
));
3166 status
=ldns_algorithm2buffer_str(output
, (ldns_algorithm
)ldns_key_algorithm(k
));
3167 ldns_buffer_printf(output
, ")\n");
3169 status
= ldns_ed448_key2buffer_str(output
,
3172 #endif /* USE_ED448 */
3173 case LDNS_SIGN_HMACMD5
:
3174 /* there's not much of a format defined for TSIG */
3175 /* It's just a binary blob, Same for all algorithms */
3176 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3177 ldns_buffer_printf(output
, "Algorithm: 157 (HMAC_MD5)\n");
3178 status
= ldns_hmac_key2buffer_str(output
, k
);
3180 case LDNS_SIGN_HMACSHA1
:
3181 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3182 ldns_buffer_printf(output
, "Algorithm: 158 (HMAC_SHA1)\n");
3183 status
= ldns_hmac_key2buffer_str(output
, k
);
3185 case LDNS_SIGN_HMACSHA224
:
3186 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3187 ldns_buffer_printf(output
, "Algorithm: 162 (HMAC_SHA224)\n");
3188 status
= ldns_hmac_key2buffer_str(output
, k
);
3190 case LDNS_SIGN_HMACSHA256
:
3191 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3192 ldns_buffer_printf(output
, "Algorithm: 159 (HMAC_SHA256)\n");
3193 status
= ldns_hmac_key2buffer_str(output
, k
);
3195 case LDNS_SIGN_HMACSHA384
:
3196 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3197 ldns_buffer_printf(output
, "Algorithm: 164 (HMAC_SHA384)\n");
3198 status
= ldns_hmac_key2buffer_str(output
, k
);
3200 case LDNS_SIGN_HMACSHA512
:
3201 ldns_buffer_printf(output
, "Private-key-format: v1.2\n");
3202 ldns_buffer_printf(output
, "Algorithm: 165 (HMAC_SHA512)\n");
3203 status
= ldns_hmac_key2buffer_str(output
, k
);
3206 #endif /* HAVE_SSL */
3209 return ldns_buffer_status(output
);
3215 /* compiles warn the label isn't used */
3218 return LDNS_STATUS_ERR
;
3219 #endif /* HAVE_SSL */
3224 * Zero terminate the buffer and copy data.
3227 ldns_buffer2str(ldns_buffer
*buffer
)
3231 /* check if buffer ends with \0, if not, and
3232 if there is space, add it */
3233 if (*(ldns_buffer_at(buffer
, ldns_buffer_position(buffer
))) != 0) {
3234 if (!ldns_buffer_reserve(buffer
, 1)) {
3237 ldns_buffer_write_char(buffer
, (uint8_t) '\0');
3238 if (!ldns_buffer_set_capacity(buffer
, ldns_buffer_position(buffer
))) {
3243 str
= strdup((const char *)ldns_buffer_begin(buffer
));
3251 * Zero terminate the buffer and export data.
3254 ldns_buffer_export2str(ldns_buffer
*buffer
)
3256 /* Append '\0' as string terminator */
3257 if (! ldns_buffer_reserve(buffer
, 1)) {
3260 ldns_buffer_write_char(buffer
, 0);
3262 /* reallocate memory to the size of the string and export */
3263 ldns_buffer_set_capacity(buffer
, ldns_buffer_position(buffer
));
3264 return ldns_buffer_export(buffer
);
3268 ldns_rdf2str(const ldns_rdf
*rdf
)
3270 char *result
= NULL
;
3271 ldns_buffer
*tmp_buffer
= ldns_buffer_new(LDNS_MAX_PACKETLEN
);
3276 if (ldns_rdf2buffer_str(tmp_buffer
, rdf
) == LDNS_STATUS_OK
) {
3277 /* export and return string, destroy rest */
3278 result
= ldns_buffer_export2str(tmp_buffer
);
3280 ldns_buffer_free(tmp_buffer
);
3285 ldns_rr2str_fmt(const ldns_output_format
*fmt
, const ldns_rr
*rr
)
3287 char *result
= NULL
;
3288 ldns_buffer
*tmp_buffer
= ldns_buffer_new(LDNS_MAX_PACKETLEN
);
3293 if (ldns_rr2buffer_str_fmt(tmp_buffer
, fmt
, rr
)
3294 == LDNS_STATUS_OK
) {
3295 /* export and return string, destroy rest */
3296 result
= ldns_buffer_export2str(tmp_buffer
);
3298 ldns_buffer_free(tmp_buffer
);
3303 ldns_rr2str(const ldns_rr
*rr
)
3305 return ldns_rr2str_fmt(ldns_output_format_default
, rr
);
3309 ldns_pkt2str_fmt(const ldns_output_format
*fmt
, const ldns_pkt
*pkt
)
3311 char *result
= NULL
;
3312 ldns_buffer
*tmp_buffer
= ldns_buffer_new(LDNS_MAX_PACKETLEN
);
3317 if (ldns_pkt2buffer_str_fmt(tmp_buffer
, fmt
, pkt
)
3318 == LDNS_STATUS_OK
) {
3319 /* export and return string, destroy rest */
3320 result
= ldns_buffer_export2str(tmp_buffer
);
3323 ldns_buffer_free(tmp_buffer
);
3328 ldns_pkt2str(const ldns_pkt
*pkt
)
3330 return ldns_pkt2str_fmt(ldns_output_format_default
, pkt
);
3334 ldns_key2str(const ldns_key
*k
)
3336 char *result
= NULL
;
3337 ldns_buffer
*tmp_buffer
= ldns_buffer_new(LDNS_MAX_PACKETLEN
);
3342 if (ldns_key2buffer_str(tmp_buffer
, k
) == LDNS_STATUS_OK
) {
3343 /* export and return string, destroy rest */
3344 result
= ldns_buffer_export2str(tmp_buffer
);
3346 ldns_buffer_free(tmp_buffer
);
3351 ldns_rr_list2str_fmt(const ldns_output_format
*fmt
, const ldns_rr_list
*list
)
3353 char *result
= NULL
;
3354 ldns_buffer
*tmp_buffer
= ldns_buffer_new(LDNS_MAX_PACKETLEN
);
3360 if (ldns_rr_list2buffer_str_fmt(
3361 tmp_buffer
, fmt
, list
)
3362 == LDNS_STATUS_OK
) {
3366 fmt
= ldns_output_format_default
;
3368 if (fmt
->flags
& LDNS_COMMENT_NULLS
) {
3369 ldns_buffer_printf(tmp_buffer
, "; (null)\n");
3373 /* export and return string, destroy rest */
3374 result
= ldns_buffer_export2str(tmp_buffer
);
3375 ldns_buffer_free(tmp_buffer
);
3380 ldns_rr_list2str(const ldns_rr_list
*list
)
3382 return ldns_rr_list2str_fmt(ldns_output_format_default
, list
);
3386 ldns_rdf_print(FILE *output
, const ldns_rdf
*rdf
)
3388 char *str
= ldns_rdf2str(rdf
);
3390 fprintf(output
, "%s", str
);
3392 fprintf(output
, ";Unable to convert rdf to string\n");
3398 ldns_rr_print_fmt(FILE *output
,
3399 const ldns_output_format
*fmt
, const ldns_rr
*rr
)
3401 char *str
= ldns_rr2str_fmt(fmt
, rr
);
3403 fprintf(output
, "%s", str
);
3405 fprintf(output
, ";Unable to convert rr to string\n");
3411 ldns_rr_print(FILE *output
, const ldns_rr
*rr
)
3413 ldns_rr_print_fmt(output
, ldns_output_format_default
, rr
);
3417 ldns_pkt_print_fmt(FILE *output
,
3418 const ldns_output_format
*fmt
, const ldns_pkt
*pkt
)
3420 char *str
= ldns_pkt2str_fmt(fmt
, pkt
);
3422 fprintf(output
, "%s", str
);
3424 fprintf(output
, ";Unable to convert packet to string\n");
3430 ldns_pkt_print(FILE *output
, const ldns_pkt
*pkt
)
3432 ldns_pkt_print_fmt(output
, ldns_output_format_default
, pkt
);
3436 ldns_rr_list_print_fmt(FILE *output
,
3437 const ldns_output_format
*fmt
, const ldns_rr_list
*lst
)
3440 for (i
= 0; i
< ldns_rr_list_rr_count(lst
); i
++) {
3441 ldns_rr_print_fmt(output
, fmt
, ldns_rr_list_rr(lst
, i
));
3446 ldns_rr_list_print(FILE *output
, const ldns_rr_list
*lst
)
3448 ldns_rr_list_print_fmt(output
, ldns_output_format_default
, lst
);
3452 ldns_resolver_print_fmt(FILE *output
,
3453 const ldns_output_format
*fmt
, const ldns_resolver
*r
)
3462 n
= ldns_resolver_nameservers(r
);
3463 s
= ldns_resolver_searchlist(r
);
3464 rtt
= ldns_resolver_rtt(r
);
3466 fprintf(output
, "port: %d\n", (int)ldns_resolver_port(r
));
3467 fprintf(output
, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r
));
3468 fprintf(output
, "use ip6: %d\n", (int)ldns_resolver_ip6(r
));
3470 fprintf(output
, "recursive: %d\n", ldns_resolver_recursive(r
));
3471 fprintf(output
, "usevc: %d\n", ldns_resolver_usevc(r
));
3472 fprintf(output
, "igntc: %d\n", ldns_resolver_igntc(r
));
3473 fprintf(output
, "fail: %d\n", ldns_resolver_fail(r
));
3474 fprintf(output
, "retry: %d\n", (int)ldns_resolver_retry(r
));
3475 fprintf(output
, "retrans: %d\n", (int)ldns_resolver_retrans(r
));
3476 fprintf(output
, "fallback: %d\n", ldns_resolver_fallback(r
));
3477 fprintf(output
, "random: %d\n", ldns_resolver_random(r
));
3478 fprintf(output
, "timeout: %d\n", (int)ldns_resolver_timeout(r
).tv_sec
);
3479 fprintf(output
, "dnssec: %d\n", ldns_resolver_dnssec(r
));
3480 fprintf(output
, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r
));
3481 fprintf(output
, "trust anchors (%d listed):\n",
3482 (int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r
)));
3483 ldns_rr_list_print_fmt(output
, fmt
, ldns_resolver_dnssec_anchors(r
));
3484 fprintf(output
, "tsig: %s %s\n",
3485 ldns_resolver_tsig_keyname(r
)?ldns_resolver_tsig_keyname(r
):"-",
3486 ldns_resolver_tsig_algorithm(r
)?ldns_resolver_tsig_algorithm(r
):"-");
3487 fprintf(output
, "debug: %d\n", ldns_resolver_debug(r
));
3489 fprintf(output
, "default domain: ");
3490 ldns_rdf_print(output
, ldns_resolver_domain(r
));
3491 fprintf(output
, "\n");
3492 fprintf(output
, "apply default domain: %d\n", ldns_resolver_defnames(r
));
3494 fprintf(output
, "searchlist (%d listed):\n", (int)ldns_resolver_searchlist_count(r
));
3495 for (i
= 0; i
< ldns_resolver_searchlist_count(r
); i
++) {
3496 fprintf(output
, "\t");
3497 ldns_rdf_print(output
, s
[i
]);
3498 fprintf(output
, "\n");
3500 fprintf(output
, "apply search list: %d\n", ldns_resolver_dnsrch(r
));
3502 fprintf(output
, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r
));
3503 for (i
= 0; i
< ldns_resolver_nameserver_count(r
); i
++) {
3504 fprintf(output
, "\t");
3505 ldns_rdf_print(output
, n
[i
]);
3507 switch ((int)rtt
[i
]) {
3508 case LDNS_RESOLV_RTT_MIN
:
3509 fprintf(output
, " - reachable\n");
3511 case LDNS_RESOLV_RTT_INF
:
3512 fprintf(output
, " - unreachable\n");
3519 ldns_resolver_print(FILE *output
, const ldns_resolver
*r
)
3521 ldns_resolver_print_fmt(output
, ldns_output_format_default
, r
);
3525 ldns_zone_print_fmt(FILE *output
,
3526 const ldns_output_format
*fmt
, const ldns_zone
*z
)
3528 if(ldns_zone_soa(z
))
3529 ldns_rr_print_fmt(output
, fmt
, ldns_zone_soa(z
));
3530 ldns_rr_list_print_fmt(output
, fmt
, ldns_zone_rrs(z
));
3533 ldns_zone_print(FILE *output
, const ldns_zone
*z
)
3535 ldns_zone_print_fmt(output
, ldns_output_format_default
, z
);