From: Willem Toorop Date: Tue, 7 Sep 2021 08:20:49 +0000 (+0200) Subject: LDNS_FMT_SHORT output format option X-Git-Tag: 1.8.0-rc.1~20^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F138%2Fhead;p=thirdparty%2Fldns.git LDNS_FMT_SHORT output format option and a -Q option to drill to print short format answers resolves issue #28 --- diff --git a/drill/drill.c b/drill/drill.c index 24502cbb..13afb84f 100644 --- a/drill/drill.c +++ b/drill/drill.c @@ -173,6 +173,8 @@ main(int argc, char *argv[]) int r; WSADATA wsa_data; #endif + ldns_output_format_storage fmt_storage; + ldns_output_format* fmt = ldns_output_format_init(&fmt_storage); int_type = -1; serv = NULL; type = 0; int_clas = -1; name = NULL; clas = 0; @@ -247,6 +249,7 @@ main(int argc, char *argv[]) verbosity = atoi(optarg); break; case 'Q': + fmt->flags |= LDNS_FMT_SHORT; verbosity = -1; break; case 'f': @@ -879,8 +882,8 @@ main(int argc, char *argv[]) mesg("No packet received"); result = EXIT_FAILURE; } else { + ldns_pkt_print_fmt(stdout, fmt, pkt); if (verbosity != -1) { - ldns_pkt_print(stdout, pkt); if (ldns_pkt_tc(pkt)) { fprintf(stdout, "\n;; WARNING: The answer packet was truncated; you might want to\n"); diff --git a/host2str.c b/host2str.c index c98bb738..69254027 100644 --- a/host2str.c +++ b/host2str.c @@ -1817,45 +1817,50 @@ ldns_rr2buffer_str_fmt(ldns_buffer *output, fmt_st = (ldns_output_format_storage*) ldns_output_format_default; } - if (!rr) { - if (LDNS_COMMENT_NULLS & fmt_st->flags) { - ldns_buffer_printf(output, "; (null)\n"); + if (!(fmt_st->flags & LDNS_FMT_SHORT)) { + if (!rr) { + if (LDNS_COMMENT_NULLS & fmt_st->flags) { + ldns_buffer_printf(output, "; (null)\n"); + } + return ldns_buffer_status(output); + } + if (ldns_rr_owner(rr)) { + status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr)); + } + if (status != LDNS_STATUS_OK) { + return status; } - return ldns_buffer_status(output); - } - if (ldns_rr_owner(rr)) { - status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr)); - } - if (status != LDNS_STATUS_OK) { - return status; - } - /* TTL should NOT be printed if it is a question */ - if (!ldns_rr_is_question(rr)) { - ldns_buffer_printf(output, "\t%d", ldns_rr_ttl(rr)); - } + /* TTL should NOT be printed if it is a question */ + if (!ldns_rr_is_question(rr)) { + ldns_buffer_printf(output, "\t%d", ldns_rr_ttl(rr)); + } - ldns_buffer_printf(output, "\t"); - status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr)); - if (status != LDNS_STATUS_OK) { - return status; - } - ldns_buffer_printf(output, "\t"); + ldns_buffer_printf(output, "\t"); + status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr)); + if (status != LDNS_STATUS_OK) { + return status; + } + ldns_buffer_printf(output, "\t"); - if (ldns_output_format_covers_type(fmt, ldns_rr_get_type(rr))) { - return ldns_rr2buffer_str_rfc3597(output, rr); - } - status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr)); - if (status != LDNS_STATUS_OK) { - return status; - } + if (ldns_output_format_covers_type(fmt, ldns_rr_get_type(rr))) { + return ldns_rr2buffer_str_rfc3597(output, rr); + } + status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr)); + if (status != LDNS_STATUS_OK) { + return status; + } - if (ldns_rr_rd_count(rr) > 0) { - ldns_buffer_printf(output, "\t"); - } else if (!ldns_rr_is_question(rr)) { - ldns_buffer_printf(output, "\t\\# 0"); - } + if (ldns_rr_rd_count(rr) > 0) { + ldns_buffer_printf(output, "\t"); + } else if (!ldns_rr_is_question(rr)) { + ldns_buffer_printf(output, "\t\\# 0"); + } + } else if (ldns_rr_rd_count(rr) == 0) { + /* assert(fmt_st->flags & LDNS_FMT_SHORT); */ + ldns_buffer_printf(output, "# 0"); + } for (i = 0; i < ldns_rr_rd_count(rr); i++) { /* ldns_rdf2buffer_str handles NULL input fine! */ if ((fmt_st->flags & LDNS_FMT_ZEROIZE_RRSIGS) && @@ -2111,13 +2116,18 @@ ldns_pkt2buffer_str_fmt(ldns_buffer *output, char *tmp; struct timeval time; time_t time_tt; + int short_fmt = fmt && (fmt->flags & LDNS_FMT_SHORT); if (!pkt) { ldns_buffer_printf(output, "null"); return LDNS_STATUS_OK; } - if (ldns_buffer_status_ok(output)) { + if (!ldns_buffer_status_ok(output)) { + return ldns_buffer_status(output); + } + + if (!short_fmt) { status = ldns_pktheader2buffer_str(output, pkt); if (status != LDNS_STATUS_OK) { return status; @@ -2139,15 +2149,16 @@ ldns_pkt2buffer_str_fmt(ldns_buffer *output, ldns_buffer_printf(output, "\n"); ldns_buffer_printf(output, ";; ANSWER SECTION:\n"); - for (i = 0; i < ldns_pkt_ancount(pkt); i++) { - status = ldns_rr2buffer_str_fmt(output, fmt, - ldns_rr_list_rr( - ldns_pkt_answer(pkt), i)); - if (status != LDNS_STATUS_OK) { - return status; - } - + } + for (i = 0; i < ldns_pkt_ancount(pkt); i++) { + status = ldns_rr2buffer_str_fmt(output, fmt, + ldns_rr_list_rr( + ldns_pkt_answer(pkt), i)); + if (status != LDNS_STATUS_OK) { + return status; } + } + if (!short_fmt) { ldns_buffer_printf(output, "\n"); ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n"); @@ -2217,8 +2228,6 @@ ldns_pkt2buffer_str_fmt(ldns_buffer *output, ldns_buffer_printf(output, ";; MSG SIZE rcvd: %d\n", (int)ldns_pkt_size(pkt)); - } else { - return ldns_buffer_status(output); } return status; } diff --git a/ldns/host2str.h b/ldns/host2str.h index 7d39785b..f3cffd36 100644 --- a/ldns/host2str.h +++ b/ldns/host2str.h @@ -65,6 +65,8 @@ extern "C" { #define LDNS_FMT_ZEROIZE_RRSIGS (1 << 9) #define LDNS_FMT_PAD_SOA_SERIAL (1 << 10) #define LDNS_FMT_RFC3597 (1 << 11) /* yes */ +/** Prints only answer section of packets and only rdata of RRs **/ +#define LDNS_FMT_SHORT (1 << 12) #define LDNS_FMT_FLAGS_WITH_DATA 2