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 store_objid(struct ubus_request
*req
, int type
, struct blob_attr
*msg
)
33 struct blob_attr
**attr
;
35 attr
= ubus_parse_msg(msg
);
36 if (!attr
[UBUS_ATTR_OBJID
])
39 objid
= blob_get_int32(attr
[UBUS_ATTR_OBJID
]);
42 static uint32_t get_object(const char *name
)
44 struct ubus_request req
;
47 blob_put_string(&b
, UBUS_ATTR_OBJPATH
, name
);
48 ubus_start_request(ctx
, &req
, b
.head
, UBUS_MSG_LOOKUP
, 0);
49 req
.data_cb
= store_objid
;
50 if (ubus_complete_request(ctx
, &req
))
56 static int usage(char *prog
)
59 "Usage: %s <command> [arguments...]\n"
61 " - list [<path>] List objects\n"
62 " - call <path> <method> [<message>] Call an object method\n"
67 int main(int argc
, char **argv
)
69 struct ubus_request req
;
73 ctx
= ubus_connect(NULL
);
75 fprintf(stderr
, "Failed to connect to ubus\n");
81 return usage(argv
[0]);
83 if (!strcmp(cmd
, "list")) {
87 blob_put_string(&b
, UBUS_ATTR_OBJPATH
, argv
[2]);
89 ubus_start_request(ctx
, &req
, b
.head
, UBUS_MSG_LOOKUP
, 0);
90 req
.data_cb
= receive_lookup
;
91 } else if (!strcmp(cmd
, "call")) {
92 if (argc
< 4 || argc
> 5)
93 return usage(argv
[0]);
95 if (get_object(argv
[2]) == 0) {
96 fprintf(stderr
, "Object not found\n");
100 blob_buf_init(&b
, 0);
101 blob_put_int32(&b
, UBUS_ATTR_OBJID
, objid
);
102 blob_put_string(&b
, UBUS_ATTR_METHOD
, argv
[3]);
103 ubus_start_request(ctx
, &req
, b
.head
, UBUS_MSG_INVOKE
, objid
);
105 return usage(argv
[0]);
108 ret
= ubus_complete_request(ctx
, &req
);
110 fprintf(stderr
, "Failed: %s\n", ubus_strerror(ret
));