aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuentin Monnet <quentin.monnet@netronome.com>2017-11-28 20:44:30 -0500
committerDaniel Borkmann <daniel@iogearbox.net>2017-11-29 20:09:29 -0500
commit146882a37da7aa566c7ec088b42c6495d769f2ba (patch)
treeb577401a7893ca642580f58e486c7015a7eac73f
parent7868620a3c15dbc661fb5d849de403ac04624c50 (diff)
tools: bpftool: make error message from getopt_long() JSON-friendly
If `getopt_long()` meets an unknown option, it prints its own error message to standard error output. While this does not strictly break JSON output, it is the only case bpftool prints something to standard error output if JSON output is required. All other errors are printed on standard output as JSON objects, so that an external program does not have to parse stderr. This is changed by setting the global variable `opterr` to 0. Furthermore, p_err() is used to reproduce the error message in a more JSON-friendly way, so that users still get to know what the erroneous option is. Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com> Acked-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r--tools/bpf/bpftool/main.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c
index d72dd73a4016..d294bc8168be 100644
--- a/tools/bpf/bpftool/main.c
+++ b/tools/bpf/bpftool/main.c
@@ -288,6 +288,7 @@ int main(int argc, char **argv)
288 hash_init(prog_table.table); 288 hash_init(prog_table.table);
289 hash_init(map_table.table); 289 hash_init(map_table.table);
290 290
291 opterr = 0;
291 while ((opt = getopt_long(argc, argv, "Vhpjf", 292 while ((opt = getopt_long(argc, argv, "Vhpjf",
292 options, NULL)) >= 0) { 293 options, NULL)) >= 0) {
293 switch (opt) { 294 switch (opt) {
@@ -313,7 +314,11 @@ int main(int argc, char **argv)
313 show_pinned = true; 314 show_pinned = true;
314 break; 315 break;
315 default: 316 default:
316 usage(); 317 p_err("unrecognized option '%s'", argv[optind - 1]);
318 if (json_output)
319 clean_and_exit(-1);
320 else
321 usage();
317 } 322 }
318 } 323 }
319 324