From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joe Perches Subject: Re: [PATCH net-next 09/12] tools: bpftool: turn err() and info() macros into functions Date: Thu, 02 Nov 2017 17:59:05 -0700 Message-ID: <1509670745.31043.95.camel@perches.com> References: <20171023162416.32753-1-jakub.kicinski@netronome.com> <20171023162416.32753-10-jakub.kicinski@netronome.com> Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Cc: oss-drivers@netronome.com, alexei.starovoitov@gmail.com, daniel@iogearbox.net, Quentin Monnet To: Jakub Kicinski , netdev@vger.kernel.org Return-path: Received: from smtprelay0182.hostedemail.com ([216.40.44.182]:36720 "EHLO smtprelay.hostedemail.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932398AbdKCA7J (ORCPT ); Thu, 2 Nov 2017 20:59:09 -0400 In-Reply-To: <20171023162416.32753-10-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org List-ID: On Mon, 2017-10-23 at 09:24 -0700, Jakub Kicinski wrote: > From: Quentin Monnet > > Turn err() and info() macros into functions. > > In order to avoid naming conflicts with variables in the code, rename > them as p_err() and p_info() respectively. > > The behavior of these functions is similar to the one of the macros for > plain output. However, when JSON output is requested, these macros > return a JSON-formatted "error" object instead of printing a message to > stderr. > > To handle error messages correctly with JSON, a modification was brought > to their behavior nonetheless: the functions now append a end-of-line > character at the end of the message. This way, we can remove end-of-line > characters at the end of the argument strings, and not have them in the > JSON output. > > All error messages are formatted to hold in a single call to p_err(), in > order to produce a single JSON field. > Signed-off-by: Quentin Monnet > Acked-by: Jakub Kicinski [] > diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h [] > @@ -97,4 +93,35 @@ int prog_parse_fd(int *argc, char ***argv); > void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes); > void print_hex_data_json(uint8_t *data, size_t len); > > +static inline void p_err(const char *fmt, ...) > +{ > + va_list ap; > + > + va_start(ap, fmt); > + if (json_output) { > + jsonw_start_object(json_wtr); > + jsonw_name(json_wtr, "error"); > + jsonw_vprintf_enquote(json_wtr, fmt, ap); > + jsonw_end_object(json_wtr); > + } else { > + fprintf(stderr, "Error: "); > + vfprintf(stderr, fmt, ap); > + fprintf(stderr, "\n"); > + } > + va_end(ap); > +} inline seems very wasteful. Why not move p_err and p_info to common.c ? > + > +static inline void p_info(const char *fmt, ...) > +{ > + va_list ap; > + > + if (json_output) > + return; > + > + va_start(ap, fmt); > + vfprintf(stderr, fmt, ap); > + fprintf(stderr, "\n"); > + va_end(ap); > +} >