tools: bpftool: provide JSON output for all possible commands
authorQuentin Monnet <quentin.monnet@netronome.com>
Mon, 23 Oct 2017 16:24:14 +0000 (09:24 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 24 Oct 2017 00:25:09 +0000 (01:25 +0100)
As all commands can now return JSON output (possibly just a "null"
value), output of `bpftool --json batch file FILE` should also be fully
JSON compliant.

Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/bpf/bpftool/main.c
tools/bpf/bpftool/map.c
tools/bpf/bpftool/prog.c

index 9989a77fdc4ac6a40a7778967f5516b396bc6df4..55ba0a04c102221697f0843f0d204894a97f7928 100644 (file)
@@ -64,6 +64,11 @@ void usage(void)
 
 static int do_help(int argc, char **argv)
 {
+       if (json_output) {
+               jsonw_null(json_wtr);
+               return 0;
+       }
+
        fprintf(stderr,
                "Usage: %s OBJECT { COMMAND | help }\n"
                "       %s batch file FILE\n"
@@ -77,10 +82,22 @@ static int do_help(int argc, char **argv)
 
 static int do_version(int argc, char **argv)
 {
-       printf("%s v%d.%d.%d\n", bin_name,
-              LINUX_VERSION_CODE >> 16,
-              LINUX_VERSION_CODE >> 8 & 0xf,
-              LINUX_VERSION_CODE & 0xf);
+       unsigned int version[3];
+
+       version[0] = LINUX_VERSION_CODE >> 16;
+       version[1] = LINUX_VERSION_CODE >> 8 & 0xf;
+       version[2] = LINUX_VERSION_CODE & 0xf;
+
+       if (json_output) {
+               jsonw_start_object(json_wtr);
+               jsonw_name(json_wtr, "version");
+               jsonw_printf(json_wtr, "\"%u.%u.%u\"",
+                            version[0], version[1], version[2]);
+               jsonw_end_object(json_wtr);
+       } else {
+               printf("%s v%u.%u.%u\n", bin_name,
+                      version[0], version[1], version[2]);
+       }
        return 0;
 }
 
index 86c128c433baf280e4b1ce0f5d39f7bf6039f472..a611f31f574ff57f1734bbf4cf3b02773eae3b22 100644 (file)
@@ -651,6 +651,8 @@ exit_free:
        free(value);
        close(fd);
 
+       if (!err && json_output)
+               jsonw_null(json_wtr);
        return err;
 }
 
@@ -812,16 +814,28 @@ exit_free:
        free(key);
        close(fd);
 
+       if (!err && json_output)
+               jsonw_null(json_wtr);
        return err;
 }
 
 static int do_pin(int argc, char **argv)
 {
-       return do_pin_any(argc, argv, bpf_map_get_fd_by_id);
+       int err;
+
+       err = do_pin_any(argc, argv, bpf_map_get_fd_by_id);
+       if (!err && json_output)
+               jsonw_null(json_wtr);
+       return err;
 }
 
 static int do_help(int argc, char **argv)
 {
+       if (json_output) {
+               jsonw_null(json_wtr);
+               return 0;
+       }
+
        fprintf(stderr,
                "Usage: %s %s show   [MAP]\n"
                "       %s %s dump    MAP\n"
index 41bd5390b4fcad3832447c71b88f7b7cc43139bc..e07f35ff80d1555ba65bddfba07c5f6368ffed5d 100644 (file)
@@ -602,11 +602,21 @@ err_free:
 
 static int do_pin(int argc, char **argv)
 {
-       return do_pin_any(argc, argv, bpf_prog_get_fd_by_id);
+       int err;
+
+       err = do_pin_any(argc, argv, bpf_prog_get_fd_by_id);
+       if (!err && json_output)
+               jsonw_null(json_wtr);
+       return err;
 }
 
 static int do_help(int argc, char **argv)
 {
+       if (json_output) {
+               jsonw_null(json_wtr);
+               return 0;
+       }
+
        fprintf(stderr,
                "Usage: %s %s show [PROG]\n"
                "       %s %s dump xlated PROG [{ file FILE | opcodes }]\n"