installer - Several improvements
[dragonfly.git] / contrib / ldns / host2str.c
1 /*
2  * host2str.c
3  *
4  * conversion routines from the host format
5  * to the presentation format (strings)
6  *
7  * a Net::DNS like library for C
8  *
9  * (c) NLnet Labs, 2004-2006
10  *
11  * See the file LICENSE for the license
12  */
13 #include <ldns/config.h>
14
15 #include <ldns/ldns.h>
16
17 #include <limits.h>
18
19 #ifdef HAVE_SYS_SOCKET_H
20 #include <sys/socket.h>
21 #endif
22 #ifdef HAVE_ARPA_INET_H
23 #include <arpa/inet.h>
24 #endif
25 #ifdef HAVE_NETDB_H
26 #include <netdb.h>
27 #endif
28 #include <time.h>
29 #include <sys/time.h>
30
31 #ifndef INET_ADDRSTRLEN
32 #define INET_ADDRSTRLEN 16
33 #endif
34 #ifndef INET6_ADDRSTRLEN
35 #define INET6_ADDRSTRLEN 46
36 #endif
37
38 /* lookup tables for standard DNS stuff  */
39
40 /* Taken from RFC 2535, section 7.  */
41 ldns_lookup_table ldns_algorithms[] = {
42         { LDNS_RSAMD5, "RSAMD5" },
43         { LDNS_DH, "DH" },
44         { LDNS_DSA, "DSA" },
45         { LDNS_ECC, "ECC" },
46         { LDNS_RSASHA1, "RSASHA1" },
47         { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" },
48         { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" },
49 #ifdef USE_SHA2
50         { LDNS_RSASHA256, "RSASHA256"},
51         { LDNS_RSASHA512, "RSASHA512"},
52 #endif
53 #ifdef USE_GOST
54         { LDNS_ECC_GOST, "ECC-GOST"},
55 #endif
56 #ifdef USE_ECDSA
57         { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"},
58         { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"},
59 #endif
60         { LDNS_INDIRECT, "INDIRECT" },
61         { LDNS_PRIVATEDNS, "PRIVATEDNS" },
62         { LDNS_PRIVATEOID, "PRIVATEOID" },
63         { 0, NULL }
64 };
65
66 /* Taken from RFC 4398  */
67 ldns_lookup_table ldns_cert_algorithms[] = {
68         { LDNS_CERT_PKIX, "PKIX" },
69         { LDNS_CERT_SPKI, "SPKI" },
70         { LDNS_CERT_PGP, "PGP" },
71         { LDNS_CERT_IPKIX, "IPKIX" },
72         { LDNS_CERT_ISPKI, "ISPKI" },
73         { LDNS_CERT_IPGP, "IPGP" },
74         { LDNS_CERT_ACPKIX, "ACPKIX" },
75         { LDNS_CERT_IACPKIX, "IACPKIX" },
76         { LDNS_CERT_URI, "URI" },
77         { LDNS_CERT_OID, "OID" },
78         { 0, NULL }
79 };
80
81 /* classes  */
82 ldns_lookup_table ldns_rr_classes[] = {
83         { LDNS_RR_CLASS_IN, "IN" },
84         { LDNS_RR_CLASS_CH, "CH" },
85         { LDNS_RR_CLASS_HS, "HS" },
86         { LDNS_RR_CLASS_NONE, "NONE" },
87         { LDNS_RR_CLASS_ANY, "ANY" },
88         { 0, NULL }
89 };
90
91 /* if these are used elsewhere */
92 ldns_lookup_table ldns_rcodes[] = {
93         { LDNS_RCODE_NOERROR, "NOERROR" },
94         { LDNS_RCODE_FORMERR, "FORMERR" },
95         { LDNS_RCODE_SERVFAIL, "SERVFAIL" },
96         { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" },
97         { LDNS_RCODE_NOTIMPL, "NOTIMPL" },
98         { LDNS_RCODE_REFUSED, "REFUSED" },
99         { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" },
100         { LDNS_RCODE_YXRRSET, "YXRRSET" },
101         { LDNS_RCODE_NXRRSET, "NXRRSET" },
102         { LDNS_RCODE_NOTAUTH, "NOTAUTH" },
103         { LDNS_RCODE_NOTZONE, "NOTZONE" },
104         { 0, NULL }
105 };
106
107 ldns_lookup_table ldns_opcodes[] = {
108         { LDNS_PACKET_QUERY, "QUERY" },
109         { LDNS_PACKET_IQUERY, "IQUERY" },
110         { LDNS_PACKET_STATUS, "STATUS" },
111         { LDNS_PACKET_NOTIFY, "NOTIFY" },
112         { LDNS_PACKET_UPDATE, "UPDATE" },
113         { 0, NULL }
114 };
115
116 const ldns_output_format   ldns_output_format_nocomments_record = { 0, NULL };
117 const ldns_output_format  *ldns_output_format_nocomments 
118                         = &ldns_output_format_nocomments_record;
119 const ldns_output_format   ldns_output_format_onlykeyids_record = {
120         LDNS_COMMENT_KEY, NULL
121 };
122 const ldns_output_format  *ldns_output_format_onlykeyids
123                         = &ldns_output_format_onlykeyids_record;
124 const ldns_output_format  *ldns_output_format_default
125                         = &ldns_output_format_onlykeyids_record;
126
127 const ldns_output_format   ldns_output_format_bubblebabble_record = { 
128         LDNS_COMMENT_KEY | LDNS_COMMENT_BUBBLEBABBLE | LDNS_COMMENT_FLAGS, NULL
129 };
130 const ldns_output_format  *ldns_output_format_bubblebabble 
131                         = &ldns_output_format_bubblebabble_record;
132
133 ldns_status
134 ldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode)
135 {
136         ldns_lookup_table *lt = ldns_lookup_by_id(ldns_opcodes, opcode);
137         if (lt && lt->name) {
138                 ldns_buffer_printf(output, "%s", lt->name);
139         } else {
140                 ldns_buffer_printf(output, "OPCODE%u", opcode);
141         }
142         return ldns_buffer_status(output);
143 }
144
145 ldns_status
146 ldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode)
147 {
148         ldns_lookup_table *lt = ldns_lookup_by_id(ldns_rcodes, rcode);
149         if (lt && lt->name) {
150                 ldns_buffer_printf(output, "%s", lt->name);
151         } else {
152                 ldns_buffer_printf(output, "RCODE%u", rcode);
153         }
154         return ldns_buffer_status(output);
155 }
156
157 ldns_status
158 ldns_algorithm2buffer_str(ldns_buffer *output,
159                           ldns_algorithm algorithm)
160 {
161         ldns_lookup_table *lt = ldns_lookup_by_id(ldns_algorithms,
162                                                   algorithm);
163         if (lt && lt->name) {
164                 ldns_buffer_printf(output, "%s", lt->name);
165         } else {
166                 ldns_buffer_printf(output, "ALG%u", algorithm);
167         }
168         return ldns_buffer_status(output);
169 }
170
171 ldns_status
172 ldns_cert_algorithm2buffer_str(ldns_buffer *output,
173                                ldns_cert_algorithm cert_algorithm)
174 {
175         ldns_lookup_table *lt = ldns_lookup_by_id(ldns_cert_algorithms,
176                                                   cert_algorithm);
177         if (lt && lt->name) {
178                 ldns_buffer_printf(output, "%s", lt->name);
179         } else {
180                 ldns_buffer_printf(output, "CERT_ALG%u",
181                                    cert_algorithm);
182         }
183         return ldns_buffer_status(output);
184 }
185
186 char *
187 ldns_pkt_opcode2str(ldns_pkt_opcode opcode)
188 {
189         char *str;
190         ldns_buffer *buf;
191
192         buf = ldns_buffer_new(12);
193         if (!buf) {
194                 return NULL;
195         }
196
197         str = NULL;
198         if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) {
199                 str = ldns_buffer_export2str(buf);
200         }
201
202         ldns_buffer_free(buf);
203         return str;
204 }
205
206 char *
207 ldns_pkt_rcode2str(ldns_pkt_rcode rcode)
208 {
209         char *str;
210         ldns_buffer *buf;
211
212         buf = ldns_buffer_new(10);
213         if (!buf) {
214                 return NULL;
215         }
216
217         str = NULL;
218         if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) {
219                 str = ldns_buffer_export2str(buf);
220         }
221
222         ldns_buffer_free(buf);
223         return str;
224 }
225
226 char *
227 ldns_pkt_algorithm2str(ldns_algorithm algorithm)
228 {
229         char *str;
230         ldns_buffer *buf;
231
232         buf = ldns_buffer_new(10);
233         if (!buf) {
234                 return NULL;
235         }
236
237         str = NULL;
238         if (ldns_algorithm2buffer_str(buf, algorithm)
239             == LDNS_STATUS_OK) {
240                 str = ldns_buffer_export2str(buf);
241         }
242
243         ldns_buffer_free(buf);
244         return str;
245 }
246
247 char *
248 ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)
249 {
250         char *str;
251         ldns_buffer *buf;
252
253         buf = ldns_buffer_new(10);
254         if (!buf) {
255                 return NULL;
256         }
257
258         str = NULL;
259         if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm)
260             == LDNS_STATUS_OK) {
261                 str = ldns_buffer_export2str(buf);
262         }
263
264         ldns_buffer_free(buf);
265         return str;
266 }
267
268
269 /* do NOT pass compressed data here :p */
270 ldns_status
271 ldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname)
272 {
273         /* can we do with 1 pos var? or without at all? */
274         uint8_t src_pos = 0;
275         uint8_t len;
276         uint8_t *data;
277         uint8_t i;
278         unsigned char c;
279
280         data = (uint8_t*)ldns_rdf_data(dname);
281         len = data[src_pos];
282
283         if (ldns_rdf_size(dname) > LDNS_MAX_DOMAINLEN) {
284                 /* too large, return */
285                 return LDNS_STATUS_DOMAINNAME_OVERFLOW;
286         }
287
288         /* special case: root label */
289         if (1 == ldns_rdf_size(dname)) {
290                 ldns_buffer_printf(output, ".");
291         } else {
292                 while ((len > 0) && src_pos < ldns_rdf_size(dname)) {
293                         src_pos++;
294                         for(i = 0; i < len; i++) {
295                                 /* paranoia check for various 'strange'
296                                    characters in dnames
297                                 */
298                                 c = (unsigned char) data[src_pos];
299                                 if(c == '.' || c == ';' ||
300                                    c == '(' || c == ')' ||
301                                    c == '\\') {
302                                         ldns_buffer_printf(output, "\\%c",
303                                                         data[src_pos]);
304                                 } else if (!(isascii(c) && isgraph(c))) {
305                                         ldns_buffer_printf(output, "\\%03u",
306                                                         data[src_pos]);
307                                 } else {
308                                         ldns_buffer_printf(output, "%c", data[src_pos]);
309                                 }
310                                 src_pos++;
311                         }
312
313                         if (src_pos < ldns_rdf_size(dname)) {
314                                 ldns_buffer_printf(output, ".");
315                         }
316                         len = data[src_pos];
317                 }
318         }
319         return ldns_buffer_status(output);
320 }
321
322 ldns_status
323 ldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf)
324 {
325         uint8_t data = ldns_rdf_data(rdf)[0];
326         ldns_buffer_printf(output, "%lu", (unsigned long) data);
327         return ldns_buffer_status(output);
328 }
329
330 ldns_status
331 ldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf)
332 {
333         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
334         ldns_buffer_printf(output, "%lu", (unsigned long) data);
335         return ldns_buffer_status(output);
336 }
337
338 ldns_status
339 ldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf)
340 {
341         uint32_t data = ldns_read_uint32(ldns_rdf_data(rdf));
342         ldns_buffer_printf(output, "%lu", (unsigned long) data);
343         return ldns_buffer_status(output);
344 }
345
346 ldns_status
347 ldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf)
348 {
349         /* create a YYYYMMDDHHMMSS string if possible */
350         struct tm tm;
351         char date_buf[16];
352
353         memset(&tm, 0, sizeof(tm));
354         if (ldns_serial_arithmitics_gmtime_r(ldns_rdf2native_int32(rdf), time(NULL), &tm)
355             && strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) {
356                 ldns_buffer_printf(output, "%s", date_buf);
357         }
358         return ldns_buffer_status(output);
359 }
360
361 ldns_status
362 ldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf)
363 {
364         char str[INET_ADDRSTRLEN];
365
366         if (inet_ntop(AF_INET, ldns_rdf_data(rdf), str, INET_ADDRSTRLEN)) {
367                 ldns_buffer_printf(output, "%s", str);
368         }
369         return ldns_buffer_status(output);
370 }
371
372 ldns_status
373 ldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf)
374 {
375         char str[INET6_ADDRSTRLEN];
376
377         if (inet_ntop(AF_INET6, ldns_rdf_data(rdf), str, INET6_ADDRSTRLEN)) {
378                 ldns_buffer_printf(output, "%s", str);
379         }
380
381         return ldns_buffer_status(output);
382 }
383
384 ldns_status
385 ldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf)
386 {
387         const uint8_t *data = ldns_rdf_data(rdf);
388         uint8_t length = data[0];
389         size_t i;
390
391         ldns_buffer_printf(output, "\"");
392         for (i = 1; i <= length; ++i) {
393                 char ch = (char) data[i];
394                 if (isprint((int)ch) || ch=='\t') {
395                         if (ch=='\"'||ch=='\\')
396                                 ldns_buffer_printf(output, "\\%c", ch);
397                         else
398                                 ldns_buffer_printf(output, "%c", ch);
399                 } else {
400                         ldns_buffer_printf(output, "\\%03u",
401                                 (unsigned)(uint8_t) ch);
402                 }
403         }
404         ldns_buffer_printf(output, "\"");
405         return ldns_buffer_status(output);
406 }
407
408 ldns_status
409 ldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf)
410 {
411         size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf));
412         char *b64 = LDNS_XMALLOC(char, size);
413         if(!b64) return LDNS_STATUS_MEM_ERR;
414         if (ldns_b64_ntop(ldns_rdf_data(rdf), ldns_rdf_size(rdf), b64, size)) {
415                 ldns_buffer_printf(output, "%s", b64);
416         }
417         LDNS_FREE(b64);
418         return ldns_buffer_status(output);
419 }
420
421 ldns_status
422 ldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf)
423 {
424         size_t size;
425         char *b32;
426         if(ldns_rdf_size(rdf) == 0)
427                 return LDNS_STATUS_OK;
428         /* remove -1 for the b32-hash-len octet */
429         size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
430         /* add one for the end nul for the string */
431         b32 = LDNS_XMALLOC(char, size + 1);
432         if(!b32) return LDNS_STATUS_MEM_ERR;
433         size = (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
434                 ldns_rdf_size(rdf) - 1, b32, size+1);
435         if (size > 0) {
436                 ldns_buffer_printf(output, "%s", b32);
437         }
438         LDNS_FREE(b32);
439         return ldns_buffer_status(output);
440 }
441
442 ldns_status
443 ldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf)
444 {
445         size_t i;
446         for (i = 0; i < ldns_rdf_size(rdf); i++) {
447                 ldns_buffer_printf(output, "%02x", ldns_rdf_data(rdf)[i]);
448         }
449
450         return ldns_buffer_status(output);
451 }
452
453 ldns_status
454 ldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf)
455 {
456         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
457         const ldns_rr_descriptor *descriptor;
458
459         descriptor = ldns_rr_descript(data);
460         if (descriptor && descriptor->_name) {
461                 ldns_buffer_printf(output, "%s", descriptor->_name);
462         } else {
463                 ldns_buffer_printf(output, "TYPE%u", data);
464         }
465         return ldns_buffer_status(output);
466 }
467
468 ldns_status
469 ldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf)
470 {
471         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
472         ldns_lookup_table *lt;
473
474         lt = ldns_lookup_by_id(ldns_rr_classes, (int) data);
475         if (lt) {
476                 ldns_buffer_printf(output, "\t%s", lt->name);
477         } else {
478                 ldns_buffer_printf(output, "\tCLASS%d", data);
479         }
480         return ldns_buffer_status(output);
481 }
482
483 ldns_status
484 ldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf)
485 {
486         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
487         ldns_lookup_table *lt;
488         lt = ldns_lookup_by_id(ldns_cert_algorithms, (int) data);
489         if (lt) {
490                 ldns_buffer_printf(output, "%s", lt->name);
491         } else {
492                 ldns_buffer_printf(output, "%d", data);
493         }
494         return ldns_buffer_status(output);
495 }
496
497 ldns_status
498 ldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf)
499 {
500         /* don't use algorithm mnemonics in the presentation format
501            this kind of got sneaked into the rfc's */
502         uint8_t data = ldns_rdf_data(rdf)[0];
503                 ldns_buffer_printf(output, "%d", data);
504         return ldns_buffer_status(output);
505 }
506
507 static void
508 loc_cm_print(ldns_buffer *output, uint8_t mantissa, uint8_t exponent)
509 {
510         uint8_t i;
511         /* is it 0.<two digits> ? */
512         if(exponent < 2) {
513                 if(exponent == 1)
514                         mantissa *= 10;
515                 ldns_buffer_printf(output, "0.%02ld", (long)mantissa);
516                 return;
517         }
518         /* always <digit><string of zeros> */
519         ldns_buffer_printf(output, "%d", (int)mantissa);
520         for(i=0; i<exponent-2; i++)
521                 ldns_buffer_printf(output, "0");
522 }
523
524 ldns_status
525 ldns_rr_type2buffer_str(ldns_buffer *output, const ldns_rr_type type)
526 {
527         const ldns_rr_descriptor *descriptor;
528
529         descriptor = ldns_rr_descript(type);
530
531         if (descriptor && descriptor->_name) {
532                 ldns_buffer_printf(output, "%s", descriptor->_name);
533         } else {
534                 /* exceptions for pseudotypes */
535                 switch (type) {
536                         case LDNS_RR_TYPE_IXFR:
537                                 ldns_buffer_printf(output, "IXFR");
538                                 break;
539                         case LDNS_RR_TYPE_AXFR:
540                                 ldns_buffer_printf(output, "AXFR");
541                                 break;
542                         case LDNS_RR_TYPE_MAILA:
543                                 ldns_buffer_printf(output, "MAILA");
544                                 break;
545                         case LDNS_RR_TYPE_MAILB:
546                                 ldns_buffer_printf(output, "MAILB");
547                                 break;
548                         case LDNS_RR_TYPE_ANY:
549                                 ldns_buffer_printf(output, "ANY");
550                                 break;
551                         default:
552                                 ldns_buffer_printf(output, "TYPE%u", type);
553                 }
554         }
555         return ldns_buffer_status(output);
556 }
557
558 char *
559 ldns_rr_type2str(const ldns_rr_type type)
560 {
561         char *str;
562         ldns_buffer *buf;
563
564         buf = ldns_buffer_new(10);
565         if (!buf) {
566                 return NULL;
567         }
568
569         str = NULL;
570         if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) {
571                 str = ldns_buffer_export2str(buf);
572         }
573
574         ldns_buffer_free(buf);
575         return str;
576 }
577
578
579 ldns_status
580 ldns_rr_class2buffer_str(ldns_buffer *output,
581                          const ldns_rr_class klass)
582 {
583         ldns_lookup_table *lt;
584
585         lt = ldns_lookup_by_id(ldns_rr_classes, klass);
586         if (lt) {
587                 ldns_buffer_printf(output, "%s", lt->name);
588         } else {
589                 ldns_buffer_printf(output, "CLASS%d", klass);
590         }
591         return ldns_buffer_status(output);
592 }
593
594 char *
595 ldns_rr_class2str(const ldns_rr_class klass)
596 {
597         ldns_buffer *buf;
598         char *str;
599
600         buf = ldns_buffer_new(10);
601         if (!buf) {
602                 return NULL;
603         }
604
605         str = NULL;
606         if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) {
607                 str = ldns_buffer_export2str(buf);
608         }
609         ldns_buffer_free(buf);
610         return str;
611 }
612
613 ldns_status
614 ldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf)
615 {
616         /* we could do checking (ie degrees < 90 etc)? */
617         uint8_t version = ldns_rdf_data(rdf)[0];
618         uint8_t size;
619         uint8_t horizontal_precision;
620         uint8_t vertical_precision;
621         uint32_t longitude;
622         uint32_t latitude;
623         uint32_t altitude;
624         char northerness;
625         char easterness;
626         uint32_t h;
627         uint32_t m;
628         double s;
629
630         uint32_t equator = (uint32_t) ldns_power(2, 31);
631
632         if (version == 0) {
633                 size = ldns_rdf_data(rdf)[1];
634                 horizontal_precision = ldns_rdf_data(rdf)[2];
635                 vertical_precision = ldns_rdf_data(rdf)[3];
636
637                 latitude = ldns_read_uint32(&ldns_rdf_data(rdf)[4]);
638                 longitude = ldns_read_uint32(&ldns_rdf_data(rdf)[8]);
639                 altitude = ldns_read_uint32(&ldns_rdf_data(rdf)[12]);
640
641                 if (latitude > equator) {
642                         northerness = 'N';
643                         latitude = latitude - equator;
644                 } else {
645                         northerness = 'S';
646                         latitude = equator - latitude;
647                 }
648                 h = latitude / (1000 * 60 * 60);
649                 latitude = latitude % (1000 * 60 * 60);
650                 m = latitude / (1000 * 60);
651                 latitude = latitude % (1000 * 60);
652                 s = (double) latitude / 1000.0;
653                 ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
654                         h, m, s, northerness);
655
656                 if (longitude > equator) {
657                         easterness = 'E';
658                         longitude = longitude - equator;
659                 } else {
660                         easterness = 'W';
661                         longitude = equator - longitude;
662                 }
663                 h = longitude / (1000 * 60 * 60);
664                 longitude = longitude % (1000 * 60 * 60);
665                 m = longitude / (1000 * 60);
666                 longitude = longitude % (1000 * 60);
667                 s = (double) longitude / (1000.0);
668                 ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
669                         h, m, s, easterness);
670
671
672         s = ((double) altitude) / 100;
673         s -= 100000;
674
675                 if(altitude%100 != 0)
676                         ldns_buffer_printf(output, "%.2f", s);
677         else
678                         ldns_buffer_printf(output, "%.0f", s);
679
680                 ldns_buffer_printf(output, "m ");
681
682                 loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f);
683                 ldns_buffer_printf(output, "m ");
684
685                 loc_cm_print(output, (horizontal_precision & 0xf0) >> 4,
686                         horizontal_precision & 0x0f);
687                 ldns_buffer_printf(output, "m ");
688
689                 loc_cm_print(output, (vertical_precision & 0xf0) >> 4,
690                         vertical_precision & 0x0f);
691                 ldns_buffer_printf(output, "m");
692
693                 return ldns_buffer_status(output);
694         } else {
695                 return ldns_rdf2buffer_str_hex(output, rdf);
696         }
697 }
698
699 ldns_status
700 ldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf)
701 {
702         ldns_buffer_printf(output, "\\# %u ", ldns_rdf_size(rdf));
703         return ldns_rdf2buffer_str_hex(output, rdf);
704 }
705
706 ldns_status
707 ldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf)
708 {
709         ldns_buffer_printf(output, "0x");
710         return ldns_rdf2buffer_str_hex(output, rdf);
711 }
712
713 ldns_status
714 ldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf)
715 {
716         return ldns_rdf2buffer_str_hex(output, rdf);
717 }
718
719 ldns_status
720 ldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf)
721 {
722         /* protocol, followed by bitmap of services */
723         struct protoent *protocol;
724         char *proto_name = NULL;
725         uint8_t protocol_nr;
726         struct servent *service;
727         uint16_t current_service;
728
729         protocol_nr = ldns_rdf_data(rdf)[0];
730         protocol = getprotobynumber((int) protocol_nr);
731         if (protocol && (protocol->p_name != NULL)) {
732                 proto_name = protocol->p_name;
733                 ldns_buffer_printf(output, "%s ", protocol->p_name);
734         } else {
735                 ldns_buffer_printf(output, "%u ", protocol_nr);
736         }
737
738 #ifdef HAVE_ENDPROTOENT
739         endprotoent();
740 #endif
741
742         for (current_service = 0;
743              current_service < ldns_rdf_size(rdf) * 7; current_service++) {
744                 if (ldns_get_bit(&(ldns_rdf_data(rdf)[1]), current_service)) {
745                         service = getservbyport((int) htons(current_service),
746                                                 proto_name);
747                         if (service && service->s_name) {
748                                 ldns_buffer_printf(output, "%s ", service->s_name);
749                         } else {
750                                 ldns_buffer_printf(output, "%u ", current_service);
751                         }
752 #ifdef HAVE_ENDSERVENT
753                         endservent();
754 #endif
755                 }
756         }
757         return ldns_buffer_status(output);
758 }
759
760 ldns_status
761 ldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf)
762 {
763         /* Note: this code is duplicated in higher.c in
764          * ldns_nsec_type_check() function
765          */
766         uint8_t window_block_nr;
767         uint8_t bitmap_length;
768         uint16_t type;
769         uint16_t pos = 0;
770         uint16_t bit_pos;
771         uint8_t *data = ldns_rdf_data(rdf);
772         const ldns_rr_descriptor *descriptor;
773
774         while(pos < ldns_rdf_size(rdf)) {
775                 window_block_nr = data[pos];
776                 bitmap_length = data[pos + 1];
777                 pos += 2;
778
779                 for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) {
780                         if (ldns_get_bit(&data[pos], bit_pos)) {
781                                 type = 256 * (uint16_t) window_block_nr + bit_pos;
782                                 descriptor = ldns_rr_descript(type);
783
784                                 if (descriptor && descriptor->_name) {
785                                         ldns_buffer_printf(output, "%s ",
786                                                         descriptor->_name);
787                                 } else {
788                                         ldns_buffer_printf(output, "TYPE%u ", type);
789                                 }
790                         }
791                 }
792
793                 pos += (uint16_t) bitmap_length;
794         }
795
796         return ldns_buffer_status(output);
797 }
798
799 ldns_status
800 ldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf)
801 {
802         uint8_t salt_length;
803         uint8_t salt_pos;
804
805         uint8_t *data = ldns_rdf_data(rdf);
806
807         if(ldns_rdf_size(rdf) == 0) {
808                 output->_status = LDNS_STATUS_ERR;
809                 return ldns_buffer_status(output);
810         }
811         salt_length = data[0];
812         /* from now there are variable length entries so remember pos */
813         if (salt_length == 0 || ((size_t)salt_length)+1 > ldns_rdf_size(rdf)) {
814                 ldns_buffer_printf(output, "- ");
815         } else {
816                 for (salt_pos = 0; salt_pos < salt_length; salt_pos++) {
817                         ldns_buffer_printf(output, "%02x", data[1 + salt_pos]);
818                 }
819                 ldns_buffer_printf(output, " ");
820         }
821
822         return ldns_buffer_status(output);
823 }
824
825 ldns_status
826 ldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf)
827 {
828         /* period is the number of seconds */
829         uint32_t p = ldns_read_uint32(ldns_rdf_data(rdf));
830         ldns_buffer_printf(output, "%u", p);
831         return ldns_buffer_status(output);
832 }
833
834 ldns_status
835 ldns_rdf2buffer_str_tsigtime(ldns_buffer *output,const  ldns_rdf *rdf)
836 {
837         /* tsigtime is 48 bits network order unsigned integer */
838         uint64_t tsigtime = 0;
839         uint8_t *data = ldns_rdf_data(rdf);
840
841         if (ldns_rdf_size(rdf) != 6) {
842                 return LDNS_STATUS_ERR;
843         }
844
845         tsigtime = ldns_read_uint16(data);
846         tsigtime *= 65536;
847         tsigtime += ldns_read_uint16(data+2);
848         tsigtime *= 65536;
849
850         ldns_buffer_printf(output, "%llu ", tsigtime);
851
852         return ldns_buffer_status(output);
853 }
854
855 ldns_status
856 ldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf)
857 {
858         uint8_t *data = ldns_rdf_data(rdf);
859         uint16_t address_family;
860         uint8_t prefix;
861         bool negation;
862         uint8_t adf_length;
863         size_t i;
864         size_t pos = 0;
865
866         while (pos < (unsigned int) ldns_rdf_size(rdf)) {
867                 if(pos + 3 >= (unsigned)ldns_rdf_size(rdf))
868                         return LDNS_STATUS_SYNTAX_RDATA_ERR;
869                 address_family = ldns_read_uint16(&data[pos]);
870                 prefix = data[pos + 2];
871                 negation = data[pos + 3] & LDNS_APL_NEGATION;
872                 adf_length = data[pos + 3] & LDNS_APL_MASK;
873                 if (address_family == LDNS_APL_IP4) {
874                         /* check if prefix < 32? */
875                         if (negation) {
876                                 ldns_buffer_printf(output, "!");
877                         }
878                         ldns_buffer_printf(output, "%u:", address_family);
879                         /* address is variable length 0 - 4 */
880                         for (i = 0; i < 4; i++) {
881                                 if (i > 0) {
882                                         ldns_buffer_printf(output, ".");
883                                 }
884                                 if (i < (unsigned short) adf_length) {
885                                         if(pos+i+4 >= ldns_rdf_size(rdf))
886                                                 return LDNS_STATUS_SYNTAX_RDATA_ERR;
887                                         ldns_buffer_printf(output, "%d",
888                                                            data[pos + i + 4]);
889                                 } else {
890                                         ldns_buffer_printf(output, "0");
891                                 }
892                         }
893                         ldns_buffer_printf(output, "/%u ", prefix);
894                 } else if (address_family == LDNS_APL_IP6) {
895                         /* check if prefix < 128? */
896                         if (negation) {
897                                 ldns_buffer_printf(output, "!");
898                         }
899                         ldns_buffer_printf(output, "%u:", address_family);
900                         /* address is variable length 0 - 16 */
901                         for (i = 0; i < 16; i++) {
902                                 if (i % 2 == 0 && i > 0) {
903                                         ldns_buffer_printf(output, ":");
904                                 }
905                                 if (i < (unsigned short) adf_length) {
906                                         if(pos+i+4 >= ldns_rdf_size(rdf))
907                                                 return LDNS_STATUS_SYNTAX_RDATA_ERR;
908                                         ldns_buffer_printf(output, "%02x",
909                                                            data[pos + i + 4]);
910                                 } else {
911                                         ldns_buffer_printf(output, "00");
912                                 }
913                         }
914                         ldns_buffer_printf(output, "/%u ", prefix);
915
916                 } else {
917                         /* unknown address family */
918                         ldns_buffer_printf(output, "Unknown address family: %u data: ",
919                                         address_family);
920                         for (i = 1; i < (unsigned short) (4 + adf_length); i++) {
921                                 if(pos+i >= ldns_rdf_size(rdf))
922                                         return LDNS_STATUS_SYNTAX_RDATA_ERR;
923                                 ldns_buffer_printf(output, "%02x", data[i]);
924                         }
925                 }
926                 pos += 4 + adf_length;
927         }
928         return ldns_buffer_status(output);
929 }
930
931 ldns_status
932 ldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf)
933 {
934         /* Subtract the size (2) of the number that specifies the length */
935         size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf) - 2);
936         char *b64 = LDNS_XMALLOC(char, size);
937         if(!b64)
938                 return LDNS_STATUS_MEM_ERR;
939
940         ldns_buffer_printf(output, "%u ", ldns_rdf_size(rdf) - 2);
941
942         if (ldns_rdf_size(rdf) > 2 &&
943             ldns_b64_ntop(ldns_rdf_data(rdf) + 2,
944                                    ldns_rdf_size(rdf) - 2,
945                                    b64, size)) {
946                 ldns_buffer_printf(output, "%s", b64);
947         }
948         LDNS_FREE(b64);
949         return ldns_buffer_status(output);
950 }
951
952 ldns_status
953 ldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf)
954 {
955         /* wire format from
956            http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt
957         */
958         uint8_t *data = ldns_rdf_data(rdf);
959         uint8_t precedence;
960         uint8_t gateway_type;
961         uint8_t algorithm;
962
963         ldns_rdf *gateway = NULL;
964         uint8_t *gateway_data;
965
966         size_t public_key_size;
967         uint8_t *public_key_data;
968         ldns_rdf *public_key;
969
970         size_t offset = 0;
971         ldns_status status;
972
973         precedence = data[0];
974         gateway_type = data[1];
975         algorithm = data[2];
976         offset = 3;
977
978         switch (gateway_type) {
979                 case 0:
980                         /* no gateway */
981                         break;
982                 case 1:
983                         gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN);
984                         if(!gateway_data)
985                                 return LDNS_STATUS_MEM_ERR;
986                         memcpy(gateway_data, &data[offset], LDNS_IP4ADDRLEN);
987                         gateway = ldns_rdf_new(LDNS_RDF_TYPE_A, LDNS_IP4ADDRLEN , gateway_data);
988                         offset += LDNS_IP4ADDRLEN;
989                         if(!gateway) {
990                                 LDNS_FREE(gateway_data);
991                                 return LDNS_STATUS_MEM_ERR;
992                         }
993                         break;
994                 case 2:
995                         gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN);
996                         if(!gateway_data)
997                                 return LDNS_STATUS_MEM_ERR;
998                         memcpy(gateway_data, &data[offset], LDNS_IP6ADDRLEN);
999                         offset += LDNS_IP6ADDRLEN;
1000                         gateway =
1001                                 ldns_rdf_new(LDNS_RDF_TYPE_AAAA, LDNS_IP6ADDRLEN, gateway_data);
1002                         if(!gateway) {
1003                                 LDNS_FREE(gateway_data);
1004                                 return LDNS_STATUS_MEM_ERR;
1005                         }
1006                         break;
1007                 case 3:
1008                         status = ldns_wire2dname(&gateway, data, ldns_rdf_size(rdf), &offset);
1009                         if(status != LDNS_STATUS_OK)
1010                                 return status;
1011                         break;
1012                 default:
1013                         /* error? */
1014                         break;
1015         }
1016
1017         public_key_size = ldns_rdf_size(rdf) - offset;
1018         public_key_data = LDNS_XMALLOC(uint8_t, public_key_size);
1019         if(!public_key_data) {
1020                 ldns_rdf_free(gateway);
1021                 return LDNS_STATUS_MEM_ERR;
1022         }
1023         memcpy(public_key_data, &data[offset], public_key_size);
1024         public_key = ldns_rdf_new(LDNS_RDF_TYPE_B64, public_key_size, public_key_data);
1025         if(!public_key) {
1026                 LDNS_FREE(public_key_data);
1027                 ldns_rdf_free(gateway);
1028                 return LDNS_STATUS_MEM_ERR;
1029         }
1030
1031         ldns_buffer_printf(output, "%u %u %u ", precedence, gateway_type, algorithm);
1032     if (gateway)
1033                 (void) ldns_rdf2buffer_str(output, gateway);
1034         else
1035                 ldns_buffer_printf(output, ".");
1036         ldns_buffer_printf(output, " ");
1037         (void) ldns_rdf2buffer_str(output, public_key);
1038
1039         ldns_rdf_free(gateway);
1040         ldns_rdf_free(public_key);
1041
1042         return ldns_buffer_status(output);
1043 }
1044
1045 ldns_status
1046 ldns_rdf2buffer_str_tsig(ldns_buffer *output, const ldns_rdf *rdf)
1047 {
1048         /* TSIG RRs have no presentation format, make them #size <data> */
1049         return ldns_rdf2buffer_str_unknown(output, rdf);
1050 }
1051
1052
1053 ldns_status
1054 ldns_rdf2buffer_str(ldns_buffer *buffer, const ldns_rdf *rdf)
1055 {
1056         ldns_status res = LDNS_STATUS_OK;
1057
1058         /*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/
1059         if (rdf) {
1060                 switch(ldns_rdf_get_type(rdf)) {
1061                 case LDNS_RDF_TYPE_NONE:
1062                         break;
1063                 case LDNS_RDF_TYPE_DNAME:
1064                         res = ldns_rdf2buffer_str_dname(buffer, rdf);
1065                         break;
1066                 case LDNS_RDF_TYPE_INT8:
1067                         res = ldns_rdf2buffer_str_int8(buffer, rdf);
1068                         break;
1069                 case LDNS_RDF_TYPE_INT16:
1070                         res = ldns_rdf2buffer_str_int16(buffer, rdf);
1071                         break;
1072                 case LDNS_RDF_TYPE_INT32:
1073                         res = ldns_rdf2buffer_str_int32(buffer, rdf);
1074                         break;
1075                 case LDNS_RDF_TYPE_PERIOD:
1076                         res = ldns_rdf2buffer_str_period(buffer, rdf);
1077                         break;
1078                 case LDNS_RDF_TYPE_TSIGTIME:
1079                         res = ldns_rdf2buffer_str_tsigtime(buffer, rdf);
1080                         break;
1081                 case LDNS_RDF_TYPE_A:
1082                         res = ldns_rdf2buffer_str_a(buffer, rdf);
1083                         break;
1084                 case LDNS_RDF_TYPE_AAAA:
1085                         res = ldns_rdf2buffer_str_aaaa(buffer, rdf);
1086                         break;
1087                 case LDNS_RDF_TYPE_STR:
1088                         res = ldns_rdf2buffer_str_str(buffer, rdf);
1089                         break;
1090                 case LDNS_RDF_TYPE_APL:
1091                         res = ldns_rdf2buffer_str_apl(buffer, rdf);
1092                         break;
1093                 case LDNS_RDF_TYPE_B32_EXT:
1094                         res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1095                         break;
1096                 case LDNS_RDF_TYPE_B64:
1097                         res = ldns_rdf2buffer_str_b64(buffer, rdf);
1098                         break;
1099                 case LDNS_RDF_TYPE_HEX:
1100                         res = ldns_rdf2buffer_str_hex(buffer, rdf);
1101                         break;
1102                 case LDNS_RDF_TYPE_NSEC:
1103                         res = ldns_rdf2buffer_str_nsec(buffer, rdf);
1104                         break;
1105                 case LDNS_RDF_TYPE_NSEC3_SALT:
1106                         res = ldns_rdf2buffer_str_nsec3_salt(buffer, rdf);
1107                         break;
1108                 case LDNS_RDF_TYPE_TYPE:
1109                         res = ldns_rdf2buffer_str_type(buffer, rdf);
1110                         break;
1111                 case LDNS_RDF_TYPE_CLASS:
1112                         res = ldns_rdf2buffer_str_class(buffer, rdf);
1113                         break;
1114                 case LDNS_RDF_TYPE_CERT_ALG:
1115                         res = ldns_rdf2buffer_str_cert_alg(buffer, rdf);
1116                         break;
1117                 case LDNS_RDF_TYPE_ALG:
1118                         res = ldns_rdf2buffer_str_alg(buffer, rdf);
1119                         break;
1120                 case LDNS_RDF_TYPE_UNKNOWN:
1121                         res = ldns_rdf2buffer_str_unknown(buffer, rdf);
1122                         break;
1123                 case LDNS_RDF_TYPE_TIME:
1124                         res = ldns_rdf2buffer_str_time(buffer, rdf);
1125                         break;
1126                 case LDNS_RDF_TYPE_LOC:
1127                         res = ldns_rdf2buffer_str_loc(buffer, rdf);
1128                         break;
1129                 case LDNS_RDF_TYPE_WKS:
1130                 case LDNS_RDF_TYPE_SERVICE:
1131                         res = ldns_rdf2buffer_str_wks(buffer, rdf);
1132                         break;
1133                 case LDNS_RDF_TYPE_NSAP:
1134                         res = ldns_rdf2buffer_str_nsap(buffer, rdf);
1135                         break;
1136                 case LDNS_RDF_TYPE_ATMA:
1137                         res = ldns_rdf2buffer_str_atma(buffer, rdf);
1138                         break;
1139                 case LDNS_RDF_TYPE_IPSECKEY:
1140                         res = ldns_rdf2buffer_str_ipseckey(buffer, rdf);
1141                         break;
1142                 case LDNS_RDF_TYPE_TSIG:
1143                         res = ldns_rdf2buffer_str_tsig(buffer, rdf);
1144                         break;
1145                 case LDNS_RDF_TYPE_INT16_DATA:
1146                         res = ldns_rdf2buffer_str_int16_data(buffer, rdf);
1147                         break;
1148                 case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER:
1149                         res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1150                         break;
1151                 }
1152         } else {
1153                 /** This will write mangled RRs */
1154                 ldns_buffer_printf(buffer, "(null) ");
1155                 res = LDNS_STATUS_ERR;
1156         }
1157         return res;
1158 }
1159
1160 ldns_rdf *
1161 ldns_b32_ext2dname(const ldns_rdf *rdf)
1162 {
1163         size_t size;
1164         char *b32;
1165         ldns_rdf *out;
1166         if(ldns_rdf_size(rdf) == 0)
1167                 return NULL;
1168         /* remove -1 for the b32-hash-len octet */
1169         size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
1170         /* add one for the end nul for the string */
1171         b32 = LDNS_XMALLOC(char, size + 2);
1172         if (b32) {
1173                 if (ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1, 
1174                                 ldns_rdf_size(rdf) - 1, b32, size+1) > 0) {
1175                         b32[size] = '.';
1176                         b32[size+1] = '\0';
1177                         if (ldns_str2rdf_dname(&out, b32) == LDNS_STATUS_OK) {
1178                                 LDNS_FREE(b32);
1179                                 return out;
1180                         }
1181                 }
1182                 LDNS_FREE(b32);
1183         }
1184         return NULL;
1185 }
1186
1187 ldns_status
1188 ldns_rr2buffer_str_fmt(ldns_buffer *output, 
1189                 const ldns_output_format *fmt, const ldns_rr *rr)
1190 {
1191         uint16_t i, flags;
1192         ldns_status status = LDNS_STATUS_OK;
1193
1194         if (fmt == NULL) {
1195                 fmt = ldns_output_format_default;
1196         }
1197         if (!rr) {
1198                 if (LDNS_COMMENT_NULLS & fmt->flags) {
1199                         ldns_buffer_printf(output, "; (null)\n");
1200                 }
1201                 return ldns_buffer_status(output);
1202         }
1203         if (ldns_rr_owner(rr)) {
1204                 status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr));
1205         }
1206         if (status != LDNS_STATUS_OK) {
1207                 return status;
1208         }
1209
1210         /* TTL should NOT be printed if it is a question */
1211         if (!ldns_rr_is_question(rr)) {
1212                 ldns_buffer_printf(output, "\t%d", ldns_rr_ttl(rr));
1213         }
1214
1215         ldns_buffer_printf(output, "\t");
1216         status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr));
1217         if (status != LDNS_STATUS_OK) {
1218                 return status;
1219         }
1220         ldns_buffer_printf(output, "\t");
1221
1222         status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr));
1223         if (status != LDNS_STATUS_OK) {
1224                 return status;
1225         }
1226
1227         if (ldns_rr_rd_count(rr) > 0) {
1228                 ldns_buffer_printf(output, "\t");
1229         } else if (!ldns_rr_is_question(rr)) {
1230                 ldns_buffer_printf(output, "\t\\# 0");
1231         }
1232
1233         for (i = 0; i < ldns_rr_rd_count(rr); i++) {
1234                 /* ldns_rdf2buffer_str handles NULL input fine! */
1235                 if ((fmt->flags & LDNS_FMT_ZEROIZE_RRSIGS) &&
1236                                 (ldns_rr_get_type(rr) == LDNS_RR_TYPE_RRSIG) &&
1237                                 ((/* inception  */ i == 4 &&
1238                                   ldns_rdf_get_type(ldns_rr_rdf(rr, 4)) == 
1239                                                         LDNS_RDF_TYPE_TIME) ||
1240                                   (/* expiration */ i == 5 &&
1241                                    ldns_rdf_get_type(ldns_rr_rdf(rr, 5)) ==
1242                                                         LDNS_RDF_TYPE_TIME) ||
1243                                   (/* signature  */ i == 8 &&
1244                                    ldns_rdf_get_type(ldns_rr_rdf(rr, 8)) ==
1245                                                         LDNS_RDF_TYPE_B64))) {
1246
1247                         ldns_buffer_printf(output, "(null)");
1248                         status = ldns_buffer_status(output);
1249                 } else if ((fmt->flags & LDNS_FMT_PAD_SOA_SERIAL) &&
1250                                 (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) &&
1251                                 /* serial */ i == 2 &&
1252                                 ldns_rdf_get_type(ldns_rr_rdf(rr, 2)) ==
1253                                                         LDNS_RDF_TYPE_INT32) {
1254                         ldns_buffer_printf(output, "%10lu",
1255                                 (unsigned long) ldns_read_uint32(
1256                                         ldns_rdf_data(ldns_rr_rdf(rr, 2))));
1257                         status = ldns_buffer_status(output);
1258                 } else {
1259                         status = ldns_rdf2buffer_str(output,
1260                                         ldns_rr_rdf(rr, i));
1261                 }
1262                 if(status != LDNS_STATUS_OK)
1263                         return status;
1264                 if (i < ldns_rr_rd_count(rr) - 1) {
1265                         ldns_buffer_printf(output, " ");
1266                 }
1267         }
1268         /* per RR special comments - handy for DNSSEC types */
1269         /* check to prevent question sec. rr from
1270          * getting here */
1271         if (ldns_rr_rd_count(rr) > 0) {
1272                 switch (ldns_rr_get_type(rr)) {
1273                         case LDNS_RR_TYPE_DNSKEY:
1274                                 /* if ldns_rr_rd_count(rr) > 0
1275                                    then ldns_rr_rdf(rr, 0) exists! */
1276                                 if (! (fmt->flags & LDNS_COMMENT_KEY)) {
1277                                         break;
1278                                 }
1279                                 flags = ldns_rdf2native_int16(
1280                                                 ldns_rr_rdf(rr, 0));
1281                                 ldns_buffer_printf(output, " ;{");
1282                                 if (fmt->flags & LDNS_COMMENT_KEY_ID) {
1283                                         ldns_buffer_printf(output, "id = %u",
1284                                                         (unsigned int)
1285                                                         ldns_calc_keytag(rr));
1286                                 }
1287                                 if ((fmt->flags & LDNS_COMMENT_KEY_TYPE)
1288                                                 && (flags & LDNS_KEY_ZONE_KEY)){
1289                                         if (flags & LDNS_KEY_SEP_KEY) {
1290                                                 ldns_buffer_printf(
1291                                                         output, " (ksk)");
1292                                         }
1293                                         else {
1294                                                 ldns_buffer_printf(
1295                                                         output, " (zsk)");
1296                                         }
1297                                         if (fmt->flags & LDNS_COMMENT_KEY_SIZE){
1298                                                 ldns_buffer_printf(
1299                                                         output, ", ");
1300                                         }
1301                                 } else if (fmt->flags
1302                                                 & (LDNS_COMMENT_KEY_ID
1303                                                   |LDNS_COMMENT_KEY_SIZE)) {
1304                                         ldns_buffer_printf( output, ", ");
1305                                 }
1306                                 if (fmt->flags & LDNS_COMMENT_KEY_SIZE) {
1307                                         ldns_buffer_printf(output, "size = %db",
1308                                                 ldns_rr_dnskey_key_size(rr));
1309                                 }
1310                                 ldns_buffer_printf(output, "}");
1311                                 break;
1312                         case LDNS_RR_TYPE_RRSIG:
1313                                 if ((fmt->flags & LDNS_COMMENT_KEY)
1314                                                 && (fmt->flags 
1315                                                         & LDNS_COMMENT_RRSIGS)
1316                                                 && ldns_rr_rdf(rr, 6) != NULL) {
1317                                         ldns_buffer_printf(output
1318                                                 , " ;{id = %d}"
1319                                                 , ldns_rdf2native_int16(
1320                                                         ldns_rr_rdf(rr, 6)));
1321                                 }
1322                                 break;
1323                         case LDNS_RR_TYPE_DS:
1324                                 if ((fmt->flags & LDNS_COMMENT_BUBBLEBABBLE)
1325                                                 && ldns_rr_rdf(rr, 3) != NULL) {
1326                                         uint8_t *data = ldns_rdf_data(
1327                                                         ldns_rr_rdf(rr, 3));
1328                                         size_t len = ldns_rdf_size(
1329                                                         ldns_rr_rdf(rr, 3));
1330                                         char *babble = ldns_bubblebabble(
1331                                                         data, len);
1332                                         if(babble) {
1333                                                 ldns_buffer_printf(output
1334                                                         , " ;{%s}", babble);
1335                                         }
1336                                         LDNS_FREE(babble);
1337                                 }
1338                                 break;
1339                         case LDNS_RR_TYPE_NSEC3:
1340                                 if (! (fmt->flags & LDNS_COMMENT_FLAGS) &&
1341                                     ! (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN)) {
1342                                         break;
1343                                 }
1344                                 ldns_buffer_printf(output, " ;{");
1345                                 if ((fmt->flags & LDNS_COMMENT_FLAGS)) {
1346                                         if (ldns_nsec3_optout(rr)) {
1347                                                 ldns_buffer_printf(output,
1348                                                         " flags: optout");
1349                                         } else {
1350                                                 ldns_buffer_printf(output,
1351                                                         " flags: -");
1352                                         }
1353                                         if (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN
1354                                                         && fmt->data != NULL) {
1355                                                 ldns_buffer_printf(output, ", ");
1356                                         }
1357                                 }
1358                                 if (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN
1359                                                 && fmt->data != NULL) {
1360                                         ldns_rbnode_t *node;
1361                                         ldns_rdf *key = ldns_dname_label(
1362                                                         ldns_rr_owner(rr), 0);
1363                                         if (key) {
1364                                                 node = ldns_rbtree_search(
1365                                                         (ldns_rbtree_t *)
1366                                                                 fmt->data,
1367                                                         (void *) key);
1368                                                 if (node->data) {
1369                                                         ldns_buffer_printf(
1370                                                                 output,
1371                                                                 "from: ");
1372                                                         (void)
1373                                                         ldns_rdf2buffer_str(
1374                                                                 output, 
1375                                                                 (ldns_rdf *)
1376                                                                 node->data);
1377                                                 }
1378                                                 ldns_rdf_free(key);
1379                                         }
1380                                         key = ldns_b32_ext2dname(
1381                                                 ldns_nsec3_next_owner(rr));
1382                                         if (key) {
1383                                                 node = ldns_rbtree_search(
1384                                                         (ldns_rbtree_t *)
1385                                                                 fmt->data,
1386                                                         (void *) key);
1387                                                 if (node->data) {
1388                                                         ldns_buffer_printf(
1389                                                                 output,
1390                                                                 " to: ");
1391                                                         (void)
1392                                                         ldns_rdf2buffer_str(
1393                                                                 output, 
1394                                                                 (ldns_rdf *)
1395                                                                 node->data);
1396                                                 }
1397                                                 ldns_rdf_free(key);
1398                                         }
1399                                 }
1400                                 ldns_buffer_printf(output, "}");
1401                                 break;
1402                         default:
1403                                 break;
1404
1405                 }
1406         }
1407         /* last */
1408         ldns_buffer_printf(output, "\n");
1409         return ldns_buffer_status(output);
1410 }
1411
1412 ldns_status
1413 ldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr)
1414 {
1415         return ldns_rr2buffer_str_fmt(output, ldns_output_format_default, rr);
1416 }
1417
1418 ldns_status
1419 ldns_rr_list2buffer_str_fmt(ldns_buffer *output, 
1420                 const ldns_output_format *fmt, const ldns_rr_list *list)
1421 {
1422         uint16_t i;
1423
1424         for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
1425                 (void) ldns_rr2buffer_str_fmt(output, fmt, 
1426                                 ldns_rr_list_rr(list, i));
1427         }
1428         return ldns_buffer_status(output);
1429 }
1430
1431 ldns_status
1432 ldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list)
1433 {
1434         return ldns_rr_list2buffer_str_fmt(
1435                         output, ldns_output_format_default, list);
1436 }
1437
1438 ldns_status
1439 ldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
1440 {
1441         ldns_lookup_table *opcode = ldns_lookup_by_id(ldns_opcodes,
1442                                             (int) ldns_pkt_get_opcode(pkt));
1443         ldns_lookup_table *rcode = ldns_lookup_by_id(ldns_rcodes,
1444                                             (int) ldns_pkt_get_rcode(pkt));
1445
1446         ldns_buffer_printf(output, ";; ->>HEADER<<- ");
1447         if (opcode) {
1448                 ldns_buffer_printf(output, "opcode: %s, ", opcode->name);
1449         } else {
1450                 ldns_buffer_printf(output, "opcode: ?? (%u), ",
1451                                 ldns_pkt_get_opcode(pkt));
1452         }
1453         if (rcode) {
1454                 ldns_buffer_printf(output, "rcode: %s, ", rcode->name);
1455         } else {
1456                 ldns_buffer_printf(output, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt));
1457         }
1458         ldns_buffer_printf(output, "id: %d\n", ldns_pkt_id(pkt));
1459         ldns_buffer_printf(output, ";; flags: ");
1460
1461         if (ldns_pkt_qr(pkt)) {
1462                 ldns_buffer_printf(output, "qr ");
1463         }
1464         if (ldns_pkt_aa(pkt)) {
1465                 ldns_buffer_printf(output, "aa ");
1466         }
1467         if (ldns_pkt_tc(pkt)) {
1468                 ldns_buffer_printf(output, "tc ");
1469         }
1470         if (ldns_pkt_rd(pkt)) {
1471                 ldns_buffer_printf(output, "rd ");
1472         }
1473         if (ldns_pkt_cd(pkt)) {
1474                 ldns_buffer_printf(output, "cd ");
1475         }
1476         if (ldns_pkt_ra(pkt)) {
1477                 ldns_buffer_printf(output, "ra ");
1478         }
1479         if (ldns_pkt_ad(pkt)) {
1480                 ldns_buffer_printf(output, "ad ");
1481         }
1482         ldns_buffer_printf(output, "; ");
1483         ldns_buffer_printf(output, "QUERY: %u, ", ldns_pkt_qdcount(pkt));
1484         ldns_buffer_printf(output, "ANSWER: %u, ", ldns_pkt_ancount(pkt));
1485         ldns_buffer_printf(output, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt));
1486         ldns_buffer_printf(output, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt));
1487         return ldns_buffer_status(output);
1488 }
1489
1490 ldns_status
1491 ldns_pkt2buffer_str_fmt(ldns_buffer *output, 
1492                 const ldns_output_format *fmt, const ldns_pkt *pkt)
1493 {
1494         uint16_t i;
1495         ldns_status status = LDNS_STATUS_OK;
1496         char *tmp;
1497         struct timeval time;
1498         time_t time_tt;
1499
1500         if (!pkt) {
1501                 ldns_buffer_printf(output, "null");
1502                 return LDNS_STATUS_OK;
1503         }
1504
1505         if (ldns_buffer_status_ok(output)) {
1506                 status = ldns_pktheader2buffer_str(output, pkt);
1507                 if (status != LDNS_STATUS_OK) {
1508                         return status;
1509                 }
1510
1511                 ldns_buffer_printf(output, "\n");
1512
1513                 ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; ");
1514
1515
1516                 for (i = 0; i < ldns_pkt_qdcount(pkt); i++) {
1517                         status = ldns_rr2buffer_str_fmt(output, fmt,
1518                                        ldns_rr_list_rr(
1519                                                ldns_pkt_question(pkt), i));
1520                         if (status != LDNS_STATUS_OK) {
1521                                 return status;
1522                         }
1523                 }
1524                 ldns_buffer_printf(output, "\n");
1525
1526                 ldns_buffer_printf(output, ";; ANSWER SECTION:\n");
1527                 for (i = 0; i < ldns_pkt_ancount(pkt); i++) {
1528                         status = ldns_rr2buffer_str_fmt(output, fmt,
1529                                        ldns_rr_list_rr(
1530                                                ldns_pkt_answer(pkt), i));
1531                         if (status != LDNS_STATUS_OK) {
1532                                 return status;
1533                         }
1534
1535                 }
1536                 ldns_buffer_printf(output, "\n");
1537
1538                 ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n");
1539
1540                 for (i = 0; i < ldns_pkt_nscount(pkt); i++) {
1541                         status = ldns_rr2buffer_str_fmt(output, fmt,
1542                                        ldns_rr_list_rr(
1543                                                ldns_pkt_authority(pkt), i));
1544                         if (status != LDNS_STATUS_OK) {
1545                                 return status;
1546                         }
1547                 }
1548                 ldns_buffer_printf(output, "\n");
1549
1550                 ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n");
1551                 for (i = 0; i < ldns_pkt_arcount(pkt); i++) {
1552                         status = ldns_rr2buffer_str_fmt(output, fmt,
1553                                        ldns_rr_list_rr(
1554                                                ldns_pkt_additional(pkt), i));
1555                         if (status != LDNS_STATUS_OK) {
1556                                 return status;
1557                         }
1558
1559                 }
1560                 ldns_buffer_printf(output, "\n");
1561                 /* add some futher fields */
1562                 ldns_buffer_printf(output, ";; Query time: %d msec\n",
1563                                 ldns_pkt_querytime(pkt));
1564                 if (ldns_pkt_edns(pkt)) {
1565                         ldns_buffer_printf(output,
1566                                    ";; EDNS: version %u; flags:",
1567                                    ldns_pkt_edns_version(pkt));
1568                         if (ldns_pkt_edns_do(pkt)) {
1569                                 ldns_buffer_printf(output, " do");
1570                         }
1571                         /* the extended rcode is the value set, shifted four bits,
1572                          * and or'd with the original rcode */
1573                         if (ldns_pkt_edns_extended_rcode(pkt)) {
1574                                 ldns_buffer_printf(output, " ; ext-rcode: %d",
1575                                         (ldns_pkt_edns_extended_rcode(pkt) << 4 | ldns_pkt_get_rcode(pkt)));
1576                         }
1577                         ldns_buffer_printf(output, " ; udp: %u\n",
1578                                            ldns_pkt_edns_udp_size(pkt));
1579
1580                         if (ldns_pkt_edns_data(pkt)) {
1581                                 ldns_buffer_printf(output, ";; Data: ");
1582                                 (void)ldns_rdf2buffer_str(output,
1583                                                           ldns_pkt_edns_data(pkt));
1584                                 ldns_buffer_printf(output, "\n");
1585                         }
1586                 }
1587                 if (ldns_pkt_tsig(pkt)) {
1588                         ldns_buffer_printf(output, ";; TSIG:\n;; ");
1589                         (void) ldns_rr2buffer_str_fmt(
1590                                         output, fmt, ldns_pkt_tsig(pkt));
1591                         ldns_buffer_printf(output, "\n");
1592                 }
1593                 if (ldns_pkt_answerfrom(pkt)) {
1594                         tmp = ldns_rdf2str(ldns_pkt_answerfrom(pkt));
1595                         ldns_buffer_printf(output, ";; SERVER: %s\n", tmp);
1596                         LDNS_FREE(tmp);
1597                 }
1598                 time = ldns_pkt_timestamp(pkt);
1599                 time_tt = (time_t)time.tv_sec;
1600                 ldns_buffer_printf(output, ";; WHEN: %s",
1601                                 (char*)ctime(&time_tt));
1602
1603                 ldns_buffer_printf(output, ";; MSG SIZE  rcvd: %d\n",
1604                                 (int)ldns_pkt_size(pkt));
1605         } else {
1606                 return ldns_buffer_status(output);
1607         }
1608         return status;
1609 }
1610
1611 ldns_status
1612 ldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
1613 {
1614         return ldns_pkt2buffer_str_fmt(output, ldns_output_format_default, pkt);
1615 }
1616
1617
1618 #ifdef HAVE_SSL
1619 static ldns_status
1620 ldns_hmac_key2buffer_str(ldns_buffer *output, const ldns_key *k)
1621 {
1622         ldns_status status;
1623         size_t i;
1624         ldns_rdf *b64_bignum;
1625
1626         ldns_buffer_printf(output, "Key: ");
1627
1628         i = ldns_key_hmac_size(k);
1629         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, ldns_key_hmac_key(k));
1630         status = ldns_rdf2buffer_str(output, b64_bignum);
1631         ldns_rdf_deep_free(b64_bignum);
1632         ldns_buffer_printf(output, "\n");
1633         return status;
1634 }
1635 #endif
1636
1637 #if defined(HAVE_SSL) && defined(USE_GOST)
1638 static ldns_status
1639 ldns_gost_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
1640 {
1641         unsigned char* pp = NULL;
1642         int ret;
1643         ldns_rdf *b64_bignum;
1644         ldns_status status;
1645
1646         ldns_buffer_printf(output, "GostAsn1: ");
1647
1648         ret = i2d_PrivateKey(p, &pp);
1649         b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)ret, pp);
1650         status = ldns_rdf2buffer_str(output, b64_bignum);
1651
1652         ldns_rdf_deep_free(b64_bignum);
1653         OPENSSL_free(pp);
1654         ldns_buffer_printf(output, "\n");
1655         return status;
1656 }
1657 #endif
1658
1659 ldns_status
1660 ldns_key2buffer_str(ldns_buffer *output, const ldns_key *k)
1661 {
1662         ldns_status status = LDNS_STATUS_OK;
1663         unsigned char  *bignum;
1664 #ifdef HAVE_SSL
1665 #  ifndef S_SPLINT_S
1666         uint16_t i;
1667 #  endif
1668         /* not used when ssl is not defined */
1669         /*@unused@*/
1670         ldns_rdf *b64_bignum = NULL;
1671
1672         RSA *rsa;
1673         DSA *dsa;
1674 #endif /* HAVE_SSL */
1675
1676         if (!k) {
1677                 return LDNS_STATUS_ERR;
1678         }
1679
1680         bignum = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN);
1681         if (!bignum) {
1682                 return LDNS_STATUS_ERR;
1683         }
1684
1685         if (ldns_buffer_status_ok(output)) {
1686 #ifdef HAVE_SSL
1687                 switch(ldns_key_algorithm(k)) {
1688                         case LDNS_SIGN_RSASHA1:
1689                         case LDNS_SIGN_RSASHA1_NSEC3:
1690                         case LDNS_SIGN_RSASHA256:
1691                         case LDNS_SIGN_RSASHA512:
1692                         case LDNS_SIGN_RSAMD5:
1693                                 /* copied by looking at dnssec-keygen output */
1694                                 /* header */
1695                                 rsa = ldns_key_rsa_key(k);
1696
1697                                 ldns_buffer_printf(output,"Private-key-format: v1.2\n");
1698                                 switch(ldns_key_algorithm(k)) {
1699                                 case LDNS_SIGN_RSAMD5:
1700                                         ldns_buffer_printf(output,
1701                                                                     "Algorithm: %u (RSA)\n",
1702                                                                     LDNS_RSAMD5);
1703                                         break;
1704                                 case LDNS_SIGN_RSASHA1:
1705                                         ldns_buffer_printf(output,
1706                                                                     "Algorithm: %u (RSASHA1)\n",
1707                                                                     LDNS_RSASHA1);
1708                                         break;
1709                                 case LDNS_SIGN_RSASHA1_NSEC3:
1710                                         ldns_buffer_printf(output,
1711                                                                     "Algorithm: %u (RSASHA1_NSEC3)\n",
1712                                                                     LDNS_RSASHA1_NSEC3);
1713                                         break;
1714 #ifdef USE_SHA2
1715                                 case LDNS_SIGN_RSASHA256:
1716                                         ldns_buffer_printf(output,
1717                                                                     "Algorithm: %u (RSASHA256)\n",
1718                                                                     LDNS_RSASHA256);
1719                                         break;
1720                                 case LDNS_SIGN_RSASHA512:
1721                                         ldns_buffer_printf(output,
1722                                                                     "Algorithm: %u (RSASHA512)\n",
1723                                                                     LDNS_RSASHA512);
1724                                         break;
1725 #endif
1726                                 default:
1727                                         fprintf(stderr, "Warning: unknown signature ");
1728                                         fprintf(stderr,
1729                                                    "algorithm type %u\n",
1730                                                    ldns_key_algorithm(k));
1731                                         ldns_buffer_printf(output,
1732                                                                     "Algorithm: %u (Unknown)\n",
1733                                                                     ldns_key_algorithm(k));
1734                                         break;
1735                                 }
1736
1737                                 /* print to buf, convert to bin, convert to b64,
1738                                  * print to buf */
1739                                 ldns_buffer_printf(output, "Modulus: ");
1740 #ifndef S_SPLINT_S
1741                                 i = (uint16_t)BN_bn2bin(rsa->n, bignum);
1742                                 if (i > LDNS_MAX_KEYLEN) {
1743                                         goto error;
1744                                 }
1745                                 b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1746                                 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1747                                         ldns_rdf_deep_free(b64_bignum);
1748                                         goto error;
1749                                 }
1750                                 ldns_rdf_deep_free(b64_bignum);
1751                                 ldns_buffer_printf(output, "\n");
1752                                 ldns_buffer_printf(output, "PublicExponent: ");
1753                                 i = (uint16_t)BN_bn2bin(rsa->e, bignum);
1754                                 if (i > LDNS_MAX_KEYLEN) {
1755                                         goto error;
1756                                 }
1757                                 b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1758                                 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1759                                         ldns_rdf_deep_free(b64_bignum);
1760                                         goto error;
1761                                 }
1762                                 ldns_rdf_deep_free(b64_bignum);
1763                                 ldns_buffer_printf(output, "\n");
1764
1765                                 ldns_buffer_printf(output, "PrivateExponent: ");
1766                                 if (rsa->d) {
1767                                         i = (uint16_t)BN_bn2bin(rsa->d, bignum);
1768                                         if (i > LDNS_MAX_KEYLEN) {
1769                                                 goto error;
1770                                         }
1771                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1772                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1773                                                 ldns_rdf_deep_free(b64_bignum);
1774                                                 goto error;
1775                                         }
1776                                         ldns_rdf_deep_free(b64_bignum);
1777                                         ldns_buffer_printf(output, "\n");
1778                                 } else {
1779                                         ldns_buffer_printf(output, "(Not available)\n");
1780                                 }
1781
1782                                 ldns_buffer_printf(output, "Prime1: ");
1783                                 if (rsa->p) {
1784                                         i = (uint16_t)BN_bn2bin(rsa->p, bignum);
1785                                         if (i > LDNS_MAX_KEYLEN) {
1786                                                 goto error;
1787                                         }
1788                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1789                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1790                                                 ldns_rdf_deep_free(b64_bignum);
1791                                                 goto error;
1792                                         }
1793                                         ldns_rdf_deep_free(b64_bignum);
1794                                         ldns_buffer_printf(output, "\n");
1795                                 } else {
1796                                         ldns_buffer_printf(output, "(Not available)\n");
1797                                 }
1798
1799                                 ldns_buffer_printf(output, "Prime2: ");
1800                                 if (rsa->q) {
1801                                         i = (uint16_t)BN_bn2bin(rsa->q, bignum);
1802                                         if (i > LDNS_MAX_KEYLEN) {
1803                                                 goto error;
1804                                         }
1805                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1806                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1807                                                 ldns_rdf_deep_free(b64_bignum);
1808                                                 goto error;
1809                                         }
1810                                         ldns_rdf_deep_free(b64_bignum);
1811                                         ldns_buffer_printf(output, "\n");
1812                                 } else {
1813                                         ldns_buffer_printf(output, "(Not available)\n");
1814                                 }
1815
1816                                 ldns_buffer_printf(output, "Exponent1: ");
1817                                 if (rsa->dmp1) {
1818                                         i = (uint16_t)BN_bn2bin(rsa->dmp1, bignum);
1819                                         if (i > LDNS_MAX_KEYLEN) {
1820                                                 goto error;
1821                                         }
1822                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1823                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1824                                                 ldns_rdf_deep_free(b64_bignum);
1825                                                 goto error;
1826                                         }
1827                                         ldns_rdf_deep_free(b64_bignum);
1828                                         ldns_buffer_printf(output, "\n");
1829                                 } else {
1830                                         ldns_buffer_printf(output, "(Not available)\n");
1831                                 }
1832
1833                                 ldns_buffer_printf(output, "Exponent2: ");
1834                                 if (rsa->dmq1) {
1835                                         i = (uint16_t)BN_bn2bin(rsa->dmq1, bignum);
1836                                         if (i > LDNS_MAX_KEYLEN) {
1837                                                 goto error;
1838                                         }
1839                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1840                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1841                                                 ldns_rdf_deep_free(b64_bignum);
1842                                                 goto error;
1843                                         }
1844                                         ldns_rdf_deep_free(b64_bignum);
1845                                         ldns_buffer_printf(output, "\n");
1846                                 } else {
1847                                         ldns_buffer_printf(output, "(Not available)\n");
1848                                 }
1849
1850                                 ldns_buffer_printf(output, "Coefficient: ");
1851                                 if (rsa->iqmp) {
1852                                         i = (uint16_t)BN_bn2bin(rsa->iqmp, bignum);
1853                                         if (i > LDNS_MAX_KEYLEN) {
1854                                                 goto error;
1855                                         }
1856                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1857                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1858                                                 ldns_rdf_deep_free(b64_bignum);
1859                                                 goto error;
1860                                         }
1861                                         ldns_rdf_deep_free(b64_bignum);
1862                                         ldns_buffer_printf(output, "\n");
1863                                 } else {
1864                                         ldns_buffer_printf(output, "(Not available)\n");
1865                                 }
1866 #endif /* splint */
1867
1868                                 RSA_free(rsa);
1869                                 break;
1870                         case LDNS_SIGN_DSA:
1871                         case LDNS_SIGN_DSA_NSEC3:
1872                                 dsa = ldns_key_dsa_key(k);
1873
1874                                 ldns_buffer_printf(output,"Private-key-format: v1.2\n");
1875                                 if (ldns_key_algorithm(k) == LDNS_SIGN_DSA) {
1876                                         ldns_buffer_printf(output,"Algorithm: 3 (DSA)\n");
1877                                 } else if (ldns_key_algorithm(k) == LDNS_SIGN_DSA_NSEC3) {
1878                                         ldns_buffer_printf(output,"Algorithm: 6 (DSA_NSEC3)\n");
1879                                 }
1880
1881                                 /* print to buf, convert to bin, convert to b64,
1882                                  * print to buf */
1883                                 ldns_buffer_printf(output, "Prime(p): ");
1884 #ifndef S_SPLINT_S
1885                                 if (dsa->p) {
1886                                         i = (uint16_t)BN_bn2bin(dsa->p, bignum);
1887                                         if (i > LDNS_MAX_KEYLEN) {
1888                                                 goto error;
1889                                         }
1890                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1891                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1892                                                 ldns_rdf_deep_free(b64_bignum);
1893                                                 goto error;
1894                                         }
1895                                         ldns_rdf_deep_free(b64_bignum);
1896                                         ldns_buffer_printf(output, "\n");
1897                                 } else {
1898                                         printf("(Not available)\n");
1899                                 }
1900
1901                                 ldns_buffer_printf(output, "Subprime(q): ");
1902                                 if (dsa->q) {
1903                                         i = (uint16_t)BN_bn2bin(dsa->q, bignum);
1904                                         if (i > LDNS_MAX_KEYLEN) {
1905                                                 goto error;
1906                                         }
1907                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1908                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1909                                                 ldns_rdf_deep_free(b64_bignum);
1910                                                 goto error;
1911                                         }
1912                                         ldns_rdf_deep_free(b64_bignum);
1913                                         ldns_buffer_printf(output, "\n");
1914                                 } else {
1915                                         printf("(Not available)\n");
1916                                 }
1917
1918                                 ldns_buffer_printf(output, "Base(g): ");
1919                                 if (dsa->g) {
1920                                         i = (uint16_t)BN_bn2bin(dsa->g, bignum);
1921                                         if (i > LDNS_MAX_KEYLEN) {
1922                                                 goto error;
1923                                         }
1924                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1925                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1926                                                 ldns_rdf_deep_free(b64_bignum);
1927                                                 goto error;
1928                                         }
1929                                         ldns_rdf_deep_free(b64_bignum);
1930                                         ldns_buffer_printf(output, "\n");
1931                                 } else {
1932                                         printf("(Not available)\n");
1933                                 }
1934
1935                                 ldns_buffer_printf(output, "Private_value(x): ");
1936                                 if (dsa->priv_key) {
1937                                         i = (uint16_t)BN_bn2bin(dsa->priv_key, bignum);
1938                                         if (i > LDNS_MAX_KEYLEN) {
1939                                                 goto error;
1940                                         }
1941                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1942                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1943                                                 ldns_rdf_deep_free(b64_bignum);
1944                                                 goto error;
1945                                         }
1946                                         ldns_rdf_deep_free(b64_bignum);
1947                                         ldns_buffer_printf(output, "\n");
1948                                 } else {
1949                                         printf("(Not available)\n");
1950                                 }
1951
1952                                 ldns_buffer_printf(output, "Public_value(y): ");
1953                                 if (dsa->pub_key) {
1954                                         i = (uint16_t)BN_bn2bin(dsa->pub_key, bignum);
1955                                         if (i > LDNS_MAX_KEYLEN) {
1956                                                 goto error;
1957                                         }
1958                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1959                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1960                                                 ldns_rdf_deep_free(b64_bignum);
1961                                                 goto error;
1962                                         }
1963                                         ldns_rdf_deep_free(b64_bignum);
1964                                         ldns_buffer_printf(output, "\n");
1965                                 } else {
1966                                         printf("(Not available)\n");
1967                                 }
1968 #endif /* splint */
1969                                 break;
1970                         case LDNS_SIGN_ECC_GOST:
1971                                 /* no format defined, use blob */
1972 #if defined(HAVE_SSL) && defined(USE_GOST)
1973                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1974                                 ldns_buffer_printf(output, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST);
1975                                 status = ldns_gost_key2buffer_str(output, 
1976 #ifndef S_SPLINT_S
1977                                         k->_key.key
1978 #else
1979                                         NULL
1980 #endif
1981                                 );
1982 #else
1983                                 goto error;
1984 #endif /* GOST */
1985                                 break;
1986                         case LDNS_SIGN_ECDSAP256SHA256:
1987                         case LDNS_SIGN_ECDSAP384SHA384:
1988 #ifdef USE_ECDSA
1989                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1990                                 ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
1991                                 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
1992 #ifndef S_SPLINT_S
1993                                 ldns_buffer_printf(output, ")\n");
1994                                 if(k->_key.key) {
1995                                         EC_KEY* ec = EVP_PKEY_get1_EC_KEY(k->_key.key);
1996                                         const BIGNUM* b = EC_KEY_get0_private_key(ec);
1997                                         ldns_buffer_printf(output, "PrivateKey: ");
1998                                         i = (uint16_t)BN_bn2bin(b, bignum);
1999                                         if (i > LDNS_MAX_KEYLEN) {
2000                                                 goto error;
2001                                         }
2002                                         b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
2003                                         if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
2004                                                 ldns_rdf_deep_free(b64_bignum);
2005                                                 goto error;
2006                                         }
2007                                         ldns_rdf_deep_free(b64_bignum);
2008                                         ldns_buffer_printf(output, "\n");
2009                                         /* down reference count in EC_KEY
2010                                          * its still assigned to the PKEY */
2011                                         EC_KEY_free(ec);
2012                                 }
2013 #endif /* splint */
2014 #else
2015                                 goto error;
2016 #endif /* ECDSA */
2017                                 break;
2018                         case LDNS_SIGN_HMACMD5:
2019                                 /* there's not much of a format defined for TSIG */
2020                                 /* It's just a binary blob, Same for all algorithms */
2021                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
2022                 ldns_buffer_printf(output, "Algorithm: 157 (HMAC_MD5)\n");
2023                                 status = ldns_hmac_key2buffer_str(output, k);
2024                                 break;
2025                         case LDNS_SIGN_HMACSHA1:
2026                         ldns_buffer_printf(output, "Private-key-format: v1.2\n");
2027                         ldns_buffer_printf(output, "Algorithm: 158 (HMAC_SHA1)\n");
2028                                 status = ldns_hmac_key2buffer_str(output, k);
2029                                 break;
2030                         case LDNS_SIGN_HMACSHA256:
2031                         ldns_buffer_printf(output, "Private-key-format: v1.2\n");
2032                         ldns_buffer_printf(output, "Algorithm: 159 (HMAC_SHA256)\n");
2033                                 status = ldns_hmac_key2buffer_str(output, k);
2034                                 break;
2035                 }
2036 #endif /* HAVE_SSL */
2037         } else {
2038                 LDNS_FREE(bignum);
2039                 return ldns_buffer_status(output);
2040         }
2041         LDNS_FREE(bignum);
2042         return status;
2043
2044 #ifdef HAVE_SSL
2045         /* compiles warn the label isn't used */
2046 error:
2047         LDNS_FREE(bignum);
2048         return LDNS_STATUS_ERR;
2049 #endif /* HAVE_SSL */
2050
2051 }
2052
2053 /*
2054  * Zero terminate the buffer and copy data.
2055  */
2056 char *
2057 ldns_buffer2str(ldns_buffer *buffer)
2058 {
2059         char *str;
2060
2061         /* check if buffer ends with \0, if not, and
2062            if there is space, add it */
2063         if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) {
2064                 if (!ldns_buffer_reserve(buffer, 1)) {
2065                         return NULL;
2066                 }
2067                 ldns_buffer_write_u8(buffer, (uint8_t) '\0');
2068                 if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) {
2069                         return NULL;
2070                 }
2071         }
2072
2073         str = strdup((const char *)ldns_buffer_begin(buffer));
2074         if(!str) {
2075                 return NULL;
2076         }
2077         return str;
2078 }
2079
2080 /*
2081  * Zero terminate the buffer and export data.
2082  */
2083 char *
2084 ldns_buffer_export2str(ldns_buffer *buffer)
2085 {
2086         /* Append '\0' as string terminator */
2087         if (! ldns_buffer_reserve(buffer, 1)) {
2088                 return NULL;
2089         }
2090         ldns_buffer_write_u8(buffer, 0);
2091
2092         /* reallocate memory to the size of the string and export */
2093         ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer));
2094         return ldns_buffer_export(buffer);
2095 }
2096
2097 char *
2098 ldns_rdf2str(const ldns_rdf *rdf)
2099 {
2100         char *result = NULL;
2101         ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2102
2103         if (!tmp_buffer) {
2104                 return NULL;
2105         }
2106         if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) {
2107                 /* export and return string, destroy rest */
2108                 result = ldns_buffer_export2str(tmp_buffer);
2109         }
2110         ldns_buffer_free(tmp_buffer);
2111         return result;
2112 }
2113
2114 char *
2115 ldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr)
2116 {
2117         char *result = NULL;
2118         ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2119
2120         if (!tmp_buffer) {
2121                 return NULL;
2122         }
2123         if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr)
2124                         == LDNS_STATUS_OK) {
2125                 /* export and return string, destroy rest */
2126                 result = ldns_buffer_export2str(tmp_buffer);
2127         }
2128         ldns_buffer_free(tmp_buffer);
2129         return result;
2130 }
2131
2132 char *
2133 ldns_rr2str(const ldns_rr *rr)
2134 {
2135         return ldns_rr2str_fmt(ldns_output_format_default, rr);
2136 }
2137
2138 char *
2139 ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt)
2140 {
2141         char *result = NULL;
2142         ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2143
2144         if (!tmp_buffer) {
2145                 return NULL;
2146         }
2147         if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt)
2148                         == LDNS_STATUS_OK) {
2149                 /* export and return string, destroy rest */
2150                 result = ldns_buffer_export2str(tmp_buffer);
2151         }
2152
2153         ldns_buffer_free(tmp_buffer);
2154         return result;
2155 }
2156
2157 char *
2158 ldns_pkt2str(const ldns_pkt *pkt)
2159 {
2160         return ldns_pkt2str_fmt(ldns_output_format_default, pkt);
2161 }
2162
2163 char *
2164 ldns_key2str(const ldns_key *k)
2165 {
2166         char *result = NULL;
2167         ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2168
2169         if (!tmp_buffer) {
2170                 return NULL;
2171         }
2172         if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) {
2173                 /* export and return string, destroy rest */
2174                 result = ldns_buffer_export2str(tmp_buffer);
2175         }
2176         ldns_buffer_free(tmp_buffer);
2177         return result;
2178 }
2179
2180 char *
2181 ldns_rr_list2str_fmt(const ldns_output_format *fmt, const ldns_rr_list *list)
2182 {
2183         char *result = NULL;
2184         ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
2185
2186         if (!tmp_buffer) {
2187                 return NULL;
2188         }
2189         if (list) {
2190                 if (ldns_rr_list2buffer_str_fmt(
2191                                    tmp_buffer, fmt, list)
2192                                 == LDNS_STATUS_OK) {
2193                 }
2194         } else {
2195                 if (fmt == NULL) {
2196                         fmt = ldns_output_format_default;
2197                 }
2198                 if (fmt->flags & LDNS_COMMENT_NULLS) {
2199                         ldns_buffer_printf(tmp_buffer, "; (null)\n");
2200                 }
2201         }
2202
2203         /* export and return string, destroy rest */
2204         result = ldns_buffer_export2str(tmp_buffer);
2205         ldns_buffer_free(tmp_buffer);
2206         return result;
2207 }
2208
2209 char *
2210 ldns_rr_list2str(const ldns_rr_list *list)
2211 {
2212         return ldns_rr_list2str_fmt(ldns_output_format_default, list);
2213 }
2214
2215 void
2216 ldns_rdf_print(FILE *output, const ldns_rdf *rdf)
2217 {
2218         char *str = ldns_rdf2str(rdf);
2219         if (str) {
2220                 fprintf(output, "%s", str);
2221         } else {
2222                 fprintf(output, ";Unable to convert rdf to string\n");
2223         }
2224         LDNS_FREE(str);
2225 }
2226
2227 void
2228 ldns_rr_print_fmt(FILE *output,
2229                 const ldns_output_format *fmt, const ldns_rr *rr)
2230 {
2231         char *str = ldns_rr2str_fmt(fmt, rr);
2232         if (str) {
2233                 fprintf(output, "%s", str);
2234         } else {
2235                 fprintf(output, ";Unable to convert rr to string\n");
2236         }
2237         LDNS_FREE(str);
2238 }
2239
2240 void
2241 ldns_rr_print(FILE *output, const ldns_rr *rr)
2242 {
2243         ldns_rr_print_fmt(output, ldns_output_format_default, rr);
2244 }
2245
2246 void
2247 ldns_pkt_print_fmt(FILE *output, 
2248                 const ldns_output_format *fmt, const ldns_pkt *pkt)
2249 {
2250         char *str = ldns_pkt2str_fmt(fmt, pkt);
2251         if (str) {
2252                 fprintf(output, "%s", str);
2253         } else {
2254                 fprintf(output, ";Unable to convert packet to string\n");
2255         }
2256         LDNS_FREE(str);
2257 }
2258
2259 void
2260 ldns_pkt_print(FILE *output, const ldns_pkt *pkt)
2261 {
2262         ldns_pkt_print_fmt(output, ldns_output_format_default, pkt);
2263 }
2264
2265 void
2266 ldns_rr_list_print_fmt(FILE *output, 
2267                 const ldns_output_format *fmt, const ldns_rr_list *lst)
2268 {
2269         size_t i;
2270         for (i = 0; i < ldns_rr_list_rr_count(lst); i++) {
2271                 ldns_rr_print_fmt(output, fmt, ldns_rr_list_rr(lst, i));
2272         }
2273 }
2274
2275 void
2276 ldns_rr_list_print(FILE *output, const ldns_rr_list *lst)
2277 {
2278         ldns_rr_list_print_fmt(output, ldns_output_format_default, lst);
2279 }
2280
2281 void
2282 ldns_resolver_print_fmt(FILE *output, 
2283                 const ldns_output_format *fmt, const ldns_resolver *r)
2284 {
2285         uint16_t i;
2286         ldns_rdf **n;
2287         ldns_rdf **s;
2288         size_t *rtt;
2289         if (!r) {
2290                 return;
2291         }
2292         n = ldns_resolver_nameservers(r);
2293         s = ldns_resolver_searchlist(r);
2294         rtt = ldns_resolver_rtt(r);
2295
2296         fprintf(output, "port: %d\n", (int)ldns_resolver_port(r));
2297         fprintf(output, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r));
2298         fprintf(output, "use ip6: %d\n", (int)ldns_resolver_ip6(r));
2299
2300         fprintf(output, "recursive: %d\n", ldns_resolver_recursive(r));
2301         fprintf(output, "usevc: %d\n", ldns_resolver_usevc(r));
2302         fprintf(output, "igntc: %d\n", ldns_resolver_igntc(r));
2303         fprintf(output, "fail: %d\n", ldns_resolver_fail(r));
2304         fprintf(output, "retry: %d\n", (int)ldns_resolver_retry(r));
2305         fprintf(output, "retrans: %d\n", (int)ldns_resolver_retrans(r));
2306         fprintf(output, "fallback: %d\n", ldns_resolver_fallback(r));
2307         fprintf(output, "random: %d\n", ldns_resolver_random(r));
2308         fprintf(output, "timeout: %d\n", (int)ldns_resolver_timeout(r).tv_sec);
2309         fprintf(output, "dnssec: %d\n", ldns_resolver_dnssec(r));
2310         fprintf(output, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r));
2311         fprintf(output, "trust anchors (%d listed):\n",
2312                 (int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r)));
2313         ldns_rr_list_print_fmt(output, fmt, ldns_resolver_dnssec_anchors(r));
2314         fprintf(output, "tsig: %s %s\n",
2315                 ldns_resolver_tsig_keyname(r)?ldns_resolver_tsig_keyname(r):"-",
2316                 ldns_resolver_tsig_algorithm(r)?ldns_resolver_tsig_algorithm(r):"-");
2317         fprintf(output, "debug: %d\n", ldns_resolver_debug(r));
2318
2319         fprintf(output, "default domain: ");
2320         ldns_rdf_print(output, ldns_resolver_domain(r));
2321         fprintf(output, "\n");
2322         fprintf(output, "apply default domain: %d\n", ldns_resolver_defnames(r));
2323
2324         fprintf(output, "searchlist (%d listed):\n",  (int)ldns_resolver_searchlist_count(r));
2325         for (i = 0; i < ldns_resolver_searchlist_count(r); i++) {
2326                 fprintf(output, "\t");
2327                 ldns_rdf_print(output, s[i]);
2328                 fprintf(output, "\n");
2329         }
2330         fprintf(output, "apply search list: %d\n", ldns_resolver_dnsrch(r));
2331
2332         fprintf(output, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r));
2333         for (i = 0; i < ldns_resolver_nameserver_count(r); i++) {
2334                 fprintf(output, "\t");
2335                 ldns_rdf_print(output, n[i]);
2336
2337                 switch ((int)rtt[i]) {
2338                         case LDNS_RESOLV_RTT_MIN:
2339                         fprintf(output, " - reachable\n");
2340                         break;
2341                         case LDNS_RESOLV_RTT_INF:
2342                         fprintf(output, " - unreachable\n");
2343                         break;
2344                 }
2345         }
2346 }
2347
2348 void
2349 ldns_resolver_print(FILE *output, const ldns_resolver *r)
2350 {
2351         ldns_resolver_print_fmt(output, ldns_output_format_default, r);
2352 }
2353
2354 void
2355 ldns_zone_print_fmt(FILE *output, 
2356                 const ldns_output_format *fmt, const ldns_zone *z)
2357 {
2358         if(ldns_zone_soa(z))
2359                 ldns_rr_print_fmt(output, fmt, ldns_zone_soa(z));
2360         ldns_rr_list_print_fmt(output, fmt, ldns_zone_rrs(z));
2361 }
2362 void
2363 ldns_zone_print(FILE *output, const ldns_zone *z)
2364 {
2365         ldns_zone_print_fmt(output, ldns_output_format_default, z);
2366 }