public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2-next v2] dpll: Send object per event in JSON monitor mode
@ 2026-03-29  7:51 Vitaly Grinberg
  2026-03-29 11:47 ` Petr Oros
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Vitaly Grinberg @ 2026-03-29  7:51 UTC (permalink / raw)
  To: netdev; +Cc: stephen, Vitaly Grinberg

Previously, monitor mode wrapped all events in a single JSON array
inside a top-level object, which made piping the output to external
tools (such as `jq`) impossible.
Send a separate JSON object for each event in monitor mode,
making the output suitable for line-by-line consumers. Skip the
global JSON wrapper for monitor mode.

Signed-off-by: Vitaly Grinberg <vgrinber@redhat.com>
---
v2:
  - Fixed indentation
---
 dpll/dpll.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/dpll/dpll.c b/dpll/dpll.c
index 9893ca8c..49576d23 100644
--- a/dpll/dpll.c
+++ b/dpll/dpll.c
@@ -571,8 +571,15 @@ int main(int argc, char **argv)
 	argc -= optind;
 	argv += optind;
 
-	new_json_obj_plain(json);
-	open_json_object(NULL);
+	/* Monitor emits one JSON object per event for streaming;
+	 * other commands use a single JSON wrapper object.
+	 */
+	bool is_monitor = argc > 0 && strcmp(argv[0], "monitor") == 0;
+
+	if (!is_monitor) {
+		new_json_obj_plain(json);
+		open_json_object(NULL);
+	}
 
 	/* Skip netlink init for help commands */
 	bool need_nl = true;
@@ -602,8 +609,10 @@ dpll_fini:
 	if (need_nl)
 		dpll_fini(dpll);
 json_cleanup:
-	close_json_object();
-	delete_json_obj_plain();
+	if (!is_monitor) {
+		close_json_object();
+		delete_json_obj_plain();
+	}
 dpll_free:
 	dpll_free(dpll);
 	return ret;
@@ -2173,6 +2182,7 @@ static int cmd_monitor_cb(const struct nlmsghdr *nlh, void *data)
 
 		mnl_attr_parse(nlh, sizeof(struct genlmsghdr), attr_cb, tb);
 
+		new_json_obj_plain(json);
 		open_json_object(NULL);
 		print_string(PRINT_JSON, "name", NULL, json_name);
 		open_json_object("msg");
@@ -2182,6 +2192,7 @@ static int cmd_monitor_cb(const struct nlmsghdr *nlh, void *data)
 
 		close_json_object();
 		close_json_object();
+		delete_json_obj_plain();
 		break;
 	}
 	case DPLL_CMD_PIN_CREATE_NTF:
@@ -2200,6 +2211,7 @@ static int cmd_monitor_cb(const struct nlmsghdr *nlh, void *data)
 			json_name = "pin-delete-ntf";
 		}
 
+		new_json_obj_plain(json);
 		open_json_object(NULL);
 		print_string(PRINT_JSON, "name", NULL, json_name);
 		open_json_object("msg");
@@ -2209,6 +2221,7 @@ static int cmd_monitor_cb(const struct nlmsghdr *nlh, void *data)
 
 		close_json_object();
 		close_json_object();
+		delete_json_obj_plain();
 		break;
 	}
 	default:
@@ -2273,8 +2286,6 @@ static int cmd_monitor(struct dpll *dpll)
 		goto err_signalfd;
 	}
 
-	open_json_array(PRINT_JSON, "monitor");
-
 	pfds[0].fd = signal_fd;
 	pfds[0].events = POLLIN;
 	pfds[1].fd = netlink_fd;
@@ -2307,8 +2318,6 @@ static int cmd_monitor(struct dpll *dpll)
 		}
 	}
 
-	close_json_array(PRINT_JSON, NULL);
-
 err_signalfd:
 	if (signal_fd >= 0)
 		close(signal_fd);

---
base-commit: 36252727bfc653905bb39bec115a32869452beb1
change-id: 20260328-dpll-mon-j-d88eb48c1f09

Best regards,
--  
Vitaly Grinberg <vgrinber@redhat.com>


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-04-05 17:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-29  7:51 [PATCH iproute2-next v2] dpll: Send object per event in JSON monitor mode Vitaly Grinberg
2026-03-29 11:47 ` Petr Oros
2026-03-30  8:50 ` Ivan Vecera
2026-04-05 17:30 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox