cli: add support for subscribing to objects
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
c09e4f06f0
commit
453b87f631
1 changed files with 73 additions and 13 deletions
86
cli.c
86
cli.c
|
@ -94,8 +94,7 @@ static void receive_call_result_data(struct ubus_request *req, int type, struct
|
||||||
free(str);
|
free(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void receive_event(struct ubus_context *ctx, struct ubus_event_handler *ev,
|
static void print_event(const char *type, struct blob_attr *msg)
|
||||||
const char *type, struct blob_attr *msg)
|
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
|
@ -105,6 +104,20 @@ static void receive_event(struct ubus_context *ctx, struct ubus_event_handler *e
|
||||||
free(str);
|
free(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int receive_request(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
struct ubus_request_data *req,
|
||||||
|
const char *method, struct blob_attr *msg)
|
||||||
|
{
|
||||||
|
print_event(method, msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void receive_event(struct ubus_context *ctx, struct ubus_event_handler *ev,
|
||||||
|
const char *type, struct blob_attr *msg)
|
||||||
|
{
|
||||||
|
print_event(type, msg);
|
||||||
|
}
|
||||||
|
|
||||||
static int ubus_cli_list(struct ubus_context *ctx, int argc, char **argv)
|
static int ubus_cli_list(struct ubus_context *ctx, int argc, char **argv)
|
||||||
{
|
{
|
||||||
const char *path = NULL;
|
const char *path = NULL;
|
||||||
|
@ -142,7 +155,6 @@ static int ubus_cli_call(struct ubus_context *ctx, int argc, char **argv)
|
||||||
|
|
||||||
struct cli_listen_data {
|
struct cli_listen_data {
|
||||||
struct uloop_timeout timeout;
|
struct uloop_timeout timeout;
|
||||||
struct ubus_event_handler ev;
|
|
||||||
bool timed_out;
|
bool timed_out;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -153,13 +165,23 @@ static void listen_timeout(struct uloop_timeout *timeout)
|
||||||
uloop_end();
|
uloop_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_listen(struct ubus_context *ctx, struct cli_listen_data *data)
|
||||||
|
{
|
||||||
|
memset(data, 0, sizeof(*data));
|
||||||
|
data->timeout.cb = listen_timeout;
|
||||||
|
uloop_init();
|
||||||
|
ubus_add_uloop(ctx);
|
||||||
|
uloop_timeout_set(&data->timeout, timeout * 1000);
|
||||||
|
uloop_run();
|
||||||
|
uloop_done();
|
||||||
|
}
|
||||||
|
|
||||||
static int ubus_cli_listen(struct ubus_context *ctx, int argc, char **argv)
|
static int ubus_cli_listen(struct ubus_context *ctx, int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct cli_listen_data data = {
|
struct ubus_event_handler ev = {
|
||||||
.timeout.cb = listen_timeout,
|
.cb = receive_event,
|
||||||
.ev.cb = receive_event,
|
|
||||||
.timed_out = false,
|
|
||||||
};
|
};
|
||||||
|
struct cli_listen_data data;
|
||||||
const char *event;
|
const char *event;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -171,7 +193,7 @@ static int ubus_cli_listen(struct ubus_context *ctx, int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ret = ubus_register_event_handler(ctx, &data.ev, event);
|
ret = ubus_register_event_handler(ctx, &ev, event);
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -190,15 +212,52 @@ static int ubus_cli_listen(struct ubus_context *ctx, int argc, char **argv)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uloop_init();
|
do_listen(ctx, &data);
|
||||||
ubus_add_uloop(ctx);
|
|
||||||
uloop_timeout_set(&data.timeout, timeout * 1000);
|
|
||||||
uloop_run();
|
|
||||||
uloop_done();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ubus_cli_subscribe(struct ubus_context *ctx, int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct ubus_subscriber sub = {
|
||||||
|
.cb = receive_request,
|
||||||
|
};
|
||||||
|
struct cli_listen_data data;
|
||||||
|
const char *event;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (argc > 0) {
|
||||||
|
event = argv[0];
|
||||||
|
} else {
|
||||||
|
if (!simple_output)
|
||||||
|
fprintf(stderr, "You need to specify an object to subscribe to\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ubus_register_subscriber(ctx, &sub);
|
||||||
|
for (; !ret && argc > 0; argc--, argv++) {
|
||||||
|
uint32_t id;
|
||||||
|
|
||||||
|
ret = ubus_lookup_id(ctx, argv[0], &id);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ret = ubus_subscribe(ctx, &sub, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
if (!simple_output)
|
||||||
|
fprintf(stderr, "Error while registering for event '%s': %s\n",
|
||||||
|
event, ubus_strerror(ret));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
do_listen(ctx, &data);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ubus_cli_send(struct ubus_context *ctx, int argc, char **argv)
|
static int ubus_cli_send(struct ubus_context *ctx, int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (argc < 1 || argc > 2)
|
if (argc < 1 || argc > 2)
|
||||||
|
@ -504,6 +563,7 @@ static struct {
|
||||||
{ "list", ubus_cli_list },
|
{ "list", ubus_cli_list },
|
||||||
{ "call", ubus_cli_call },
|
{ "call", ubus_cli_call },
|
||||||
{ "listen", ubus_cli_listen },
|
{ "listen", ubus_cli_listen },
|
||||||
|
{ "subscribe", ubus_cli_subscribe },
|
||||||
{ "send", ubus_cli_send },
|
{ "send", ubus_cli_send },
|
||||||
{ "wait_for", ubus_cli_wait_for },
|
{ "wait_for", ubus_cli_wait_for },
|
||||||
{ "monitor", ubus_cli_monitor },
|
{ "monitor", ubus_cli_monitor },
|
||||||
|
|
Loading…
Reference in a new issue