On Mon, 2017-10-23 at 09:24 -0700, Jakub Kicinski wrote: > From: Quentin Monnet <quentin.mon...@netronome.com> > > 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 <quentin.mon...@netronome.com> > Acked-by: Jakub Kicinski <jakub.kicin...@netronome.com> [] > 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); > +} >