4 static struct blob_buf b
;
7 static bool blobmsg_add_element(struct blob_buf
*b
, const char *name
, json_object
*obj
);
9 static bool blobmsg_add_object(struct blob_buf
*b
, json_object
*obj
)
11 json_object_object_foreach(obj
, key
, val
) {
12 if (!blobmsg_add_element(b
, key
, val
))
18 static bool blobmsg_add_array(struct blob_buf
*b
, struct array_list
*a
)
22 for (i
= 0, len
= array_list_length(a
); i
< len
; i
++) {
23 if (!blobmsg_add_element(b
, NULL
, array_list_get_idx(a
, i
)))
30 static bool blobmsg_add_element(struct blob_buf
*b
, const char *name
, json_object
*obj
)
38 switch (json_object_get_type(obj
)) {
39 case json_type_object
:
40 c
= blobmsg_open_table(b
, name
);
41 ret
= blobmsg_add_object(b
, obj
);
42 blobmsg_close_table(b
, c
);
45 c
= blobmsg_open_array(b
, name
);
46 ret
= blobmsg_add_array(b
, json_object_get_array(obj
));
47 blobmsg_close_array(b
, c
);
49 case json_type_string
:
50 blobmsg_add_string(b
, name
, json_object_get_string(obj
));
52 case json_type_boolean
:
53 blobmsg_add_u8(b
, name
, json_object_get_boolean(obj
));
56 blobmsg_add_u32(b
, name
, json_object_get_int(obj
));
64 static bool blobmsg_from_json(struct blob_buf
*b
, const char *str
)
69 obj
= json_tokener_parse(str
);
73 if (json_object_get_type(obj
) != json_type_object
)
76 ret
= blobmsg_add_object(b
, obj
);
83 static void receive_lookup(struct ubus_context
*ctx
, struct ubus_object_data
*obj
, void *priv
)
85 struct blob_attr
*cur
;
89 fprintf(stderr
, "'%s' @%08x\n", obj
->path
, obj
->id
);
94 blob_for_each_attr(cur
, obj
->signature
, rem
) {
95 s
= blobmsg_format_json(cur
, false);
96 fprintf(stderr
, "\t%s\n", s
);
101 static void receive_data(struct ubus_request
*req
, int type
, struct blob_attr
*msg
)
107 str
= blobmsg_format_json(msg
, true);
108 fprintf(stderr
, "%s\n", str
);
113 static int usage(char *prog
)
116 "Usage: %s <command> [arguments...]\n"
118 " - list [<path>] List objects\n"
119 " - call <path> <method> [<message>] Call an object method\n"
120 " - listen [<path>...] Listen for events\n"
125 static void receive_event(struct ubus_context
*ctx
, struct ubus_event_handler
*ev
,
126 const char *type
, struct blob_attr
*msg
)
131 str
= blobmsg_format_json(msg
, true);
135 fprintf(stderr
, "\"%s\":{ %s }\n", type
, str
);
139 static int ubus_cli_listen(struct ubus_context
*ctx
, int argc
, char **argv
)
141 static struct ubus_event_handler listener
;
145 memset(&listener
, 0, sizeof(listener
));
146 listener
.cb
= receive_event
;
150 ret
= ubus_register_event_handler(ctx
, &listener
, NULL
);
153 for (;argc
;argv
++, argc
--) {
155 ret
= ubus_register_event_handler(ctx
, &listener
, argv
[0]);
161 fprintf(stderr
, "Error while registering for event '%s': %s\n",
162 event
, ubus_strerror(ret
));
173 int main(int argc
, char **argv
)
175 static struct ubus_context
*ctx
;
179 ctx
= ubus_connect(NULL
);
181 fprintf(stderr
, "Failed to connect to ubus\n");
187 return usage(argv
[0]);
189 if (!strcmp(cmd
, "list")) {
190 const char *path
= NULL
;
195 ret
= ubus_lookup(ctx
, path
, receive_lookup
, NULL
);
196 } else if (!strcmp(cmd
, "call")) {
199 if (argc
< 4 || argc
> 5)
200 return usage(argv
[0]);
202 blob_buf_init(&b
, 0);
203 if (argc
== 5 && !blobmsg_from_json(&b
, argv
[4])) {
204 fprintf(stderr
, "Failed to parse message data\n");
208 ret
= ubus_lookup_id(ctx
, argv
[2], &id
);
210 ret
= ubus_invoke(ctx
, id
, argv
[3], b
.head
, receive_data
, NULL
);
211 } else if (!strcmp(cmd
, "listen")) {
212 ret
= ubus_cli_listen(ctx
, argc
- 2, argv
+ 2);
214 return usage(argv
[0]);
218 fprintf(stderr
, "Failed: %s\n", ubus_strerror(ret
));