[OpenWrt-Devel] [PATCH] [ubus 2/2] cli: add timeout support for listen command

Zhao, Gang gang.zhao.42 at gmail.com
Thu Feb 25 21:27:01 EST 2016


Signed-off-by: Zhao, Gang <gang.zhao.42 at gmail.com>
---
 cli.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/cli.c b/cli.c
index c476f35..24b5d22 100644
--- a/cli.c
+++ b/cli.c
@@ -125,15 +125,29 @@ static int ubus_cli_call(struct ubus_context *ctx, int argc, char **argv)
 	return ubus_invoke(ctx, id, argv[1], b.head, receive_call_result_data, NULL, timeout * 1000);
 }
 
+struct cli_listen_data {
+	struct uloop_timeout timeout;
+	struct ubus_event_handler ev;
+	bool timed_out;
+};
+
+static void listen_timeout(struct uloop_timeout *timeout)
+{
+	struct cli_listen_data *data = container_of(timeout, struct cli_listen_data, timeout);
+	data->timed_out = true;
+	uloop_end();
+}
+
 static int ubus_cli_listen(struct ubus_context *ctx, int argc, char **argv)
 {
-	struct ubus_event_handler listener;
+	struct cli_listen_data data = {
+		.timeout.cb = listen_timeout,
+		.ev.cb = receive_event,
+		.timed_out = false,
+	};
 	const char *event;
 	int ret = 0;
 
-	memset(&listener, 0, sizeof(listener));
-	listener.cb = receive_event;
-
 	if (argc > 0) {
 		event = argv[0];
 	} else {
@@ -142,7 +156,7 @@ static int ubus_cli_listen(struct ubus_context *ctx, int argc, char **argv)
 	}
 
 	do {
-		ret = ubus_register_event_handler(ctx, &listener, event);
+		ret = ubus_register_event_handler(ctx, &data.ev, event);
 		if (ret)
 			break;
 
@@ -163,6 +177,7 @@ static int ubus_cli_listen(struct ubus_context *ctx, int argc, char **argv)
 
 	uloop_init();
 	ubus_add_uloop(ctx);
+	uloop_timeout_set(&data.timeout, timeout * 1000);
 	uloop_run();
 	uloop_done();
 
-- 
2.7.2
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list