host2str.c revision 246827
1238104Sdes/*
2238104Sdes * host2str.c
3238104Sdes *
4238104Sdes * conversion routines from the host format
5238104Sdes * to the presentation format (strings)
6238104Sdes *
7238104Sdes * a Net::DNS like library for C
8238104Sdes *
9238104Sdes * (c) NLnet Labs, 2004-2006
10238104Sdes *
11238104Sdes * See the file LICENSE for the license
12238104Sdes */
13238104Sdes#include <ldns/config.h>
14238104Sdes
15238104Sdes#include <ldns/ldns.h>
16238104Sdes
17238104Sdes#include <limits.h>
18238104Sdes
19238104Sdes#ifdef HAVE_SYS_SOCKET_H
20238104Sdes#include <sys/socket.h>
21238104Sdes#endif
22238104Sdes#ifdef HAVE_ARPA_INET_H
23238104Sdes#include <arpa/inet.h>
24238104Sdes#endif
25238104Sdes#ifdef HAVE_NETDB_H
26238104Sdes#include <netdb.h>
27238104Sdes#endif
28238104Sdes#include <time.h>
29238104Sdes#include <sys/time.h>
30238104Sdes
31238104Sdes#ifndef INET_ADDRSTRLEN
32238104Sdes#define INET_ADDRSTRLEN 16
33238104Sdes#endif
34238104Sdes#ifndef INET6_ADDRSTRLEN
35238104Sdes#define INET6_ADDRSTRLEN 46
36238104Sdes#endif
37238104Sdes
38238104Sdes/* lookup tables for standard DNS stuff  */
39238104Sdes
40238104Sdes/* Taken from RFC 2535, section 7.  */
41238104Sdesldns_lookup_table ldns_algorithms[] = {
42238104Sdes        { LDNS_RSAMD5, "RSAMD5" },
43238104Sdes        { LDNS_DH, "DH" },
44238104Sdes        { LDNS_DSA, "DSA" },
45238104Sdes        { LDNS_ECC, "ECC" },
46238104Sdes        { LDNS_RSASHA1, "RSASHA1" },
47238104Sdes        { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" },
48238104Sdes        { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" },
49238104Sdes#ifdef USE_SHA2
50238104Sdes	{ LDNS_RSASHA256, "RSASHA256"},
51238104Sdes	{ LDNS_RSASHA512, "RSASHA512"},
52238104Sdes#endif
53238104Sdes#ifdef USE_GOST
54238104Sdes	{ LDNS_ECC_GOST, "ECC-GOST"},
55238104Sdes#endif
56238104Sdes#ifdef USE_ECDSA
57238104Sdes        { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"},
58238104Sdes        { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"},
59238104Sdes#endif
60238104Sdes        { LDNS_INDIRECT, "INDIRECT" },
61238104Sdes        { LDNS_PRIVATEDNS, "PRIVATEDNS" },
62238104Sdes        { LDNS_PRIVATEOID, "PRIVATEOID" },
63238104Sdes        { 0, NULL }
64238104Sdes};
65238104Sdes
66238104Sdes/* Taken from RFC 4398  */
67238104Sdesldns_lookup_table ldns_cert_algorithms[] = {
68238104Sdes        { LDNS_CERT_PKIX, "PKIX" },
69238104Sdes        { LDNS_CERT_SPKI, "SPKI" },
70238104Sdes        { LDNS_CERT_PGP, "PGP" },
71238104Sdes        { LDNS_CERT_IPKIX, "IPKIX" },
72238104Sdes        { LDNS_CERT_ISPKI, "ISPKI" },
73238104Sdes        { LDNS_CERT_IPGP, "IPGP" },
74238104Sdes        { LDNS_CERT_ACPKIX, "ACPKIX" },
75238104Sdes        { LDNS_CERT_IACPKIX, "IACPKIX" },
76238104Sdes        { LDNS_CERT_URI, "URI" },
77238104Sdes        { LDNS_CERT_OID, "OID" },
78238104Sdes        { 0, NULL }
79238104Sdes};
80238104Sdes
81238104Sdes/* classes  */
82238104Sdesldns_lookup_table ldns_rr_classes[] = {
83238104Sdes        { LDNS_RR_CLASS_IN, "IN" },
84238104Sdes        { LDNS_RR_CLASS_CH, "CH" },
85238104Sdes        { LDNS_RR_CLASS_HS, "HS" },
86238104Sdes        { LDNS_RR_CLASS_NONE, "NONE" },
87238104Sdes        { LDNS_RR_CLASS_ANY, "ANY" },
88238104Sdes        { 0, NULL }
89238104Sdes};
90238104Sdes
91238104Sdes/* if these are used elsewhere */
92238104Sdesldns_lookup_table ldns_rcodes[] = {
93238104Sdes        { LDNS_RCODE_NOERROR, "NOERROR" },
94238104Sdes        { LDNS_RCODE_FORMERR, "FORMERR" },
95238104Sdes        { LDNS_RCODE_SERVFAIL, "SERVFAIL" },
96238104Sdes        { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" },
97238104Sdes        { LDNS_RCODE_NOTIMPL, "NOTIMPL" },
98238104Sdes        { LDNS_RCODE_REFUSED, "REFUSED" },
99238104Sdes        { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" },
100238104Sdes        { LDNS_RCODE_YXRRSET, "YXRRSET" },
101238104Sdes        { LDNS_RCODE_NXRRSET, "NXRRSET" },
102238104Sdes        { LDNS_RCODE_NOTAUTH, "NOTAUTH" },
103238104Sdes        { LDNS_RCODE_NOTZONE, "NOTZONE" },
104238104Sdes        { 0, NULL }
105238104Sdes};
106238104Sdes
107238104Sdesldns_lookup_table ldns_opcodes[] = {
108238104Sdes        { LDNS_PACKET_QUERY, "QUERY" },
109238104Sdes        { LDNS_PACKET_IQUERY, "IQUERY" },
110238104Sdes        { LDNS_PACKET_STATUS, "STATUS" },
111238104Sdes	{ LDNS_PACKET_NOTIFY, "NOTIFY" },
112238104Sdes	{ LDNS_PACKET_UPDATE, "UPDATE" },
113238104Sdes        { 0, NULL }
114238104Sdes};
115238104Sdes
116238104Sdesconst ldns_output_format   ldns_output_format_nocomments_record = { 0, NULL };
117238104Sdesconst ldns_output_format  *ldns_output_format_nocomments
118238104Sdes			= &ldns_output_format_nocomments_record;
119238104Sdesconst ldns_output_format   ldns_output_format_onlykeyids_record = {
120238104Sdes	LDNS_COMMENT_KEY, NULL
121238104Sdes};
122238104Sdesconst ldns_output_format  *ldns_output_format_onlykeyids
123238104Sdes			= &ldns_output_format_onlykeyids_record;
124238104Sdesconst ldns_output_format  *ldns_output_format_default
125238104Sdes			= &ldns_output_format_onlykeyids_record;
126238104Sdesconst ldns_output_format   ldns_output_format_bubblebabble_record = {
127238104Sdes	LDNS_COMMENT_KEY | LDNS_COMMENT_BUBBLEBABBLE | LDNS_COMMENT_FLAGS, NULL
128238104Sdes};
129238104Sdesconst ldns_output_format  *ldns_output_format_bubblebabble
130238104Sdes			= &ldns_output_format_bubblebabble_record;
131238104Sdes
132238104Sdesldns_status
133238104Sdesldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode)
134238104Sdes{
135238104Sdes	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_opcodes, opcode);
136238104Sdes	if (lt && lt->name) {
137238104Sdes		ldns_buffer_printf(output, "%s", lt->name);
138238104Sdes	} else {
139238104Sdes		ldns_buffer_printf(output, "OPCODE%u", opcode);
140238104Sdes	}
141238104Sdes	return ldns_buffer_status(output);
142238104Sdes}
143238104Sdes
144238104Sdesldns_status
145238104Sdesldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode)
146238104Sdes{
147238104Sdes	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_rcodes, rcode);
148238104Sdes	if (lt && lt->name) {
149238104Sdes		ldns_buffer_printf(output, "%s", lt->name);
150238104Sdes	} else {
151238104Sdes		ldns_buffer_printf(output, "RCODE%u", rcode);
152238104Sdes	}
153238104Sdes	return ldns_buffer_status(output);
154238104Sdes}
155238104Sdes
156238104Sdesldns_status
157238104Sdesldns_algorithm2buffer_str(ldns_buffer *output,
158238104Sdes                          ldns_algorithm algorithm)
159238104Sdes{
160238104Sdes	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_algorithms,
161238104Sdes	                                          algorithm);
162238104Sdes	if (lt && lt->name) {
163238104Sdes		ldns_buffer_printf(output, "%s", lt->name);
164238104Sdes	} else {
165238104Sdes		ldns_buffer_printf(output, "ALG%u", algorithm);
166238104Sdes	}
167238104Sdes	return ldns_buffer_status(output);
168238104Sdes}
169238104Sdes
170238104Sdesldns_status
171238104Sdesldns_cert_algorithm2buffer_str(ldns_buffer *output,
172238104Sdes                               ldns_cert_algorithm cert_algorithm)
173238104Sdes{
174238104Sdes	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_cert_algorithms,
175238104Sdes	                                          cert_algorithm);
176238104Sdes	if (lt && lt->name) {
177238104Sdes		ldns_buffer_printf(output, "%s", lt->name);
178238104Sdes	} else {
179238104Sdes		ldns_buffer_printf(output, "CERT_ALG%u",
180238104Sdes		                   cert_algorithm);
181238104Sdes	}
182238104Sdes	return ldns_buffer_status(output);
183238104Sdes}
184238104Sdes
185238104Sdeschar *
186238104Sdesldns_pkt_opcode2str(ldns_pkt_opcode opcode)
187238104Sdes{
188238104Sdes	char *str;
189238104Sdes	ldns_buffer *buf;
190238104Sdes
191238104Sdes	buf = ldns_buffer_new(12);
192238104Sdes	if (!buf) {
193238104Sdes		return NULL;
194238104Sdes	}
195238104Sdes
196238104Sdes	str = NULL;
197238104Sdes	if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) {
198238104Sdes		str = ldns_buffer2str(buf);
199238104Sdes	}
200238104Sdes
201238104Sdes	ldns_buffer_free(buf);
202238104Sdes	return str;
203238104Sdes}
204238104Sdes
205238104Sdeschar *
206238104Sdesldns_pkt_rcode2str(ldns_pkt_rcode rcode)
207238104Sdes{
208238104Sdes	char *str;
209238104Sdes	ldns_buffer *buf;
210238104Sdes
211238104Sdes	buf = ldns_buffer_new(10);
212238104Sdes	if (!buf) {
213238104Sdes		return NULL;
214238104Sdes	}
215238104Sdes
216238104Sdes	str = NULL;
217238104Sdes	if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) {
218238104Sdes		str = ldns_buffer2str(buf);
219238104Sdes	}
220238104Sdes
221238104Sdes	ldns_buffer_free(buf);
222238104Sdes	return str;
223238104Sdes}
224238104Sdes
225238104Sdeschar *
226238104Sdesldns_pkt_algorithm2str(ldns_algorithm algorithm)
227238104Sdes{
228238104Sdes	char *str;
229238104Sdes	ldns_buffer *buf;
230238104Sdes
231238104Sdes	buf = ldns_buffer_new(10);
232238104Sdes	if (!buf) {
233238104Sdes		return NULL;
234238104Sdes	}
235238104Sdes
236238104Sdes	str = NULL;
237238104Sdes	if (ldns_algorithm2buffer_str(buf, algorithm)
238238104Sdes	    == LDNS_STATUS_OK) {
239238104Sdes		str = ldns_buffer2str(buf);
240238104Sdes	}
241238104Sdes
242238104Sdes	ldns_buffer_free(buf);
243238104Sdes	return str;
244238104Sdes}
245238104Sdes
246238104Sdeschar *
247238104Sdesldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)
248238104Sdes{
249238104Sdes	char *str;
250238104Sdes	ldns_buffer *buf;
251238104Sdes
252238104Sdes	buf = ldns_buffer_new(10);
253238104Sdes	if (!buf) {
254238104Sdes		return NULL;
255238104Sdes	}
256238104Sdes
257238104Sdes	str = NULL;
258238104Sdes	if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm)
259238104Sdes	    == LDNS_STATUS_OK) {
260238104Sdes		str = ldns_buffer2str(buf);
261238104Sdes	}
262238104Sdes
263238104Sdes	ldns_buffer_free(buf);
264238104Sdes	return str;
265238104Sdes}
266238104Sdes
267238104Sdes
268238104Sdes/* do NOT pass compressed data here :p */
269238104Sdesldns_status
270238104Sdesldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname)
271238104Sdes{
272238104Sdes	/* can we do with 1 pos var? or without at all? */
273238104Sdes	uint8_t src_pos = 0;
274238104Sdes	uint8_t len;
275238104Sdes	uint8_t *data;
276238104Sdes	uint8_t i;
277238104Sdes	unsigned char c;
278238104Sdes
279238104Sdes	data = (uint8_t*)ldns_rdf_data(dname);
280238104Sdes	len = data[src_pos];
281238104Sdes
282238104Sdes	if (ldns_rdf_size(dname) > LDNS_MAX_DOMAINLEN) {
283238104Sdes		/* too large, return */
284238104Sdes		return LDNS_STATUS_DOMAINNAME_OVERFLOW;
285238104Sdes	}
286238104Sdes
287238104Sdes	/* special case: root label */
288238104Sdes	if (1 == ldns_rdf_size(dname)) {
289238104Sdes		ldns_buffer_printf(output, ".");
290238104Sdes	} else {
291238104Sdes		while ((len > 0) && src_pos < ldns_rdf_size(dname)) {
292238104Sdes			src_pos++;
293238104Sdes			for(i = 0; i < len; i++) {
294238104Sdes				/* paranoia check for various 'strange'
295238104Sdes				   characters in dnames
296238104Sdes				*/
297238104Sdes				c = (unsigned char) data[src_pos];
298238104Sdes				if(c == '.' || c == ';' ||
299238104Sdes				   c == '(' || c == ')' ||
300238104Sdes				   c == '\\') {
301238104Sdes					ldns_buffer_printf(output, "\\%c",
302238104Sdes							data[src_pos]);
303238104Sdes				} else if (!(isascii(c) && isgraph(c))) {
304238104Sdes					ldns_buffer_printf(output, "\\%03u",
305238104Sdes						        data[src_pos]);
306238104Sdes				} else {
307238104Sdes					ldns_buffer_printf(output, "%c", data[src_pos]);
308238104Sdes				}
309238104Sdes				src_pos++;
310238104Sdes			}
311238104Sdes
312238104Sdes			if (src_pos < ldns_rdf_size(dname)) {
313238104Sdes				ldns_buffer_printf(output, ".");
314238104Sdes			}
315238104Sdes			len = data[src_pos];
316238104Sdes		}
317238104Sdes	}
318238104Sdes	return ldns_buffer_status(output);
319238104Sdes}
320238104Sdes
321238104Sdesldns_status
322238104Sdesldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf)
323238104Sdes{
324238104Sdes	uint8_t data = ldns_rdf_data(rdf)[0];
325238104Sdes	ldns_buffer_printf(output, "%lu", (unsigned long) data);
326238104Sdes	return ldns_buffer_status(output);
327238104Sdes}
328238104Sdes
329238104Sdesldns_status
330238104Sdesldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf)
331238104Sdes{
332238104Sdes	uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
333238104Sdes	ldns_buffer_printf(output, "%lu", (unsigned long) data);
334238104Sdes	return ldns_buffer_status(output);
335238104Sdes}
336238104Sdes
337238104Sdesldns_status
338238104Sdesldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf)
339238104Sdes{
340238104Sdes	uint32_t data = ldns_read_uint32(ldns_rdf_data(rdf));
341238104Sdes	ldns_buffer_printf(output, "%lu", (unsigned long) data);
342238104Sdes	return ldns_buffer_status(output);
343238104Sdes}
344238104Sdes
345238104Sdesldns_status
346238104Sdesldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf)
347238104Sdes{
348238104Sdes	/* create a YYYYMMDDHHMMSS string if possible */
349238104Sdes	struct tm tm;
350238104Sdes	char date_buf[16];
351238104Sdes
352238104Sdes	memset(&tm, 0, sizeof(tm));
353238104Sdes	if (ldns_serial_arithmitics_gmtime_r(ldns_rdf2native_int32(rdf), time(NULL), &tm)
354238104Sdes	    && strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) {
355238104Sdes		ldns_buffer_printf(output, "%s", date_buf);
356238104Sdes	}
357238104Sdes	return ldns_buffer_status(output);
358238104Sdes}
359238104Sdes
360238104Sdesldns_status
361238104Sdesldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf)
362238104Sdes{
363238104Sdes	char str[INET_ADDRSTRLEN];
364238104Sdes
365238104Sdes	if (inet_ntop(AF_INET, ldns_rdf_data(rdf), str, INET_ADDRSTRLEN)) {
366238104Sdes		ldns_buffer_printf(output, "%s", str);
367238104Sdes	}
368238104Sdes	return ldns_buffer_status(output);
369238104Sdes}
370238104Sdes
371238104Sdesldns_status
372238104Sdesldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf)
373238104Sdes{
374238104Sdes	char str[INET6_ADDRSTRLEN];
375238104Sdes
376238104Sdes	if (inet_ntop(AF_INET6, ldns_rdf_data(rdf), str, INET6_ADDRSTRLEN)) {
377238104Sdes		ldns_buffer_printf(output, "%s", str);
378238104Sdes	}
379238104Sdes
380238104Sdes	return ldns_buffer_status(output);
381238104Sdes}
382238104Sdes
383238104Sdesldns_status
384238104Sdesldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf)
385238104Sdes{
386238104Sdes	const uint8_t *data = ldns_rdf_data(rdf);
387238104Sdes	uint8_t length = data[0];
388238104Sdes	size_t i;
389238104Sdes
390238104Sdes	ldns_buffer_printf(output, "\"");
391238104Sdes	for (i = 1; i <= length; ++i) {
392238104Sdes		char ch = (char) data[i];
393238104Sdes		if (isprint((int)ch) || ch=='\t') {
394238104Sdes			if (ch=='\"'||ch=='\\')
395238104Sdes				ldns_buffer_printf(output, "\\%c", ch);
396238104Sdes			else
397238104Sdes				ldns_buffer_printf(output, "%c", ch);
398238104Sdes		} else {
399238104Sdes			ldns_buffer_printf(output, "\\%03u",
400238104Sdes                                (unsigned)(uint8_t) ch);
401238104Sdes		}
402238104Sdes	}
403238104Sdes	ldns_buffer_printf(output, "\"");
404238104Sdes	return ldns_buffer_status(output);
405238104Sdes}
406238104Sdes
407238104Sdesldns_status
408238104Sdesldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf)
409238104Sdes{
410238104Sdes	size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf));
411238104Sdes	char *b64 = LDNS_XMALLOC(char, size);
412238104Sdes	if(!b64) return LDNS_STATUS_MEM_ERR;
413238104Sdes	if (ldns_b64_ntop(ldns_rdf_data(rdf), ldns_rdf_size(rdf), b64, size)) {
414238104Sdes		ldns_buffer_printf(output, "%s", b64);
415238104Sdes	}
416238104Sdes	LDNS_FREE(b64);
417238104Sdes	return ldns_buffer_status(output);
418238104Sdes}
419238104Sdes
420238104Sdesldns_status
421238104Sdesldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf)
422238104Sdes{
423238104Sdes	size_t size;
424238104Sdes	char *b32;
425238104Sdes	if(ldns_rdf_size(rdf) == 0)
426238104Sdes		return LDNS_STATUS_OK;
427238104Sdes        /* remove -1 for the b32-hash-len octet */
428238104Sdes	size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
429238104Sdes        /* add one for the end nul for the string */
430238104Sdes	b32 = LDNS_XMALLOC(char, size + 1);
431238104Sdes	if(!b32) return LDNS_STATUS_MEM_ERR;
432238104Sdes	size = (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
433238104Sdes		ldns_rdf_size(rdf) - 1, b32, size+1);
434238104Sdes	if (size > 0) {
435238104Sdes		ldns_buffer_printf(output, "%s", b32);
436238104Sdes	}
437238104Sdes	LDNS_FREE(b32);
438238104Sdes	return ldns_buffer_status(output);
439238104Sdes}
440238104Sdes
441238104Sdesldns_status
442238104Sdesldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf)
443238104Sdes{
444238104Sdes	size_t i;
445238104Sdes	for (i = 0; i < ldns_rdf_size(rdf); i++) {
446238104Sdes		ldns_buffer_printf(output, "%02x", ldns_rdf_data(rdf)[i]);
447238104Sdes	}
448238104Sdes
449238104Sdes	return ldns_buffer_status(output);
450238104Sdes}
451238104Sdes
452238104Sdesldns_status
453238104Sdesldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf)
454238104Sdes{
455238104Sdes        uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
456238104Sdes	const ldns_rr_descriptor *descriptor;
457238104Sdes
458238104Sdes	descriptor = ldns_rr_descript(data);
459238104Sdes	if (descriptor && descriptor->_name) {
460238104Sdes		ldns_buffer_printf(output, "%s", descriptor->_name);
461238104Sdes	} else {
462238104Sdes		ldns_buffer_printf(output, "TYPE%u", data);
463238104Sdes	}
464238104Sdes	return ldns_buffer_status(output);
465238104Sdes}
466238104Sdes
467238104Sdesldns_status
468238104Sdesldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf)
469238104Sdes{
470238104Sdes	uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
471238104Sdes	ldns_lookup_table *lt;
472238104Sdes
473238104Sdes 	lt = ldns_lookup_by_id(ldns_rr_classes, (int) data);
474238104Sdes	if (lt) {
475238104Sdes		ldns_buffer_printf(output, "\t%s", lt->name);
476238104Sdes	} else {
477238104Sdes		ldns_buffer_printf(output, "\tCLASS%d", data);
478238104Sdes	}
479238104Sdes	return ldns_buffer_status(output);
480238104Sdes}
481238104Sdes
482238104Sdesldns_status
483238104Sdesldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf)
484238104Sdes{
485238104Sdes        uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
486238104Sdes	ldns_lookup_table *lt;
487238104Sdes 	lt = ldns_lookup_by_id(ldns_cert_algorithms, (int) data);
488238104Sdes	if (lt) {
489238104Sdes		ldns_buffer_printf(output, "%s", lt->name);
490238104Sdes	} else {
491238104Sdes		ldns_buffer_printf(output, "%d", data);
492238104Sdes	}
493238104Sdes	return ldns_buffer_status(output);
494238104Sdes}
495238104Sdes
496238104Sdesldns_status
497238104Sdesldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf)
498238104Sdes{
499238104Sdes	/* don't use algorithm mnemonics in the presentation format
500238104Sdes	   this kind of got sneaked into the rfc's */
501238104Sdes        uint8_t data = ldns_rdf_data(rdf)[0];
502238104Sdes		ldns_buffer_printf(output, "%d", data);
503238104Sdes	return ldns_buffer_status(output);
504238104Sdes}
505238104Sdes
506238104Sdesstatic void
507238104Sdesloc_cm_print(ldns_buffer *output, uint8_t mantissa, uint8_t exponent)
508238104Sdes{
509238104Sdes	uint8_t i;
510238104Sdes	/* is it 0.<two digits> ? */
511238104Sdes	if(exponent < 2) {
512238104Sdes		if(exponent == 1)
513238104Sdes			mantissa *= 10;
514238104Sdes		ldns_buffer_printf(output, "0.%02ld", (long)mantissa);
515238104Sdes		return;
516238104Sdes	}
517238104Sdes	/* always <digit><string of zeros> */
518238104Sdes	ldns_buffer_printf(output, "%d", (int)mantissa);
519238104Sdes	for(i=0; i<exponent-2; i++)
520238104Sdes		ldns_buffer_printf(output, "0");
521238104Sdes}
522238104Sdes
523238104Sdesldns_status
524238104Sdesldns_rr_type2buffer_str(ldns_buffer *output, const ldns_rr_type type)
525238104Sdes{
526238104Sdes	const ldns_rr_descriptor *descriptor;
527238104Sdes
528238104Sdes	descriptor = ldns_rr_descript(type);
529238104Sdes
530238104Sdes	if (descriptor && descriptor->_name) {
531238104Sdes		ldns_buffer_printf(output, "%s", descriptor->_name);
532238104Sdes	} else {
533238104Sdes		/* exceptions for pseudotypes */
534238104Sdes		switch (type) {
535238104Sdes			case LDNS_RR_TYPE_IXFR:
536238104Sdes				ldns_buffer_printf(output, "IXFR");
537238104Sdes				break;
538238104Sdes			case LDNS_RR_TYPE_AXFR:
539238104Sdes				ldns_buffer_printf(output, "AXFR");
540238104Sdes				break;
541238104Sdes			case LDNS_RR_TYPE_MAILA:
542238104Sdes				ldns_buffer_printf(output, "MAILA");
543238104Sdes				break;
544238104Sdes			case LDNS_RR_TYPE_MAILB:
545238104Sdes				ldns_buffer_printf(output, "MAILB");
546238104Sdes				break;
547238104Sdes			case LDNS_RR_TYPE_ANY:
548238104Sdes				ldns_buffer_printf(output, "ANY");
549238104Sdes				break;
550238104Sdes			default:
551238104Sdes				ldns_buffer_printf(output, "TYPE%u", type);
552238104Sdes		}
553238104Sdes	}
554238104Sdes	return ldns_buffer_status(output);
555238104Sdes}
556238104Sdes
557238104Sdeschar *
558238104Sdesldns_rr_type2str(const ldns_rr_type type)
559238104Sdes{
560238104Sdes	char *str;
561238104Sdes	ldns_buffer *buf;
562238104Sdes
563238104Sdes	buf = ldns_buffer_new(10);
564238104Sdes	if (!buf) {
565238104Sdes		return NULL;
566238104Sdes	}
567238104Sdes
568238104Sdes	str = NULL;
569238104Sdes	if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) {
570238104Sdes		str = ldns_buffer2str(buf);
571238104Sdes	}
572238104Sdes
573238104Sdes	ldns_buffer_free(buf);
574238104Sdes	return str;
575238104Sdes}
576238104Sdes
577238104Sdes
578238104Sdesldns_status
579238104Sdesldns_rr_class2buffer_str(ldns_buffer *output,
580238104Sdes                         const ldns_rr_class klass)
581238104Sdes{
582238104Sdes	ldns_lookup_table *lt;
583238104Sdes
584238104Sdes	lt = ldns_lookup_by_id(ldns_rr_classes, klass);
585238104Sdes	if (lt) {
586238104Sdes		ldns_buffer_printf(output, "%s", lt->name);
587238104Sdes	} else {
588238104Sdes		ldns_buffer_printf(output, "CLASS%d", klass);
589238104Sdes	}
590238104Sdes	return ldns_buffer_status(output);
591238104Sdes}
592238104Sdes
593238104Sdeschar *
594238104Sdesldns_rr_class2str(const ldns_rr_class klass)
595238104Sdes{
596238104Sdes	ldns_buffer *buf;
597238104Sdes	char *str;
598238104Sdes
599238104Sdes	buf = ldns_buffer_new(10);
600238104Sdes	if (!buf) {
601238104Sdes		return NULL;
602238104Sdes	}
603238104Sdes
604238104Sdes	str = NULL;
605238104Sdes	if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) {
606238104Sdes		str = ldns_buffer2str(buf);
607238104Sdes	}
608238104Sdes	ldns_buffer_free(buf);
609238104Sdes	return str;
610238104Sdes}
611238104Sdes
612238104Sdesldns_status
613238104Sdesldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf)
614238104Sdes{
615238104Sdes	/* we could do checking (ie degrees < 90 etc)? */
616238104Sdes	uint8_t version = ldns_rdf_data(rdf)[0];
617238104Sdes	uint8_t size;
618238104Sdes	uint8_t horizontal_precision;
619238104Sdes	uint8_t vertical_precision;
620238104Sdes	uint32_t longitude;
621238104Sdes	uint32_t latitude;
622238104Sdes	uint32_t altitude;
623238104Sdes	char northerness;
624238104Sdes	char easterness;
625238104Sdes	uint32_t h;
626238104Sdes	uint32_t m;
627238104Sdes	double s;
628238104Sdes
629238104Sdes	uint32_t equator = (uint32_t) ldns_power(2, 31);
630238104Sdes
631238104Sdes	if (version == 0) {
632238104Sdes		size = ldns_rdf_data(rdf)[1];
633238104Sdes		horizontal_precision = ldns_rdf_data(rdf)[2];
634238104Sdes		vertical_precision = ldns_rdf_data(rdf)[3];
635238104Sdes
636238104Sdes		latitude = ldns_read_uint32(&ldns_rdf_data(rdf)[4]);
637238104Sdes		longitude = ldns_read_uint32(&ldns_rdf_data(rdf)[8]);
638238104Sdes		altitude = ldns_read_uint32(&ldns_rdf_data(rdf)[12]);
639238104Sdes
640238104Sdes		if (latitude > equator) {
641238104Sdes			northerness = 'N';
642238104Sdes			latitude = latitude - equator;
643238104Sdes		} else {
644238104Sdes			northerness = 'S';
645238104Sdes			latitude = equator - latitude;
646238104Sdes		}
647238104Sdes		h = latitude / (1000 * 60 * 60);
648238104Sdes		latitude = latitude % (1000 * 60 * 60);
649238104Sdes		m = latitude / (1000 * 60);
650238104Sdes		latitude = latitude % (1000 * 60);
651238104Sdes		s = (double) latitude / 1000.0;
652238104Sdes		ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
653238104Sdes			h, m, s, northerness);
654238104Sdes
655238104Sdes		if (longitude > equator) {
656238104Sdes			easterness = 'E';
657238104Sdes			longitude = longitude - equator;
658238104Sdes		} else {
659238104Sdes			easterness = 'W';
660238104Sdes			longitude = equator - longitude;
661238104Sdes		}
662238104Sdes		h = longitude / (1000 * 60 * 60);
663238104Sdes		longitude = longitude % (1000 * 60 * 60);
664238104Sdes		m = longitude / (1000 * 60);
665238104Sdes		longitude = longitude % (1000 * 60);
666238104Sdes		s = (double) longitude / (1000.0);
667238104Sdes		ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
668238104Sdes			h, m, s, easterness);
669238104Sdes
670238104Sdes
671238104Sdes        s = ((double) altitude) / 100;
672238104Sdes        s -= 100000;
673238104Sdes
674238104Sdes		if(altitude%100 != 0)
675238104Sdes			ldns_buffer_printf(output, "%.2f", s);
676238104Sdes        else
677238104Sdes			ldns_buffer_printf(output, "%.0f", s);
678238104Sdes
679238104Sdes		ldns_buffer_printf(output, "m ");
680238104Sdes
681238104Sdes		loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f);
682238104Sdes		ldns_buffer_printf(output, "m ");
683238104Sdes
684238104Sdes		loc_cm_print(output, (horizontal_precision & 0xf0) >> 4,
685238104Sdes			horizontal_precision & 0x0f);
686238104Sdes		ldns_buffer_printf(output, "m ");
687238104Sdes
688238104Sdes		loc_cm_print(output, (vertical_precision & 0xf0) >> 4,
689238104Sdes			vertical_precision & 0x0f);
690238104Sdes		ldns_buffer_printf(output, "m");
691238104Sdes
692238104Sdes		return ldns_buffer_status(output);
693238104Sdes	} else {
694238104Sdes		return ldns_rdf2buffer_str_hex(output, rdf);
695238104Sdes	}
696238104Sdes}
697238104Sdes
698238104Sdesldns_status
699238104Sdesldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf)
700238104Sdes{
701238104Sdes	ldns_buffer_printf(output, "\\# %u ", ldns_rdf_size(rdf));
702238104Sdes	return ldns_rdf2buffer_str_hex(output, rdf);
703238104Sdes}
704238104Sdes
705238104Sdesldns_status
706238104Sdesldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf)
707238104Sdes{
708238104Sdes	ldns_buffer_printf(output, "0x");
709238104Sdes	return ldns_rdf2buffer_str_hex(output, rdf);
710238104Sdes}
711238104Sdes
712238104Sdesldns_status
713238104Sdesldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf)
714238104Sdes{
715238104Sdes	return ldns_rdf2buffer_str_hex(output, rdf);
716238104Sdes}
717238104Sdes
718238104Sdesldns_status
719238104Sdesldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf)
720238104Sdes{
721238104Sdes	/* protocol, followed by bitmap of services */
722238104Sdes	struct protoent *protocol;
723238104Sdes	char *proto_name = NULL;
724238104Sdes	uint8_t protocol_nr;
725238104Sdes	struct servent *service;
726238104Sdes	uint16_t current_service;
727238104Sdes
728238104Sdes	protocol_nr = ldns_rdf_data(rdf)[0];
729238104Sdes	protocol = getprotobynumber((int) protocol_nr);
730238104Sdes	if (protocol && (protocol->p_name != NULL)) {
731238104Sdes		proto_name = protocol->p_name;
732238104Sdes		ldns_buffer_printf(output, "%s ", protocol->p_name);
733238104Sdes	} else {
734238104Sdes		ldns_buffer_printf(output, "%u ", protocol_nr);
735238104Sdes	}
736238104Sdes
737238104Sdes#ifdef HAVE_ENDPROTOENT
738238104Sdes	endprotoent();
739238104Sdes#endif
740238104Sdes
741238104Sdes	for (current_service = 0;
742238104Sdes	     current_service < ldns_rdf_size(rdf) * 7; current_service++) {
743238104Sdes		if (ldns_get_bit(&(ldns_rdf_data(rdf)[1]), current_service)) {
744238104Sdes			service = getservbyport((int) htons(current_service),
745238104Sdes			                        proto_name);
746238104Sdes			if (service && service->s_name) {
747238104Sdes				ldns_buffer_printf(output, "%s ", service->s_name);
748238104Sdes			} else {
749238104Sdes				ldns_buffer_printf(output, "%u ", current_service);
750238104Sdes			}
751238104Sdes#ifdef HAVE_ENDSERVENT
752238104Sdes			endservent();
753238104Sdes#endif
754238104Sdes		}
755238104Sdes	}
756238104Sdes	return ldns_buffer_status(output);
757238104Sdes}
758238104Sdes
759238104Sdesldns_status
760238104Sdesldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf)
761238104Sdes{
762238104Sdes	/* Note: this code is duplicated in higher.c in
763238104Sdes	 * ldns_nsec_type_check() function
764238104Sdes	 */
765238104Sdes	uint8_t window_block_nr;
766238104Sdes	uint8_t bitmap_length;
767238104Sdes	uint16_t type;
768238104Sdes	uint16_t pos = 0;
769238104Sdes	uint16_t bit_pos;
770238104Sdes	uint8_t *data = ldns_rdf_data(rdf);
771238104Sdes	const ldns_rr_descriptor *descriptor;
772238104Sdes
773238104Sdes	while(pos < ldns_rdf_size(rdf)) {
774238104Sdes		window_block_nr = data[pos];
775238104Sdes		bitmap_length = data[pos + 1];
776238104Sdes		pos += 2;
777238104Sdes
778238104Sdes		for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) {
779238104Sdes			if (ldns_get_bit(&data[pos], bit_pos)) {
780238104Sdes				type = 256 * (uint16_t) window_block_nr + bit_pos;
781238104Sdes				descriptor = ldns_rr_descript(type);
782238104Sdes
783238104Sdes				if (descriptor && descriptor->_name) {
784238104Sdes					ldns_buffer_printf(output, "%s ",
785238104Sdes							descriptor->_name);
786238104Sdes				} else {
787238104Sdes					ldns_buffer_printf(output, "TYPE%u ", type);
788238104Sdes				}
789238104Sdes			}
790238104Sdes		}
791238104Sdes
792238104Sdes		pos += (uint16_t) bitmap_length;
793238104Sdes	}
794238104Sdes
795238104Sdes	return ldns_buffer_status(output);
796238104Sdes}
797238104Sdes
798238104Sdesldns_status
799238104Sdesldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf)
800238104Sdes{
801238104Sdes	uint8_t salt_length;
802238104Sdes	uint8_t salt_pos;
803238104Sdes
804238104Sdes	uint8_t *data = ldns_rdf_data(rdf);
805238104Sdes
806238104Sdes        if(ldns_rdf_size(rdf) == 0) {
807238104Sdes                output->_status = LDNS_STATUS_ERR;
808238104Sdes	        return ldns_buffer_status(output);
809238104Sdes        }
810238104Sdes	salt_length = data[0];
811238104Sdes	/* from now there are variable length entries so remember pos */
812238104Sdes	if (salt_length == 0 || ((size_t)salt_length)+1 > ldns_rdf_size(rdf)) {
813238104Sdes		ldns_buffer_printf(output, "- ");
814238104Sdes	} else {
815238104Sdes		for (salt_pos = 0; salt_pos < salt_length; salt_pos++) {
816238104Sdes			ldns_buffer_printf(output, "%02x", data[1 + salt_pos]);
817238104Sdes		}
818238104Sdes		ldns_buffer_printf(output, " ");
819238104Sdes	}
820238104Sdes
821238104Sdes	return ldns_buffer_status(output);
822238104Sdes}
823238104Sdes
824238104Sdesldns_status
825238104Sdesldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf)
826238104Sdes{
827238104Sdes	/* period is the number of seconds */
828238104Sdes	uint32_t p = ldns_read_uint32(ldns_rdf_data(rdf));
829238104Sdes	ldns_buffer_printf(output, "%u", p);
830238104Sdes	return ldns_buffer_status(output);
831238104Sdes}
832238104Sdes
833238104Sdesldns_status
834238104Sdesldns_rdf2buffer_str_tsigtime(ldns_buffer *output,const  ldns_rdf *rdf)
835238104Sdes{
836238104Sdes	/* tsigtime is 48 bits network order unsigned integer */
837238104Sdes	uint64_t tsigtime = 0;
838238104Sdes	uint8_t *data = ldns_rdf_data(rdf);
839238104Sdes
840238104Sdes	if (ldns_rdf_size(rdf) != 6) {
841238104Sdes		return LDNS_STATUS_ERR;
842238104Sdes	}
843238104Sdes
844238104Sdes	tsigtime = ldns_read_uint16(data);
845238104Sdes	tsigtime *= 65536;
846238104Sdes	tsigtime += ldns_read_uint16(data+2);
847238104Sdes	tsigtime *= 65536;
848238104Sdes
849238104Sdes	ldns_buffer_printf(output, "%llu ", tsigtime);
850238104Sdes
851238104Sdes	return ldns_buffer_status(output);
852238104Sdes}
853238104Sdes
854238104Sdesldns_status
855238104Sdesldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf)
856238104Sdes{
857238104Sdes	uint8_t *data = ldns_rdf_data(rdf);
858238104Sdes	uint16_t address_family;
859238104Sdes	uint8_t prefix;
860238104Sdes	bool negation;
861238104Sdes	uint8_t adf_length;
862238104Sdes	size_t i;
863238104Sdes	size_t pos = 0;
864238104Sdes
865238104Sdes	while (pos < (unsigned int) ldns_rdf_size(rdf)) {
866238104Sdes                if(pos + 3 >= (unsigned)ldns_rdf_size(rdf))
867238104Sdes                        return LDNS_STATUS_SYNTAX_RDATA_ERR;
868238104Sdes		address_family = ldns_read_uint16(&data[pos]);
869238104Sdes		prefix = data[pos + 2];
870238104Sdes		negation = data[pos + 3] & LDNS_APL_NEGATION;
871238104Sdes		adf_length = data[pos + 3] & LDNS_APL_MASK;
872238104Sdes		if (address_family == LDNS_APL_IP4) {
873238104Sdes			/* check if prefix < 32? */
874238104Sdes			if (negation) {
875238104Sdes				ldns_buffer_printf(output, "!");
876238104Sdes			}
877238104Sdes			ldns_buffer_printf(output, "%u:", address_family);
878238104Sdes			/* address is variable length 0 - 4 */
879238104Sdes			for (i = 0; i < 4; i++) {
880238104Sdes				if (i > 0) {
881238104Sdes					ldns_buffer_printf(output, ".");
882238104Sdes				}
883238104Sdes				if (i < (unsigned short) adf_length) {
884238104Sdes                                        if(pos+i+4 >= ldns_rdf_size(rdf))
885238104Sdes                                                return LDNS_STATUS_SYNTAX_RDATA_ERR;
886238104Sdes					ldns_buffer_printf(output, "%d",
887238104Sdes					                   data[pos + i + 4]);
888238104Sdes				} else {
889238104Sdes					ldns_buffer_printf(output, "0");
890238104Sdes				}
891238104Sdes			}
892238104Sdes			ldns_buffer_printf(output, "/%u ", prefix);
893238104Sdes		} else if (address_family == LDNS_APL_IP6) {
894238104Sdes			/* check if prefix < 128? */
895238104Sdes			if (negation) {
896238104Sdes				ldns_buffer_printf(output, "!");
897238104Sdes			}
898238104Sdes			ldns_buffer_printf(output, "%u:", address_family);
899238104Sdes			/* address is variable length 0 - 16 */
900238104Sdes			for (i = 0; i < 16; i++) {
901238104Sdes				if (i % 2 == 0 && i > 0) {
902238104Sdes					ldns_buffer_printf(output, ":");
903238104Sdes				}
904238104Sdes				if (i < (unsigned short) adf_length) {
905238104Sdes                                        if(pos+i+4 >= ldns_rdf_size(rdf))
906238104Sdes                                                return LDNS_STATUS_SYNTAX_RDATA_ERR;
907238104Sdes					ldns_buffer_printf(output, "%02x",
908238104Sdes					                   data[pos + i + 4]);
909238104Sdes				} else {
910238104Sdes					ldns_buffer_printf(output, "00");
911238104Sdes				}
912238104Sdes			}
913238104Sdes			ldns_buffer_printf(output, "/%u ", prefix);
914238104Sdes
915238104Sdes		} else {
916238104Sdes			/* unknown address family */
917238104Sdes			ldns_buffer_printf(output, "Unknown address family: %u data: ",
918238104Sdes					address_family);
919238104Sdes			for (i = 1; i < (unsigned short) (4 + adf_length); i++) {
920238104Sdes                                if(pos+i >= ldns_rdf_size(rdf))
921238104Sdes                                        return LDNS_STATUS_SYNTAX_RDATA_ERR;
922238104Sdes				ldns_buffer_printf(output, "%02x", data[i]);
923238104Sdes			}
924238104Sdes		}
925238104Sdes		pos += 4 + adf_length;
926238104Sdes	}
927238104Sdes	return ldns_buffer_status(output);
928238104Sdes}
929238104Sdes
930238104Sdesldns_status
931238104Sdesldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf)
932238104Sdes{
933238104Sdes	/* Subtract the size (2) of the number that specifies the length */
934238104Sdes	size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf) - 2);
935238104Sdes	char *b64 = LDNS_XMALLOC(char, size);
936238104Sdes        if(!b64)
937238104Sdes                return LDNS_STATUS_MEM_ERR;
938238104Sdes
939238104Sdes	ldns_buffer_printf(output, "%u ", ldns_rdf_size(rdf) - 2);
940238104Sdes
941238104Sdes	if (ldns_rdf_size(rdf) > 2 &&
942238104Sdes	    ldns_b64_ntop(ldns_rdf_data(rdf) + 2,
943238104Sdes				   ldns_rdf_size(rdf) - 2,
944238104Sdes				   b64, size)) {
945238104Sdes		ldns_buffer_printf(output, "%s", b64);
946238104Sdes	}
947238104Sdes	LDNS_FREE(b64);
948238104Sdes	return ldns_buffer_status(output);
949238104Sdes}
950238104Sdes
951238104Sdesldns_status
952238104Sdesldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf)
953238104Sdes{
954238104Sdes	/* wire format from
955238104Sdes	   http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt
956238104Sdes	*/
957238104Sdes	uint8_t *data = ldns_rdf_data(rdf);
958238104Sdes	uint8_t precedence;
959238104Sdes	uint8_t gateway_type;
960238104Sdes	uint8_t algorithm;
961238104Sdes
962238104Sdes	ldns_rdf *gateway = NULL;
963238104Sdes	uint8_t *gateway_data;
964238104Sdes
965238104Sdes	size_t public_key_size;
966238104Sdes	uint8_t *public_key_data;
967238104Sdes	ldns_rdf *public_key;
968238104Sdes
969238104Sdes	size_t offset = 0;
970238104Sdes	ldns_status status;
971238104Sdes
972238104Sdes	precedence = data[0];
973238104Sdes	gateway_type = data[1];
974238104Sdes	algorithm = data[2];
975238104Sdes	offset = 3;
976238104Sdes
977238104Sdes	switch (gateway_type) {
978238104Sdes		case 0:
979238104Sdes			/* no gateway */
980238104Sdes			break;
981238104Sdes		case 1:
982238104Sdes			gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN);
983238104Sdes                        if(!gateway_data)
984238104Sdes                                return LDNS_STATUS_MEM_ERR;
985238104Sdes			memcpy(gateway_data, &data[offset], LDNS_IP4ADDRLEN);
986238104Sdes			gateway = ldns_rdf_new(LDNS_RDF_TYPE_A, LDNS_IP4ADDRLEN , gateway_data);
987238104Sdes			offset += LDNS_IP4ADDRLEN;
988238104Sdes                        if(!gateway) {
989238104Sdes                                LDNS_FREE(gateway_data);
990238104Sdes                                return LDNS_STATUS_MEM_ERR;
991238104Sdes                        }
992238104Sdes			break;
993238104Sdes		case 2:
994238104Sdes			gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN);
995238104Sdes                        if(!gateway_data)
996238104Sdes                                return LDNS_STATUS_MEM_ERR;
997238104Sdes			memcpy(gateway_data, &data[offset], LDNS_IP6ADDRLEN);
998238104Sdes			offset += LDNS_IP6ADDRLEN;
999238104Sdes			gateway =
1000238104Sdes				ldns_rdf_new(LDNS_RDF_TYPE_AAAA, LDNS_IP6ADDRLEN, gateway_data);
1001238104Sdes                        if(!gateway) {
1002238104Sdes                                LDNS_FREE(gateway_data);
1003238104Sdes                                return LDNS_STATUS_MEM_ERR;
1004238104Sdes                        }
1005238104Sdes			break;
1006238104Sdes		case 3:
1007238104Sdes			status = ldns_wire2dname(&gateway, data, ldns_rdf_size(rdf), &offset);
1008238104Sdes                        if(status != LDNS_STATUS_OK)
1009238104Sdes                                return status;
1010238104Sdes			break;
1011238104Sdes		default:
1012238104Sdes			/* error? */
1013238104Sdes			break;
1014238104Sdes	}
1015238104Sdes
1016238104Sdes	public_key_size = ldns_rdf_size(rdf) - offset;
1017238104Sdes	public_key_data = LDNS_XMALLOC(uint8_t, public_key_size);
1018238104Sdes        if(!public_key_data) {
1019238104Sdes                ldns_rdf_free(gateway);
1020238104Sdes                return LDNS_STATUS_MEM_ERR;
1021238104Sdes        }
1022238104Sdes	memcpy(public_key_data, &data[offset], public_key_size);
1023238104Sdes	public_key = ldns_rdf_new(LDNS_RDF_TYPE_B64, public_key_size, public_key_data);
1024238104Sdes        if(!public_key) {
1025238104Sdes                LDNS_FREE(public_key_data);
1026238104Sdes                ldns_rdf_free(gateway);
1027238104Sdes                return LDNS_STATUS_MEM_ERR;
1028238104Sdes        }
1029238104Sdes
1030238104Sdes	ldns_buffer_printf(output, "%u %u %u ", precedence, gateway_type, algorithm);
1031238104Sdes    if (gateway)
1032238104Sdes	  	(void) ldns_rdf2buffer_str(output, gateway);
1033238104Sdes	else
1034238104Sdes		ldns_buffer_printf(output, ".");
1035238104Sdes	ldns_buffer_printf(output, " ");
1036238104Sdes	(void) ldns_rdf2buffer_str(output, public_key);
1037238104Sdes
1038238104Sdes	ldns_rdf_free(gateway);
1039238104Sdes	ldns_rdf_free(public_key);
1040238104Sdes
1041238104Sdes	return ldns_buffer_status(output);
1042238104Sdes}
1043238104Sdes
1044238104Sdesldns_status
1045238104Sdesldns_rdf2buffer_str_tsig(ldns_buffer *output, const ldns_rdf *rdf)
1046238104Sdes{
1047238104Sdes	/* TSIG RRs have no presentation format, make them #size <data> */
1048238104Sdes	return ldns_rdf2buffer_str_unknown(output, rdf);
1049238104Sdes}
1050238104Sdes
1051238104Sdes
1052238104Sdesldns_status
1053238104Sdesldns_rdf2buffer_str(ldns_buffer *buffer, const ldns_rdf *rdf)
1054238104Sdes{
1055238104Sdes	ldns_status res = LDNS_STATUS_OK;
1056238104Sdes
1057238104Sdes	/*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/
1058238104Sdes	if (rdf) {
1059238104Sdes		switch(ldns_rdf_get_type(rdf)) {
1060238104Sdes		case LDNS_RDF_TYPE_NONE:
1061238104Sdes			break;
1062238104Sdes		case LDNS_RDF_TYPE_DNAME:
1063238104Sdes			res = ldns_rdf2buffer_str_dname(buffer, rdf);
1064238104Sdes			break;
1065238104Sdes		case LDNS_RDF_TYPE_INT8:
1066238104Sdes			res = ldns_rdf2buffer_str_int8(buffer, rdf);
1067238104Sdes			break;
1068238104Sdes		case LDNS_RDF_TYPE_INT16:
1069238104Sdes			res = ldns_rdf2buffer_str_int16(buffer, rdf);
1070238104Sdes			break;
1071238104Sdes		case LDNS_RDF_TYPE_INT32:
1072238104Sdes			res = ldns_rdf2buffer_str_int32(buffer, rdf);
1073238104Sdes			break;
1074238104Sdes		case LDNS_RDF_TYPE_PERIOD:
1075238104Sdes			res = ldns_rdf2buffer_str_period(buffer, rdf);
1076238104Sdes			break;
1077238104Sdes		case LDNS_RDF_TYPE_TSIGTIME:
1078238104Sdes			res = ldns_rdf2buffer_str_tsigtime(buffer, rdf);
1079238104Sdes			break;
1080238104Sdes		case LDNS_RDF_TYPE_A:
1081238104Sdes			res = ldns_rdf2buffer_str_a(buffer, rdf);
1082238104Sdes			break;
1083238104Sdes		case LDNS_RDF_TYPE_AAAA:
1084238104Sdes			res = ldns_rdf2buffer_str_aaaa(buffer, rdf);
1085238104Sdes			break;
1086238104Sdes		case LDNS_RDF_TYPE_STR:
1087238104Sdes			res = ldns_rdf2buffer_str_str(buffer, rdf);
1088238104Sdes			break;
1089238104Sdes		case LDNS_RDF_TYPE_APL:
1090238104Sdes			res = ldns_rdf2buffer_str_apl(buffer, rdf);
1091238104Sdes			break;
1092238104Sdes		case LDNS_RDF_TYPE_B32_EXT:
1093238104Sdes			res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1094238104Sdes			break;
1095238104Sdes		case LDNS_RDF_TYPE_B64:
1096238104Sdes			res = ldns_rdf2buffer_str_b64(buffer, rdf);
1097238104Sdes			break;
1098238104Sdes		case LDNS_RDF_TYPE_HEX:
1099238104Sdes			res = ldns_rdf2buffer_str_hex(buffer, rdf);
1100238104Sdes			break;
1101238104Sdes		case LDNS_RDF_TYPE_NSEC:
1102238104Sdes			res = ldns_rdf2buffer_str_nsec(buffer, rdf);
1103238104Sdes			break;
1104238104Sdes		case LDNS_RDF_TYPE_NSEC3_SALT:
1105238104Sdes			res = ldns_rdf2buffer_str_nsec3_salt(buffer, rdf);
1106238104Sdes			break;
1107238104Sdes		case LDNS_RDF_TYPE_TYPE:
1108238104Sdes			res = ldns_rdf2buffer_str_type(buffer, rdf);
1109238104Sdes			break;
1110238104Sdes		case LDNS_RDF_TYPE_CLASS:
1111238104Sdes			res = ldns_rdf2buffer_str_class(buffer, rdf);
1112238104Sdes			break;
1113238104Sdes		case LDNS_RDF_TYPE_CERT_ALG:
1114238104Sdes			res = ldns_rdf2buffer_str_cert_alg(buffer, rdf);
1115238104Sdes			break;
1116238104Sdes		case LDNS_RDF_TYPE_ALG:
1117238104Sdes			res = ldns_rdf2buffer_str_alg(buffer, rdf);
1118238104Sdes			break;
1119238104Sdes		case LDNS_RDF_TYPE_UNKNOWN:
1120238104Sdes			res = ldns_rdf2buffer_str_unknown(buffer, rdf);
1121238104Sdes			break;
1122238104Sdes		case LDNS_RDF_TYPE_TIME:
1123238104Sdes			res = ldns_rdf2buffer_str_time(buffer, rdf);
1124238104Sdes			break;
1125238104Sdes		case LDNS_RDF_TYPE_LOC:
1126238104Sdes			res = ldns_rdf2buffer_str_loc(buffer, rdf);
1127238104Sdes			break;
1128238104Sdes		case LDNS_RDF_TYPE_WKS:
1129238104Sdes		case LDNS_RDF_TYPE_SERVICE:
1130238104Sdes			res = ldns_rdf2buffer_str_wks(buffer, rdf);
1131238104Sdes			break;
1132238104Sdes		case LDNS_RDF_TYPE_NSAP:
1133238104Sdes			res = ldns_rdf2buffer_str_nsap(buffer, rdf);
1134238104Sdes			break;
1135238104Sdes		case LDNS_RDF_TYPE_ATMA:
1136238104Sdes			res = ldns_rdf2buffer_str_atma(buffer, rdf);
1137238104Sdes			break;
1138238104Sdes		case LDNS_RDF_TYPE_IPSECKEY:
1139238104Sdes			res = ldns_rdf2buffer_str_ipseckey(buffer, rdf);
1140238104Sdes			break;
1141238104Sdes		case LDNS_RDF_TYPE_TSIG:
1142238104Sdes			res = ldns_rdf2buffer_str_tsig(buffer, rdf);
1143238104Sdes			break;
1144238104Sdes		case LDNS_RDF_TYPE_INT16_DATA:
1145238104Sdes			res = ldns_rdf2buffer_str_int16_data(buffer, rdf);
1146238104Sdes			break;
1147238104Sdes		case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER:
1148238104Sdes			res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1149238104Sdes			break;
1150238104Sdes		}
1151238104Sdes	} else {
1152238104Sdes		ldns_buffer_printf(buffer, "(null) ");
1153238104Sdes	        res = ldns_buffer_status(buffer);
1154238104Sdes	}
1155238104Sdes	return res;
1156238104Sdes}
1157238104Sdes
1158246827Sdesstatic ldns_rdf *
1159238104Sdesldns_b32_ext2dname(const ldns_rdf *rdf)
1160238104Sdes{
1161238104Sdes	size_t size;
1162238104Sdes	char *b32;
1163238104Sdes	ldns_rdf *out;
1164238104Sdes	if(ldns_rdf_size(rdf) == 0)
1165238104Sdes		return NULL;
1166238104Sdes        /* remove -1 for the b32-hash-len octet */
1167238104Sdes	size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
1168238104Sdes        /* add one for the end nul for the string */
1169238104Sdes	b32 = LDNS_XMALLOC(char, size + 2);
1170238104Sdes	if (b32) {
1171238104Sdes		if (ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
1172238104Sdes				ldns_rdf_size(rdf) - 1, b32, size+1) > 0) {
1173238104Sdes			b32[size] = '.';
1174238104Sdes			b32[size+1] = '\0';
1175238104Sdes			if (ldns_str2rdf_dname(&out, b32) == LDNS_STATUS_OK) {
1176238104Sdes				LDNS_FREE(b32);
1177238104Sdes				return out;
1178238104Sdes			}
1179238104Sdes		}
1180238104Sdes		LDNS_FREE(b32);
1181238104Sdes	}
1182238104Sdes	return NULL;
1183238104Sdes}
1184238104Sdes
1185238104Sdesldns_status
1186238104Sdesldns_rr2buffer_str_fmt(ldns_buffer *output,
1187238104Sdes		const ldns_output_format *fmt, const ldns_rr *rr)
1188238104Sdes{
1189238104Sdes	uint16_t i, flags;
1190238104Sdes	ldns_status status = LDNS_STATUS_OK;
1191238104Sdes
1192238104Sdes	if (fmt == NULL) {
1193238104Sdes		fmt = ldns_output_format_default;
1194238104Sdes	}
1195238104Sdes	if (!rr) {
1196238104Sdes		if (LDNS_COMMENT_NULLS & fmt->flags) {
1197238104Sdes			ldns_buffer_printf(output, "; (null)\n");
1198238104Sdes		}
1199238104Sdes		return ldns_buffer_status(output);
1200238104Sdes	}
1201238104Sdes	if (ldns_rr_owner(rr)) {
1202238104Sdes		status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr));
1203238104Sdes	}
1204238104Sdes	if (status != LDNS_STATUS_OK) {
1205238104Sdes		return status;
1206238104Sdes	}
1207238104Sdes
1208238104Sdes	/* TTL should NOT be printed if it is a question */
1209238104Sdes	if (!ldns_rr_is_question(rr)) {
1210238104Sdes		ldns_buffer_printf(output, "\t%d", ldns_rr_ttl(rr));
1211238104Sdes	}
1212238104Sdes
1213238104Sdes	ldns_buffer_printf(output, "\t");
1214238104Sdes	status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr));
1215238104Sdes	if (status != LDNS_STATUS_OK) {
1216238104Sdes		return status;
1217238104Sdes	}
1218238104Sdes	ldns_buffer_printf(output, "\t");
1219238104Sdes
1220238104Sdes	status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr));
1221238104Sdes	if (status != LDNS_STATUS_OK) {
1222238104Sdes		return status;
1223238104Sdes	}
1224238104Sdes
1225238104Sdes	if (ldns_rr_rd_count(rr) > 0) {
1226238104Sdes		ldns_buffer_printf(output, "\t");
1227238104Sdes	} else if (!ldns_rr_is_question(rr)) {
1228238104Sdes		ldns_buffer_printf(output, "\t\\# 0");
1229238104Sdes	}
1230238104Sdes
1231238104Sdes	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
1232238104Sdes		/* ldns_rdf2buffer_str handles NULL input fine! */
1233238104Sdes		status = ldns_rdf2buffer_str(output, ldns_rr_rdf(rr, i));
1234238104Sdes		if(status != LDNS_STATUS_OK)
1235238104Sdes			return status;
1236238104Sdes		if (i < ldns_rr_rd_count(rr) - 1) {
1237238104Sdes			ldns_buffer_printf(output, " ");
1238238104Sdes		}
1239238104Sdes	}
1240238104Sdes	/* per RR special comments - handy for DNSSEC types */
1241238104Sdes	/* check to prevent question sec. rr from
1242238104Sdes	 * getting here */
1243238104Sdes	if (ldns_rr_rd_count(rr) > 0) {
1244238104Sdes		switch (ldns_rr_get_type(rr)) {
1245238104Sdes			case LDNS_RR_TYPE_DNSKEY:
1246238104Sdes				/* if ldns_rr_rd_count(rr) > 0
1247238104Sdes				   then ldns_rr_rdf(rr, 0) exists! */
1248238104Sdes				if (! (fmt->flags & LDNS_COMMENT_KEY)) {
1249238104Sdes					break;
1250238104Sdes				}
1251238104Sdes				flags = ldns_rdf2native_int16(
1252238104Sdes						ldns_rr_rdf(rr, 0));
1253238104Sdes				ldns_buffer_printf(output, " ;{");
1254238104Sdes				if (fmt->flags & LDNS_COMMENT_KEY_ID) {
1255238104Sdes					ldns_buffer_printf(output, "id = %u",
1256238104Sdes							(unsigned int)
1257238104Sdes							ldns_calc_keytag(rr));
1258238104Sdes				}
1259238104Sdes				if ((fmt->flags & LDNS_COMMENT_KEY_TYPE)
1260238104Sdes						&& (flags & LDNS_KEY_ZONE_KEY)){
1261238104Sdes					if (flags & LDNS_KEY_SEP_KEY) {
1262238104Sdes						ldns_buffer_printf(
1263238104Sdes							output, " (ksk)");
1264238104Sdes					}
1265238104Sdes					else {
1266238104Sdes						ldns_buffer_printf(
1267238104Sdes							output, " (zsk)");
1268238104Sdes					}
1269238104Sdes					if (fmt->flags & LDNS_COMMENT_KEY_SIZE){
1270238104Sdes						ldns_buffer_printf(
1271238104Sdes							output, ", ");
1272238104Sdes					}
1273238104Sdes				} else if (fmt->flags
1274238104Sdes						& (LDNS_COMMENT_KEY_ID
1275238104Sdes						  |LDNS_COMMENT_KEY_SIZE)) {
1276238104Sdes					ldns_buffer_printf( output, ", ");
1277238104Sdes				}
1278238104Sdes				if (fmt->flags & LDNS_COMMENT_KEY_SIZE) {
1279238104Sdes					ldns_buffer_printf(output, "size = %db",
1280238104Sdes						ldns_rr_dnskey_key_size(rr));
1281238104Sdes				}
1282238104Sdes				ldns_buffer_printf(output, "}");
1283238104Sdes				break;
1284238104Sdes			case LDNS_RR_TYPE_RRSIG:
1285238104Sdes				if ((fmt->flags & LDNS_COMMENT_KEY)
1286238104Sdes						&& (fmt->flags
1287238104Sdes							& LDNS_COMMENT_RRSIGS)
1288238104Sdes						&& ldns_rr_rdf(rr, 6) != NULL) {
1289238104Sdes					ldns_buffer_printf(output
1290238104Sdes						, " ;{id = %d}"
1291238104Sdes						, ldns_rdf2native_int16(
1292238104Sdes							ldns_rr_rdf(rr, 6)));
1293238104Sdes				}
1294238104Sdes				break;
1295238104Sdes			case LDNS_RR_TYPE_DS:
1296238104Sdes				if ((fmt->flags & LDNS_COMMENT_BUBBLEBABBLE)
1297238104Sdes						&& ldns_rr_rdf(rr, 3) != NULL) {
1298238104Sdes					uint8_t *data = ldns_rdf_data(
1299238104Sdes							ldns_rr_rdf(rr, 3));
1300238104Sdes					size_t len = ldns_rdf_size(
1301238104Sdes							ldns_rr_rdf(rr, 3));
1302238104Sdes					char *babble = ldns_bubblebabble(
1303238104Sdes							data, len);
1304238104Sdes					if(babble) {
1305238104Sdes						ldns_buffer_printf(output
1306238104Sdes							, " ;{%s}", babble);
1307238104Sdes					}
1308238104Sdes					LDNS_FREE(babble);
1309238104Sdes				}
1310238104Sdes				break;
1311238104Sdes			case LDNS_RR_TYPE_NSEC3:
1312238104Sdes				if (! (fmt->flags & LDNS_COMMENT_FLAGS) &&
1313238104Sdes				    ! (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN)) {
1314238104Sdes					break;
1315238104Sdes				}
1316238104Sdes				ldns_buffer_printf(output, " ;{");
1317238104Sdes				if ((fmt->flags & LDNS_COMMENT_FLAGS)) {
1318238104Sdes					if (ldns_nsec3_optout(rr)) {
1319238104Sdes						ldns_buffer_printf(output,
1320238104Sdes							" flags: optout");
1321238104Sdes					} else {
1322238104Sdes						ldns_buffer_printf(output,
1323238104Sdes							" flags: -");
1324238104Sdes					}
1325238104Sdes					if (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN
1326238104Sdes							&& fmt->data != NULL) {
1327238104Sdes						ldns_buffer_printf(output, ", ");
1328238104Sdes					}
1329238104Sdes				}
1330238104Sdes				if (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN
1331238104Sdes						&& fmt->data != NULL) {
1332238104Sdes					ldns_rbnode_t *node;
1333238104Sdes					ldns_rdf *key = ldns_dname_label(
1334238104Sdes							ldns_rr_owner(rr), 0);
1335238104Sdes					if (key) {
1336238104Sdes				       		node = ldns_rbtree_search(
1337238104Sdes							(ldns_rbtree_t *)
1338238104Sdes								fmt->data,
1339238104Sdes							(void *) key);
1340238104Sdes						if (node->data) {
1341238104Sdes							ldns_buffer_printf(
1342238104Sdes								output,
1343238104Sdes							       	"from: ");
1344238104Sdes							(void)
1345238104Sdes							ldns_rdf2buffer_str(
1346238104Sdes								output,
1347238104Sdes								(ldns_rdf *)
1348238104Sdes								node->data);
1349238104Sdes						}
1350238104Sdes						ldns_rdf_free(key);
1351238104Sdes					}
1352238104Sdes					key = ldns_b32_ext2dname(
1353238104Sdes						ldns_nsec3_next_owner(rr));
1354238104Sdes					if (key) {
1355238104Sdes						node = ldns_rbtree_search(
1356238104Sdes							(ldns_rbtree_t *)
1357238104Sdes								fmt->data,
1358238104Sdes							(void *) key);
1359238104Sdes						if (node->data) {
1360238104Sdes							ldns_buffer_printf(
1361238104Sdes								output,
1362238104Sdes								" to: ");
1363238104Sdes							(void)
1364238104Sdes							ldns_rdf2buffer_str(
1365238104Sdes								output,
1366238104Sdes								(ldns_rdf *)
1367238104Sdes								node->data);
1368238104Sdes						}
1369238104Sdes						ldns_rdf_free(key);
1370238104Sdes					}
1371238104Sdes				}
1372238104Sdes				ldns_buffer_printf(output, "}");
1373238104Sdes				break;
1374238104Sdes			default:
1375238104Sdes				break;
1376238104Sdes
1377238104Sdes		}
1378238104Sdes	}
1379238104Sdes	/* last */
1380238104Sdes	ldns_buffer_printf(output, "\n");
1381238104Sdes	return ldns_buffer_status(output);
1382238104Sdes}
1383238104Sdes
1384238104Sdesldns_status
1385238104Sdesldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr)
1386238104Sdes{
1387238104Sdes	return ldns_rr2buffer_str_fmt(output, ldns_output_format_default, rr);
1388238104Sdes}
1389238104Sdes
1390238104Sdesldns_status
1391238104Sdesldns_rr_list2buffer_str_fmt(ldns_buffer *output,
1392238104Sdes		const ldns_output_format *fmt, const ldns_rr_list *list)
1393238104Sdes{
1394238104Sdes	uint16_t i;
1395238104Sdes
1396238104Sdes	for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
1397238104Sdes		(void) ldns_rr2buffer_str_fmt(output, fmt,
1398238104Sdes				ldns_rr_list_rr(list, i));
1399238104Sdes	}
1400238104Sdes	return ldns_buffer_status(output);
1401238104Sdes}
1402238104Sdes
1403238104Sdesldns_status
1404238104Sdesldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list)
1405238104Sdes{
1406238104Sdes	return ldns_rr_list2buffer_str_fmt(
1407238104Sdes			output, ldns_output_format_default, list);
1408238104Sdes}
1409238104Sdes
1410238104Sdesldns_status
1411238104Sdesldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
1412238104Sdes{
1413238104Sdes	ldns_lookup_table *opcode = ldns_lookup_by_id(ldns_opcodes,
1414238104Sdes			                    (int) ldns_pkt_get_opcode(pkt));
1415238104Sdes	ldns_lookup_table *rcode = ldns_lookup_by_id(ldns_rcodes,
1416238104Sdes			                    (int) ldns_pkt_get_rcode(pkt));
1417238104Sdes
1418238104Sdes	ldns_buffer_printf(output, ";; ->>HEADER<<- ");
1419238104Sdes	if (opcode) {
1420238104Sdes		ldns_buffer_printf(output, "opcode: %s, ", opcode->name);
1421238104Sdes	} else {
1422238104Sdes		ldns_buffer_printf(output, "opcode: ?? (%u), ",
1423238104Sdes				ldns_pkt_get_opcode(pkt));
1424238104Sdes	}
1425238104Sdes	if (rcode) {
1426238104Sdes		ldns_buffer_printf(output, "rcode: %s, ", rcode->name);
1427238104Sdes	} else {
1428238104Sdes		ldns_buffer_printf(output, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt));
1429238104Sdes	}
1430238104Sdes	ldns_buffer_printf(output, "id: %d\n", ldns_pkt_id(pkt));
1431238104Sdes	ldns_buffer_printf(output, ";; flags: ");
1432238104Sdes
1433238104Sdes	if (ldns_pkt_qr(pkt)) {
1434238104Sdes		ldns_buffer_printf(output, "qr ");
1435238104Sdes	}
1436238104Sdes	if (ldns_pkt_aa(pkt)) {
1437238104Sdes		ldns_buffer_printf(output, "aa ");
1438238104Sdes	}
1439238104Sdes	if (ldns_pkt_tc(pkt)) {
1440238104Sdes		ldns_buffer_printf(output, "tc ");
1441238104Sdes	}
1442238104Sdes	if (ldns_pkt_rd(pkt)) {
1443238104Sdes		ldns_buffer_printf(output, "rd ");
1444238104Sdes	}
1445238104Sdes	if (ldns_pkt_cd(pkt)) {
1446238104Sdes		ldns_buffer_printf(output, "cd ");
1447238104Sdes	}
1448238104Sdes	if (ldns_pkt_ra(pkt)) {
1449238104Sdes		ldns_buffer_printf(output, "ra ");
1450238104Sdes	}
1451238104Sdes	if (ldns_pkt_ad(pkt)) {
1452238104Sdes		ldns_buffer_printf(output, "ad ");
1453238104Sdes	}
1454238104Sdes	ldns_buffer_printf(output, "; ");
1455238104Sdes	ldns_buffer_printf(output, "QUERY: %u, ", ldns_pkt_qdcount(pkt));
1456238104Sdes	ldns_buffer_printf(output, "ANSWER: %u, ", ldns_pkt_ancount(pkt));
1457238104Sdes	ldns_buffer_printf(output, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt));
1458238104Sdes	ldns_buffer_printf(output, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt));
1459238104Sdes	return ldns_buffer_status(output);
1460238104Sdes}
1461238104Sdes
1462238104Sdesldns_status
1463238104Sdesldns_pkt2buffer_str_fmt(ldns_buffer *output,
1464238104Sdes		const ldns_output_format *fmt, const ldns_pkt *pkt)
1465238104Sdes{
1466238104Sdes	uint16_t i;
1467238104Sdes	ldns_status status = LDNS_STATUS_OK;
1468238104Sdes	char *tmp;
1469238104Sdes	struct timeval time;
1470238104Sdes	time_t time_tt;
1471238104Sdes
1472238104Sdes	if (!pkt) {
1473238104Sdes		ldns_buffer_printf(output, "null");
1474238104Sdes		return LDNS_STATUS_OK;
1475238104Sdes	}
1476238104Sdes
1477238104Sdes	if (ldns_buffer_status_ok(output)) {
1478238104Sdes		status = ldns_pktheader2buffer_str(output, pkt);
1479238104Sdes		if (status != LDNS_STATUS_OK) {
1480238104Sdes			return status;
1481238104Sdes		}
1482238104Sdes
1483238104Sdes		ldns_buffer_printf(output, "\n");
1484238104Sdes
1485238104Sdes		ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; ");
1486238104Sdes
1487238104Sdes
1488238104Sdes		for (i = 0; i < ldns_pkt_qdcount(pkt); i++) {
1489238104Sdes			status = ldns_rr2buffer_str_fmt(output, fmt,
1490238104Sdes				       ldns_rr_list_rr(
1491238104Sdes					       ldns_pkt_question(pkt), i));
1492238104Sdes			if (status != LDNS_STATUS_OK) {
1493238104Sdes				return status;
1494238104Sdes			}
1495238104Sdes		}
1496238104Sdes		ldns_buffer_printf(output, "\n");
1497238104Sdes
1498238104Sdes		ldns_buffer_printf(output, ";; ANSWER SECTION:\n");
1499238104Sdes		for (i = 0; i < ldns_pkt_ancount(pkt); i++) {
1500238104Sdes			status = ldns_rr2buffer_str_fmt(output, fmt,
1501238104Sdes				       ldns_rr_list_rr(
1502238104Sdes					       ldns_pkt_answer(pkt), i));
1503238104Sdes			if (status != LDNS_STATUS_OK) {
1504238104Sdes				return status;
1505238104Sdes			}
1506238104Sdes
1507238104Sdes		}
1508238104Sdes		ldns_buffer_printf(output, "\n");
1509238104Sdes
1510238104Sdes		ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n");
1511238104Sdes
1512238104Sdes		for (i = 0; i < ldns_pkt_nscount(pkt); i++) {
1513238104Sdes			status = ldns_rr2buffer_str_fmt(output, fmt,
1514238104Sdes				       ldns_rr_list_rr(
1515238104Sdes					       ldns_pkt_authority(pkt), i));
1516238104Sdes			if (status != LDNS_STATUS_OK) {
1517238104Sdes				return status;
1518238104Sdes			}
1519238104Sdes		}
1520238104Sdes		ldns_buffer_printf(output, "\n");
1521238104Sdes
1522238104Sdes		ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n");
1523238104Sdes		for (i = 0; i < ldns_pkt_arcount(pkt); i++) {
1524238104Sdes			status = ldns_rr2buffer_str_fmt(output, fmt,
1525238104Sdes				       ldns_rr_list_rr(
1526238104Sdes					       ldns_pkt_additional(pkt), i));
1527238104Sdes			if (status != LDNS_STATUS_OK) {
1528238104Sdes				return status;
1529238104Sdes			}
1530238104Sdes
1531238104Sdes		}
1532238104Sdes		ldns_buffer_printf(output, "\n");
1533238104Sdes		/* add some futher fields */
1534238104Sdes		ldns_buffer_printf(output, ";; Query time: %d msec\n",
1535238104Sdes				ldns_pkt_querytime(pkt));
1536238104Sdes		if (ldns_pkt_edns(pkt)) {
1537238104Sdes			ldns_buffer_printf(output,
1538238104Sdes				   ";; EDNS: version %u; flags:",
1539238104Sdes				   ldns_pkt_edns_version(pkt));
1540238104Sdes			if (ldns_pkt_edns_do(pkt)) {
1541238104Sdes				ldns_buffer_printf(output, " do");
1542238104Sdes			}
1543238104Sdes			/* the extended rcode is the value set, shifted four bits,
1544238104Sdes			 * and or'd with the original rcode */
1545238104Sdes			if (ldns_pkt_edns_extended_rcode(pkt)) {
1546238104Sdes				ldns_buffer_printf(output, " ; ext-rcode: %d",
1547238104Sdes					(ldns_pkt_edns_extended_rcode(pkt) << 4 | ldns_pkt_get_rcode(pkt)));
1548238104Sdes			}
1549238104Sdes			ldns_buffer_printf(output, " ; udp: %u\n",
1550238104Sdes					   ldns_pkt_edns_udp_size(pkt));
1551238104Sdes
1552238104Sdes			if (ldns_pkt_edns_data(pkt)) {
1553238104Sdes				ldns_buffer_printf(output, ";; Data: ");
1554238104Sdes				(void)ldns_rdf2buffer_str(output,
1555238104Sdes							  ldns_pkt_edns_data(pkt));
1556238104Sdes				ldns_buffer_printf(output, "\n");
1557238104Sdes			}
1558238104Sdes		}
1559238104Sdes		if (ldns_pkt_tsig(pkt)) {
1560238104Sdes			ldns_buffer_printf(output, ";; TSIG:\n;; ");
1561238104Sdes			(void) ldns_rr2buffer_str_fmt(
1562238104Sdes					output, fmt, ldns_pkt_tsig(pkt));
1563238104Sdes			ldns_buffer_printf(output, "\n");
1564238104Sdes		}
1565238104Sdes		if (ldns_pkt_answerfrom(pkt)) {
1566238104Sdes			tmp = ldns_rdf2str(ldns_pkt_answerfrom(pkt));
1567238104Sdes			ldns_buffer_printf(output, ";; SERVER: %s\n", tmp);
1568238104Sdes			LDNS_FREE(tmp);
1569238104Sdes		}
1570238104Sdes		time = ldns_pkt_timestamp(pkt);
1571238104Sdes		time_tt = (time_t)time.tv_sec;
1572238104Sdes		ldns_buffer_printf(output, ";; WHEN: %s",
1573238104Sdes				(char*)ctime(&time_tt));
1574238104Sdes
1575238104Sdes		ldns_buffer_printf(output, ";; MSG SIZE  rcvd: %d\n",
1576238104Sdes				(int)ldns_pkt_size(pkt));
1577238104Sdes	} else {
1578238104Sdes		return ldns_buffer_status(output);
1579238104Sdes	}
1580238104Sdes	return status;
1581238104Sdes}
1582238104Sdes
1583238104Sdesldns_status
1584238104Sdesldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
1585238104Sdes{
1586238104Sdes	return ldns_pkt2buffer_str_fmt(output, ldns_output_format_default, pkt);
1587238104Sdes}
1588238104Sdes
1589238104Sdes
1590238104Sdes#ifdef HAVE_SSL
1591238104Sdesstatic ldns_status
1592238104Sdesldns_hmac_key2buffer_str(ldns_buffer *output, const ldns_key *k)
1593238104Sdes{
1594238104Sdes	ldns_status status;
1595238104Sdes	size_t i;
1596238104Sdes	ldns_rdf *b64_bignum;
1597238104Sdes
1598238104Sdes	ldns_buffer_printf(output, "Key: ");
1599238104Sdes
1600238104Sdes 	i = ldns_key_hmac_size(k);
1601238104Sdes	b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, ldns_key_hmac_key(k));
1602238104Sdes	status = ldns_rdf2buffer_str(output, b64_bignum);
1603238104Sdes	ldns_rdf_deep_free(b64_bignum);
1604238104Sdes	ldns_buffer_printf(output, "\n");
1605238104Sdes	return status;
1606238104Sdes}
1607238104Sdes#endif
1608238104Sdes
1609238104Sdes#if defined(HAVE_SSL) && defined(USE_GOST)
1610238104Sdesstatic ldns_status
1611238104Sdesldns_gost_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
1612238104Sdes{
1613238104Sdes	unsigned char* pp = NULL;
1614238104Sdes	int ret;
1615238104Sdes	ldns_rdf *b64_bignum;
1616238104Sdes	ldns_status status;
1617238104Sdes
1618238104Sdes	ldns_buffer_printf(output, "GostAsn1: ");
1619238104Sdes
1620238104Sdes	ret = i2d_PrivateKey(p, &pp);
1621238104Sdes	b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)ret, pp);
1622238104Sdes	status = ldns_rdf2buffer_str(output, b64_bignum);
1623238104Sdes
1624238104Sdes	ldns_rdf_deep_free(b64_bignum);
1625238104Sdes	OPENSSL_free(pp);
1626238104Sdes	ldns_buffer_printf(output, "\n");
1627238104Sdes	return status;
1628238104Sdes}
1629238104Sdes#endif
1630238104Sdes
1631238104Sdesldns_status
1632238104Sdesldns_key2buffer_str(ldns_buffer *output, const ldns_key *k)
1633238104Sdes{
1634238104Sdes	ldns_status status = LDNS_STATUS_OK;
1635238104Sdes	unsigned char  *bignum;
1636238104Sdes#ifndef S_SPLINT_S
1637238104Sdes	uint16_t i;
1638238104Sdes#endif
1639238104Sdes
1640238104Sdes#ifdef HAVE_SSL
1641238104Sdes	/* not used when ssl is not defined */
1642238104Sdes	ldns_rdf *b64_bignum = NULL;
1643238104Sdes
1644238104Sdes	RSA *rsa;
1645238104Sdes	DSA *dsa;
1646238104Sdes#endif /* HAVE_SSL */
1647238104Sdes
1648238104Sdes	if (!k) {
1649238104Sdes		return LDNS_STATUS_ERR;
1650238104Sdes	}
1651238104Sdes
1652238104Sdes	bignum = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN);
1653238104Sdes	if (!bignum) {
1654238104Sdes		return LDNS_STATUS_ERR;
1655238104Sdes	}
1656238104Sdes
1657238104Sdes	if (ldns_buffer_status_ok(output)) {
1658238104Sdes#ifdef HAVE_SSL
1659238104Sdes		switch(ldns_key_algorithm(k)) {
1660238104Sdes			case LDNS_SIGN_RSASHA1:
1661238104Sdes			case LDNS_SIGN_RSASHA1_NSEC3:
1662238104Sdes			case LDNS_SIGN_RSASHA256:
1663238104Sdes			case LDNS_SIGN_RSASHA512:
1664238104Sdes			case LDNS_SIGN_RSAMD5:
1665238104Sdes				/* copied by looking at dnssec-keygen output */
1666238104Sdes				/* header */
1667238104Sdes				rsa = ldns_key_rsa_key(k);
1668238104Sdes
1669238104Sdes				ldns_buffer_printf(output,"Private-key-format: v1.2\n");
1670238104Sdes				switch(ldns_key_algorithm(k)) {
1671238104Sdes				case LDNS_SIGN_RSAMD5:
1672238104Sdes					ldns_buffer_printf(output,
1673238104Sdes								    "Algorithm: %u (RSA)\n",
1674238104Sdes								    LDNS_RSAMD5);
1675238104Sdes					break;
1676238104Sdes				case LDNS_SIGN_RSASHA1:
1677238104Sdes					ldns_buffer_printf(output,
1678238104Sdes								    "Algorithm: %u (RSASHA1)\n",
1679238104Sdes								    LDNS_RSASHA1);
1680238104Sdes					break;
1681238104Sdes				case LDNS_SIGN_RSASHA1_NSEC3:
1682238104Sdes					ldns_buffer_printf(output,
1683238104Sdes								    "Algorithm: %u (RSASHA1_NSEC3)\n",
1684238104Sdes								    LDNS_RSASHA1_NSEC3);
1685238104Sdes					break;
1686238104Sdes#ifdef USE_SHA2
1687238104Sdes				case LDNS_SIGN_RSASHA256:
1688238104Sdes					ldns_buffer_printf(output,
1689238104Sdes								    "Algorithm: %u (RSASHA256)\n",
1690238104Sdes								    LDNS_RSASHA256);
1691238104Sdes					break;
1692238104Sdes				case LDNS_SIGN_RSASHA512:
1693238104Sdes					ldns_buffer_printf(output,
1694238104Sdes								    "Algorithm: %u (RSASHA512)\n",
1695238104Sdes								    LDNS_RSASHA512);
1696238104Sdes					break;
1697238104Sdes#endif
1698238104Sdes				default:
1699238104Sdes					fprintf(stderr, "Warning: unknown signature ");
1700238104Sdes					fprintf(stderr,
1701238104Sdes						   "algorithm type %u\n",
1702238104Sdes						   ldns_key_algorithm(k));
1703238104Sdes					ldns_buffer_printf(output,
1704238104Sdes								    "Algorithm: %u (Unknown)\n",
1705238104Sdes								    ldns_key_algorithm(k));
1706238104Sdes					break;
1707238104Sdes				}
1708238104Sdes
1709238104Sdes				/* print to buf, convert to bin, convert to b64,
1710238104Sdes				 * print to buf */
1711238104Sdes				ldns_buffer_printf(output, "Modulus: ");
1712238104Sdes#ifndef S_SPLINT_S
1713238104Sdes				i = (uint16_t)BN_bn2bin(rsa->n, bignum);
1714238104Sdes				if (i > LDNS_MAX_KEYLEN) {
1715238104Sdes					goto error;
1716238104Sdes				}
1717238104Sdes				b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1718238104Sdes				if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1719238104Sdes					goto error;
1720238104Sdes				}
1721238104Sdes				ldns_rdf_deep_free(b64_bignum);
1722238104Sdes				ldns_buffer_printf(output, "\n");
1723238104Sdes				ldns_buffer_printf(output, "PublicExponent: ");
1724238104Sdes				i = (uint16_t)BN_bn2bin(rsa->e, bignum);
1725238104Sdes				if (i > LDNS_MAX_KEYLEN) {
1726238104Sdes					goto error;
1727238104Sdes				}
1728238104Sdes				b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1729238104Sdes				if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1730238104Sdes					goto error;
1731238104Sdes				}
1732238104Sdes				ldns_rdf_deep_free(b64_bignum);
1733238104Sdes				ldns_buffer_printf(output, "\n");
1734238104Sdes
1735238104Sdes				ldns_buffer_printf(output, "PrivateExponent: ");
1736238104Sdes				if (rsa->d) {
1737238104Sdes					i = (uint16_t)BN_bn2bin(rsa->d, bignum);
1738238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1739238104Sdes						goto error;
1740238104Sdes					}
1741238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1742238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1743238104Sdes						goto error;
1744238104Sdes					}
1745238104Sdes					ldns_rdf_deep_free(b64_bignum);
1746238104Sdes					ldns_buffer_printf(output, "\n");
1747238104Sdes				} else {
1748238104Sdes					ldns_buffer_printf(output, "(Not available)\n");
1749238104Sdes				}
1750238104Sdes
1751238104Sdes				ldns_buffer_printf(output, "Prime1: ");
1752238104Sdes				if (rsa->p) {
1753238104Sdes					i = (uint16_t)BN_bn2bin(rsa->p, bignum);
1754238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1755238104Sdes						goto error;
1756238104Sdes					}
1757238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1758238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1759238104Sdes						goto error;
1760238104Sdes					}
1761238104Sdes					ldns_rdf_deep_free(b64_bignum);
1762238104Sdes					ldns_buffer_printf(output, "\n");
1763238104Sdes				} else {
1764238104Sdes					ldns_buffer_printf(output, "(Not available)\n");
1765238104Sdes				}
1766238104Sdes
1767238104Sdes				ldns_buffer_printf(output, "Prime2: ");
1768238104Sdes				if (rsa->q) {
1769238104Sdes					i = (uint16_t)BN_bn2bin(rsa->q, bignum);
1770238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1771238104Sdes						goto error;
1772238104Sdes					}
1773238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1774238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1775238104Sdes						goto error;
1776238104Sdes					}
1777238104Sdes					ldns_rdf_deep_free(b64_bignum);
1778238104Sdes					ldns_buffer_printf(output, "\n");
1779238104Sdes				} else {
1780238104Sdes					ldns_buffer_printf(output, "(Not available)\n");
1781238104Sdes				}
1782238104Sdes
1783238104Sdes				ldns_buffer_printf(output, "Exponent1: ");
1784238104Sdes				if (rsa->dmp1) {
1785238104Sdes					i = (uint16_t)BN_bn2bin(rsa->dmp1, bignum);
1786238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1787238104Sdes						goto error;
1788238104Sdes					}
1789238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1790238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1791238104Sdes						goto error;
1792238104Sdes					}
1793238104Sdes					ldns_rdf_deep_free(b64_bignum);
1794238104Sdes					ldns_buffer_printf(output, "\n");
1795238104Sdes				} else {
1796238104Sdes					ldns_buffer_printf(output, "(Not available)\n");
1797238104Sdes				}
1798238104Sdes
1799238104Sdes				ldns_buffer_printf(output, "Exponent2: ");
1800238104Sdes				if (rsa->dmq1) {
1801238104Sdes					i = (uint16_t)BN_bn2bin(rsa->dmq1, bignum);
1802238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1803238104Sdes						goto error;
1804238104Sdes					}
1805238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1806238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1807238104Sdes						goto error;
1808238104Sdes					}
1809238104Sdes					ldns_rdf_deep_free(b64_bignum);
1810238104Sdes					ldns_buffer_printf(output, "\n");
1811238104Sdes				} else {
1812238104Sdes					ldns_buffer_printf(output, "(Not available)\n");
1813238104Sdes				}
1814238104Sdes
1815238104Sdes				ldns_buffer_printf(output, "Coefficient: ");
1816238104Sdes				if (rsa->iqmp) {
1817238104Sdes					i = (uint16_t)BN_bn2bin(rsa->iqmp, bignum);
1818238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1819238104Sdes						goto error;
1820238104Sdes					}
1821238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1822238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1823238104Sdes						goto error;
1824238104Sdes					}
1825238104Sdes					ldns_rdf_deep_free(b64_bignum);
1826238104Sdes					ldns_buffer_printf(output, "\n");
1827238104Sdes				} else {
1828238104Sdes					ldns_buffer_printf(output, "(Not available)\n");
1829238104Sdes				}
1830238104Sdes#endif /* splint */
1831238104Sdes
1832238104Sdes				RSA_free(rsa);
1833238104Sdes				break;
1834238104Sdes			case LDNS_SIGN_DSA:
1835238104Sdes			case LDNS_SIGN_DSA_NSEC3:
1836238104Sdes				dsa = ldns_key_dsa_key(k);
1837238104Sdes
1838238104Sdes				ldns_buffer_printf(output,"Private-key-format: v1.2\n");
1839238104Sdes				if (ldns_key_algorithm(k) == LDNS_SIGN_DSA) {
1840238104Sdes					ldns_buffer_printf(output,"Algorithm: 3 (DSA)\n");
1841238104Sdes				} else if (ldns_key_algorithm(k) == LDNS_SIGN_DSA_NSEC3) {
1842238104Sdes					ldns_buffer_printf(output,"Algorithm: 6 (DSA_NSEC3)\n");
1843238104Sdes				}
1844238104Sdes
1845238104Sdes				/* print to buf, convert to bin, convert to b64,
1846238104Sdes				 * print to buf */
1847238104Sdes				ldns_buffer_printf(output, "Prime(p): ");
1848238104Sdes#ifndef S_SPLINT_S
1849238104Sdes				if (dsa->p) {
1850238104Sdes					i = (uint16_t)BN_bn2bin(dsa->p, bignum);
1851238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1852238104Sdes						goto error;
1853238104Sdes					}
1854238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1855238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1856238104Sdes						goto error;
1857238104Sdes					}
1858238104Sdes					ldns_rdf_deep_free(b64_bignum);
1859238104Sdes					ldns_buffer_printf(output, "\n");
1860238104Sdes				} else {
1861238104Sdes					printf("(Not available)\n");
1862238104Sdes				}
1863238104Sdes
1864238104Sdes				ldns_buffer_printf(output, "Subprime(q): ");
1865238104Sdes				if (dsa->q) {
1866238104Sdes					i = (uint16_t)BN_bn2bin(dsa->q, bignum);
1867238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1868238104Sdes						goto error;
1869238104Sdes					}
1870238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1871238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1872238104Sdes						goto error;
1873238104Sdes					}
1874238104Sdes					ldns_rdf_deep_free(b64_bignum);
1875238104Sdes					ldns_buffer_printf(output, "\n");
1876238104Sdes				} else {
1877238104Sdes					printf("(Not available)\n");
1878238104Sdes				}
1879238104Sdes
1880238104Sdes				ldns_buffer_printf(output, "Base(g): ");
1881238104Sdes				if (dsa->g) {
1882238104Sdes					i = (uint16_t)BN_bn2bin(dsa->g, bignum);
1883238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1884238104Sdes						goto error;
1885238104Sdes					}
1886238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1887238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1888238104Sdes						goto error;
1889238104Sdes					}
1890238104Sdes					ldns_rdf_deep_free(b64_bignum);
1891238104Sdes					ldns_buffer_printf(output, "\n");
1892238104Sdes				} else {
1893238104Sdes					printf("(Not available)\n");
1894238104Sdes				}
1895238104Sdes
1896238104Sdes				ldns_buffer_printf(output, "Private_value(x): ");
1897238104Sdes				if (dsa->priv_key) {
1898238104Sdes					i = (uint16_t)BN_bn2bin(dsa->priv_key, bignum);
1899238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1900238104Sdes						goto error;
1901238104Sdes					}
1902238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1903238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1904238104Sdes						goto error;
1905238104Sdes					}
1906238104Sdes					ldns_rdf_deep_free(b64_bignum);
1907238104Sdes					ldns_buffer_printf(output, "\n");
1908238104Sdes				} else {
1909238104Sdes					printf("(Not available)\n");
1910238104Sdes				}
1911238104Sdes
1912238104Sdes				ldns_buffer_printf(output, "Public_value(y): ");
1913238104Sdes				if (dsa->pub_key) {
1914238104Sdes					i = (uint16_t)BN_bn2bin(dsa->pub_key, bignum);
1915238104Sdes					if (i > LDNS_MAX_KEYLEN) {
1916238104Sdes						goto error;
1917238104Sdes					}
1918238104Sdes					b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1919238104Sdes					if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1920238104Sdes						goto error;
1921238104Sdes					}
1922238104Sdes					ldns_rdf_deep_free(b64_bignum);
1923238104Sdes					ldns_buffer_printf(output, "\n");
1924238104Sdes				} else {
1925238104Sdes					printf("(Not available)\n");
1926238104Sdes				}
1927238104Sdes#endif /* splint */
1928238104Sdes				break;
1929238104Sdes			case LDNS_SIGN_ECC_GOST:
1930238104Sdes				/* no format defined, use blob */
1931238104Sdes#if defined(HAVE_SSL) && defined(USE_GOST)
1932238104Sdes				ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1933238104Sdes				ldns_buffer_printf(output, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST);
1934238104Sdes				status = ldns_gost_key2buffer_str(output,
1935238104Sdes#ifndef S_SPLINT_S
1936238104Sdes					k->_key.key
1937238104Sdes#else
1938238104Sdes					NULL
1939238104Sdes#endif
1940238104Sdes				);
1941238104Sdes#else
1942238104Sdes				goto error;
1943238104Sdes#endif /* GOST */
1944238104Sdes				break;
1945238104Sdes			case LDNS_SIGN_ECDSAP256SHA256:
1946238104Sdes			case LDNS_SIGN_ECDSAP384SHA384:
1947238104Sdes#ifdef USE_ECDSA
1948238104Sdes                                ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1949238104Sdes				ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
1950238104Sdes                                status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
1951238104Sdes#ifndef S_SPLINT_S
1952238104Sdes				ldns_buffer_printf(output, ")\n");
1953238104Sdes                                if(k->_key.key) {
1954238104Sdes                                        EC_KEY* ec = EVP_PKEY_get1_EC_KEY(k->_key.key);
1955238104Sdes                                        const BIGNUM* b = EC_KEY_get0_private_key(ec);
1956238104Sdes                                        ldns_buffer_printf(output, "PrivateKey: ");
1957238104Sdes                                        i = (uint16_t)BN_bn2bin(b, bignum);
1958238104Sdes                                        if (i > LDNS_MAX_KEYLEN) {
1959238104Sdes                                                goto error;
1960238104Sdes                                        }
1961238104Sdes                                        b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1962238104Sdes                                        if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1963238104Sdes                                                goto error;
1964238104Sdes                                        }
1965238104Sdes                                        ldns_rdf_deep_free(b64_bignum);
1966238104Sdes				        ldns_buffer_printf(output, "\n");
1967238104Sdes                                        /* down reference count in EC_KEY
1968238104Sdes                                         * its still assigned to the PKEY */
1969238104Sdes                                        EC_KEY_free(ec);
1970238104Sdes                                }
1971238104Sdes#endif /* splint */
1972238104Sdes#else
1973238104Sdes				goto error;
1974238104Sdes#endif /* ECDSA */
1975238104Sdes                                break;
1976238104Sdes			case LDNS_SIGN_HMACMD5:
1977238104Sdes				/* there's not much of a format defined for TSIG */
1978238104Sdes				/* It's just a binary blob, Same for all algorithms */
1979238104Sdes                ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1980238104Sdes                ldns_buffer_printf(output, "Algorithm: 157 (HMAC_MD5)\n");
1981238104Sdes				status = ldns_hmac_key2buffer_str(output, k);
1982238104Sdes				break;
1983238104Sdes			case LDNS_SIGN_HMACSHA1:
1984238104Sdes		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1985238104Sdes		        ldns_buffer_printf(output, "Algorithm: 158 (HMAC_SHA1)\n");
1986238104Sdes				status = ldns_hmac_key2buffer_str(output, k);
1987238104Sdes				break;
1988238104Sdes			case LDNS_SIGN_HMACSHA256:
1989238104Sdes		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1990238104Sdes		        ldns_buffer_printf(output, "Algorithm: 159 (HMAC_SHA256)\n");
1991238104Sdes				status = ldns_hmac_key2buffer_str(output, k);
1992238104Sdes				break;
1993238104Sdes		}
1994238104Sdes#endif /* HAVE_SSL */
1995238104Sdes	} else {
1996238104Sdes#ifdef HAVE_SSL
1997238104Sdes		LDNS_FREE(b64_bignum);
1998238104Sdes#endif
1999238104Sdes		LDNS_FREE(bignum);
2000238104Sdes		return ldns_buffer_status(output);
2001238104Sdes	}
2002238104Sdes	LDNS_FREE(bignum);
2003238104Sdes	return status;
2004238104Sdes
2005238104Sdes#ifdef HAVE_SSL
2006238104Sdes	/* compiles warn the label isn't used */
2007238104Sdeserror:
2008238104Sdes	LDNS_FREE(bignum);
2009238104Sdes	return LDNS_STATUS_ERR;
2010238104Sdes#endif /* HAVE_SSL */
2011238104Sdes
2012238104Sdes}
2013238104Sdes
2014238104Sdes/*
2015238104Sdes * Zero terminate the buffer and fix it to the size of the string.
2016238104Sdes */
2017238104Sdeschar *
2018238104Sdesldns_buffer2str(ldns_buffer *buffer)
2019238104Sdes{
2020238104Sdes	char *tmp_str;
2021238104Sdes	char *str;
2022238104Sdes
2023238104Sdes	/* check if buffer ends with \0, if not, and
2024238104Sdes	   if there is space, add it */
2025238104Sdes	if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) {
2026238104Sdes		if (!ldns_buffer_reserve(buffer, 1)) {
2027238104Sdes			return NULL;
2028238104Sdes		}
2029238104Sdes		ldns_buffer_write_u8(buffer, (uint8_t) '\0');
2030238104Sdes		if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) {
2031238104Sdes			return NULL;
2032238104Sdes		}
2033238104Sdes	}
2034238104Sdes
2035238104Sdes	tmp_str = ldns_buffer_export(buffer);
2036238104Sdes	str = LDNS_XMALLOC(char, strlen(tmp_str) + 1);
2037238104Sdes        if(!str) {
2038238104Sdes                return NULL;
2039238104Sdes        }
2040238104Sdes	memcpy(str, tmp_str, strlen(tmp_str) + 1);
2041238104Sdes
2042238104Sdes	return str;
2043238104Sdes}
2044238104Sdes
2045238104Sdeschar *
2046238104Sdesldns_rdf2str(const ldns_rdf *rdf)
2047238104Sdes{
2048238104Sdes	char *result = NULL;
2049238104Sdes	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2050238104Sdes
2051238104Sdes	if (!tmp_buffer) {
2052238104Sdes		return NULL;
2053238104Sdes	}
2054238104Sdes	if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) {
2055238104Sdes		/* export and return string, destroy rest */
2056238104Sdes		result = ldns_buffer2str(tmp_buffer);
2057238104Sdes	}
2058238104Sdes	ldns_buffer_free(tmp_buffer);
2059238104Sdes	return result;
2060238104Sdes}
2061238104Sdes
2062238104Sdeschar *
2063238104Sdesldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr)
2064238104Sdes{
2065238104Sdes	char *result = NULL;
2066238104Sdes	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2067238104Sdes
2068238104Sdes	if (!tmp_buffer) {
2069238104Sdes		return NULL;
2070238104Sdes	}
2071238104Sdes	if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr)
2072238104Sdes		       	== LDNS_STATUS_OK) {
2073238104Sdes		/* export and return string, destroy rest */
2074238104Sdes		result = ldns_buffer2str(tmp_buffer);
2075238104Sdes	}
2076238104Sdes	ldns_buffer_free(tmp_buffer);
2077238104Sdes	return result;
2078238104Sdes}
2079238104Sdes
2080238104Sdeschar *
2081238104Sdesldns_rr2str(const ldns_rr *rr)
2082238104Sdes{
2083238104Sdes	return ldns_rr2str_fmt(ldns_output_format_default, rr);
2084238104Sdes}
2085238104Sdes
2086238104Sdeschar *
2087238104Sdesldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt)
2088238104Sdes{
2089238104Sdes	char *result = NULL;
2090238104Sdes	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2091238104Sdes
2092238104Sdes	if (!tmp_buffer) {
2093238104Sdes		return NULL;
2094238104Sdes	}
2095238104Sdes	if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt)
2096238104Sdes		       	== LDNS_STATUS_OK) {
2097238104Sdes		/* export and return string, destroy rest */
2098238104Sdes		result = ldns_buffer2str(tmp_buffer);
2099238104Sdes	}
2100238104Sdes
2101238104Sdes	ldns_buffer_free(tmp_buffer);
2102238104Sdes	return result;
2103238104Sdes}
2104238104Sdes
2105238104Sdeschar *
2106238104Sdesldns_pkt2str(const ldns_pkt *pkt)
2107238104Sdes{
2108238104Sdes	return ldns_pkt2str_fmt(ldns_output_format_default, pkt);
2109238104Sdes}
2110238104Sdes
2111238104Sdeschar *
2112238104Sdesldns_key2str(const ldns_key *k)
2113238104Sdes{
2114238104Sdes	char *result = NULL;
2115238104Sdes	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2116238104Sdes
2117238104Sdes	if (!tmp_buffer) {
2118238104Sdes		return NULL;
2119238104Sdes	}
2120238104Sdes	if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) {
2121238104Sdes		/* export and return string, destroy rest */
2122238104Sdes		result = ldns_buffer2str(tmp_buffer);
2123238104Sdes	}
2124238104Sdes	ldns_buffer_free(tmp_buffer);
2125238104Sdes	return result;
2126238104Sdes}
2127238104Sdes
2128238104Sdeschar *
2129238104Sdesldns_rr_list2str_fmt(const ldns_output_format *fmt, const ldns_rr_list *list)
2130238104Sdes{
2131238104Sdes	char *result = NULL;
2132238104Sdes	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2133238104Sdes
2134238104Sdes	if (!tmp_buffer) {
2135238104Sdes		return NULL;
2136238104Sdes	}
2137238104Sdes	if (list) {
2138238104Sdes		if (ldns_rr_list2buffer_str_fmt(
2139238104Sdes				   tmp_buffer, fmt, list)
2140238104Sdes			       	== LDNS_STATUS_OK) {
2141238104Sdes		}
2142238104Sdes	} else {
2143238104Sdes		if (fmt == NULL) {
2144238104Sdes			fmt = ldns_output_format_default;
2145238104Sdes		}
2146238104Sdes		if (fmt->flags & LDNS_COMMENT_NULLS) {
2147238104Sdes			ldns_buffer_printf(tmp_buffer, "; (null)\n");
2148238104Sdes		}
2149238104Sdes	}
2150238104Sdes
2151238104Sdes	/* export and return string, destroy rest */
2152238104Sdes	result = ldns_buffer2str(tmp_buffer);
2153238104Sdes	ldns_buffer_free(tmp_buffer);
2154238104Sdes	return result;
2155238104Sdes}
2156238104Sdes
2157238104Sdeschar *
2158238104Sdesldns_rr_list2str(const ldns_rr_list *list)
2159238104Sdes{
2160238104Sdes	return ldns_rr_list2str_fmt(ldns_output_format_default, list);
2161238104Sdes}
2162238104Sdes
2163238104Sdesvoid
2164238104Sdesldns_rdf_print(FILE *output, const ldns_rdf *rdf)
2165238104Sdes{
2166238104Sdes	char *str = ldns_rdf2str(rdf);
2167238104Sdes	if (str) {
2168238104Sdes		fprintf(output, "%s", str);
2169238104Sdes	} else {
2170238104Sdes		fprintf(output, "Unable to convert rdf to string\n");
2171238104Sdes	}
2172238104Sdes	LDNS_FREE(str);
2173238104Sdes}
2174238104Sdes
2175238104Sdesvoid
2176238104Sdesldns_rr_print_fmt(FILE *output,
2177238104Sdes		const ldns_output_format *fmt, const ldns_rr *rr)
2178238104Sdes{
2179238104Sdes	char *str = ldns_rr2str_fmt(fmt, rr);
2180238104Sdes	if (str) {
2181238104Sdes		fprintf(output, "%s", str);
2182238104Sdes	} else {
2183238104Sdes		fprintf(output, "Unable to convert rr to string\n");
2184238104Sdes	}
2185238104Sdes	LDNS_FREE(str);
2186238104Sdes}
2187238104Sdes
2188238104Sdesvoid
2189238104Sdesldns_rr_print(FILE *output, const ldns_rr *rr)
2190238104Sdes{
2191238104Sdes	ldns_rr_print_fmt(output, ldns_output_format_default, rr);
2192238104Sdes}
2193238104Sdes
2194238104Sdesvoid
2195238104Sdesldns_pkt_print_fmt(FILE *output,
2196238104Sdes		const ldns_output_format *fmt, const ldns_pkt *pkt)
2197238104Sdes{
2198238104Sdes	char *str = ldns_pkt2str_fmt(fmt, pkt);
2199238104Sdes	if (str) {
2200238104Sdes		fprintf(output, "%s", str);
2201238104Sdes	} else {
2202238104Sdes		fprintf(output, "Unable to convert packet to string\n");
2203238104Sdes	}
2204238104Sdes	LDNS_FREE(str);
2205238104Sdes}
2206238104Sdes
2207238104Sdesvoid
2208238104Sdesldns_pkt_print(FILE *output, const ldns_pkt *pkt)
2209238104Sdes{
2210238104Sdes	ldns_pkt_print_fmt(output, ldns_output_format_default, pkt);
2211238104Sdes}
2212238104Sdes
2213238104Sdesvoid
2214238104Sdesldns_rr_list_print_fmt(FILE *output,
2215238104Sdes		const ldns_output_format *fmt, const ldns_rr_list *lst)
2216238104Sdes{
2217238104Sdes	size_t i;
2218238104Sdes	for (i = 0; i < ldns_rr_list_rr_count(lst); i++) {
2219238104Sdes		ldns_rr_print_fmt(output, fmt, ldns_rr_list_rr(lst, i));
2220238104Sdes	}
2221238104Sdes}
2222238104Sdes
2223238104Sdesvoid
2224238104Sdesldns_rr_list_print(FILE *output, const ldns_rr_list *lst)
2225238104Sdes{
2226238104Sdes	ldns_rr_list_print_fmt(output, ldns_output_format_default, lst);
2227238104Sdes}
2228238104Sdes
2229238104Sdesvoid
2230238104Sdesldns_resolver_print_fmt(FILE *output,
2231238104Sdes		const ldns_output_format *fmt, const ldns_resolver *r)
2232238104Sdes{
2233238104Sdes	uint16_t i;
2234238104Sdes	ldns_rdf **n;
2235238104Sdes	ldns_rdf **s;
2236238104Sdes	size_t *rtt;
2237238104Sdes	if (!r) {
2238238104Sdes		return;
2239238104Sdes	}
2240238104Sdes	n = ldns_resolver_nameservers(r);
2241238104Sdes	s = ldns_resolver_searchlist(r);
2242238104Sdes	rtt = ldns_resolver_rtt(r);
2243238104Sdes
2244238104Sdes	fprintf(output, "port: %d\n", (int)ldns_resolver_port(r));
2245238104Sdes	fprintf(output, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r));
2246238104Sdes	fprintf(output, "use ip6: %d\n", (int)ldns_resolver_ip6(r));
2247238104Sdes
2248238104Sdes	fprintf(output, "recursive: %d\n", ldns_resolver_recursive(r));
2249238104Sdes	fprintf(output, "usevc: %d\n", ldns_resolver_usevc(r));
2250238104Sdes	fprintf(output, "igntc: %d\n", ldns_resolver_igntc(r));
2251238104Sdes	fprintf(output, "fail: %d\n", ldns_resolver_fail(r));
2252238104Sdes	fprintf(output, "retry: %d\n", (int)ldns_resolver_retry(r));
2253238104Sdes	fprintf(output, "retrans: %d\n", (int)ldns_resolver_retrans(r));
2254238104Sdes	fprintf(output, "fallback: %d\n", ldns_resolver_fallback(r));
2255238104Sdes	fprintf(output, "random: %d\n", ldns_resolver_random(r));
2256238104Sdes	fprintf(output, "timeout: %d\n", (int)ldns_resolver_timeout(r).tv_sec);
2257238104Sdes	fprintf(output, "dnssec: %d\n", ldns_resolver_dnssec(r));
2258238104Sdes	fprintf(output, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r));
2259238104Sdes	fprintf(output, "trust anchors (%d listed):\n",
2260238104Sdes		(int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r)));
2261238104Sdes	ldns_rr_list_print_fmt(output, fmt, ldns_resolver_dnssec_anchors(r));
2262238104Sdes	fprintf(output, "tsig: %s %s\n",
2263238104Sdes                ldns_resolver_tsig_keyname(r)?ldns_resolver_tsig_keyname(r):"-",
2264238104Sdes                ldns_resolver_tsig_algorithm(r)?ldns_resolver_tsig_algorithm(r):"-");
2265238104Sdes	fprintf(output, "debug: %d\n", ldns_resolver_debug(r));
2266238104Sdes
2267238104Sdes	fprintf(output, "default domain: ");
2268238104Sdes	ldns_rdf_print(output, ldns_resolver_domain(r));
2269238104Sdes	fprintf(output, "\n");
2270238104Sdes	fprintf(output, "apply default domain: %d\n", ldns_resolver_defnames(r));
2271238104Sdes
2272238104Sdes	fprintf(output, "searchlist (%d listed):\n",  (int)ldns_resolver_searchlist_count(r));
2273238104Sdes	for (i = 0; i < ldns_resolver_searchlist_count(r); i++) {
2274238104Sdes		fprintf(output, "\t");
2275238104Sdes		ldns_rdf_print(output, s[i]);
2276238104Sdes		fprintf(output, "\n");
2277238104Sdes	}
2278238104Sdes	fprintf(output, "apply search list: %d\n", ldns_resolver_dnsrch(r));
2279238104Sdes
2280238104Sdes	fprintf(output, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r));
2281238104Sdes	for (i = 0; i < ldns_resolver_nameserver_count(r); i++) {
2282238104Sdes		fprintf(output, "\t");
2283238104Sdes		ldns_rdf_print(output, n[i]);
2284238104Sdes
2285238104Sdes		switch ((int)rtt[i]) {
2286238104Sdes			case LDNS_RESOLV_RTT_MIN:
2287238104Sdes			fprintf(output, " - reachable\n");
2288238104Sdes			break;
2289238104Sdes			case LDNS_RESOLV_RTT_INF:
2290238104Sdes			fprintf(output, " - unreachable\n");
2291238104Sdes			break;
2292238104Sdes		}
2293238104Sdes	}
2294238104Sdes}
2295238104Sdes
2296238104Sdesvoid
2297238104Sdesldns_resolver_print(FILE *output, const ldns_resolver *r)
2298238104Sdes{
2299238104Sdes	ldns_resolver_print_fmt(output, ldns_output_format_default, r);
2300238104Sdes}
2301238104Sdes
2302238104Sdesvoid
2303238104Sdesldns_zone_print_fmt(FILE *output,
2304238104Sdes		const ldns_output_format *fmt, const ldns_zone *z)
2305238104Sdes{
2306238104Sdes	if(ldns_zone_soa(z))
2307238104Sdes		ldns_rr_print_fmt(output, fmt, ldns_zone_soa(z));
2308238104Sdes	ldns_rr_list_print_fmt(output, fmt, ldns_zone_rrs(z));
2309238104Sdes}
2310238104Sdesvoid
2311238104Sdesldns_zone_print(FILE *output, const ldns_zone *z)
2312238104Sdes{
2313238104Sdes	ldns_zone_print_fmt(output, ldns_output_format_default, z);
2314238104Sdes}
2315