45addc69cf79a3051ea2114ee697a3e51e49db53
3 static struct blob_buf b
;
4 static struct ubus_context
*ctx
;
7 static void receive_lookup(struct ubus_request
*req
, int type
, struct blob_attr
*msg
)
9 struct blob_attr
**attr
, *cur
;
13 attr
= ubus_parse_msg(msg
);
14 if (!attr
[UBUS_ATTR_OBJID
] || !attr
[UBUS_ATTR_OBJPATH
])
17 fprintf(stderr
, "'%s' @%08x\n",
18 (char *) blob_data(attr
[UBUS_ATTR_OBJPATH
]),
19 blob_get_int32(attr
[UBUS_ATTR_OBJID
]));
21 if (!attr
[UBUS_ATTR_SIGNATURE
])
24 blob_for_each_attr(cur
, attr
[UBUS_ATTR_SIGNATURE
], rem
) {
25 s
= blobmsg_format_json(cur
, false);
26 fprintf(stderr
, "\t%s\n", s
);
31 static void receive_data(struct ubus_request
*req
, int type
, struct blob_attr
*msg
)
36 fprintf(stderr
, "%s\n", blobmsg_format_json(msg
, true));
39 static void store_objid(struct ubus_request
*req
, int type
, struct blob_attr
*msg
)
41 struct blob_attr
**attr
;
43 attr
= ubus_parse_msg(msg
);
44 if (!attr
[UBUS_ATTR_OBJID
])
47 objid
= blob_get_int32(attr
[UBUS_ATTR_OBJID
]);
50 static uint32_t get_object(const char *name
)
52 struct ubus_request req
;
55 blob_put_string(&b
, UBUS_ATTR_OBJPATH
, name
);
56 ubus_start_request(ctx
, &req
, b
.head
, UBUS_MSG_LOOKUP
, 0);
57 req
.raw_data_cb
= store_objid
;
58 if (ubus_complete_request(ctx
, &req
))
64 static int usage(char *prog
)
67 "Usage: %s <command> [arguments...]\n"
69 " - list [<path>] List objects\n"
70 " - call <path> <method> [<message>] Call an object method\n"
75 int main(int argc
, char **argv
)
77 struct ubus_request req
;
81 ctx
= ubus_connect(NULL
);
83 fprintf(stderr
, "Failed to connect to ubus\n");
89 return usage(argv
[0]);
91 if (!strcmp(cmd
, "list")) {
95 blob_put_string(&b
, UBUS_ATTR_OBJPATH
, argv
[2]);
97 ubus_start_request(ctx
, &req
, b
.head
, UBUS_MSG_LOOKUP
, 0);
98 req
.raw_data_cb
= receive_lookup
;
99 ret
= ubus_complete_request(ctx
, &req
);
100 } else if (!strcmp(cmd
, "call")) {
101 if (argc
< 4 || argc
> 5)
102 return usage(argv
[0]);
104 if (get_object(argv
[2]) == 0) {
105 fprintf(stderr
, "Object not found\n");
109 ret
= ubus_invoke(ctx
, objid
, argv
[3], NULL
, receive_data
, NULL
);
111 return usage(argv
[0]);
115 fprintf(stderr
, "Failed: %s\n", ubus_strerror(ret
));