From b9530def721e28ac4112d527dd4e3adf046e137b Mon Sep 17 00:00:00 2001 From: Manu Bretelle Date: Wed, 18 Oct 2023 16:01:33 -0700 Subject: [PATCH] bpftool: Wrap struct_ops dump in an array When dumping a struct_ops, 2 dictionaries are emitted. When using `name`, they were already wrapped in an array, but not when using `id`. Causing `jq` to fail at parsing the payload as it reached the comma following the first dict. This change wraps those dictionaries in an array so valid json is emitted. Before, jq fails to parse the output: ``` $ sudo bpftool struct_ops dump id 1523612 | jq . > /dev/null parse error: Expected value before ',' at line 19, column 2 ``` After, no error parsing the output: ``` sudo ./bpftool struct_ops dump id 1523612 | jq . > /dev/null ``` Signed-off-by: Manu Bretelle Signed-off-by: Daniel Borkmann Tested-by: Eduard Zingerman Acked-by: Eduard Zingerman Acked-by: Quentin Monnet Link: https://lore.kernel.org/bpf/20231018230133.1593152-3-chantr4@gmail.com --- src/struct_ops.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/struct_ops.c b/src/struct_ops.c index 3ebc9fe9..d573f264 100644 --- a/src/struct_ops.c +++ b/src/struct_ops.c @@ -276,6 +276,9 @@ static struct res do_one_id(const char *id_str, work_func func, void *data, res.nr_maps++; + if (wtr) + jsonw_start_array(wtr); + if (func(fd, info, data, wtr)) res.nr_errs++; else if (!wtr && json_output) @@ -288,6 +291,9 @@ static struct res do_one_id(const char *id_str, work_func func, void *data, */ jsonw_null(json_wtr); + if (wtr) + jsonw_end_array(wtr); + done: free(info); close(fd);