2 * Copyright (C) 2011 Felix Fietkau <nbd@openwrt.org>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License version 2.1
6 * as published by the Free Software Foundation
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
16 #include <libubox/blobmsg_json.h>
19 static struct ubus_context
*ctx
;
20 static struct ubus_subscriber test_event
;
21 static struct blob_buf b
;
29 static const struct blobmsg_policy hello_policy
[] = {
30 [HELLO_ID
] = { .name
= "id", .type
= BLOBMSG_TYPE_INT32
},
31 [HELLO_MSG
] = { .name
= "msg", .type
= BLOBMSG_TYPE_STRING
},
34 struct hello_request
{
35 struct ubus_request_data req
;
36 struct uloop_timeout timeout
;
40 static void test_hello_reply(struct uloop_timeout
*t
)
42 struct hello_request
*req
= container_of(t
, struct hello_request
, timeout
);
45 blobmsg_add_string(&b
, "message", req
->data
);
46 ubus_send_reply(ctx
, &req
->req
, b
.head
);
47 ubus_complete_deferred_request(ctx
, &req
->req
, 0);
51 static int test_hello(struct ubus_context
*ctx
, struct ubus_object
*obj
,
52 struct ubus_request_data
*req
, const char *method
,
53 struct blob_attr
*msg
)
55 struct hello_request
*hreq
;
56 struct blob_attr
*tb
[__HELLO_MAX
];
57 const char *format
= "%s received a message: %s";
58 const char *msgstr
= "(unknown)";
60 blobmsg_parse(hello_policy
, ARRAY_SIZE(hello_policy
), tb
, blob_data(msg
), blob_len(msg
));
63 msgstr
= blobmsg_data(tb
[HELLO_MSG
]);
65 hreq
= calloc(1, sizeof(*hreq
) + strlen(format
) + strlen(obj
->name
) + strlen(msgstr
) + 1);
66 sprintf(hreq
->data
, format
, obj
->name
, msgstr
);
67 ubus_defer_request(ctx
, req
, &hreq
->req
);
68 hreq
->timeout
.cb
= test_hello_reply
;
69 uloop_timeout_set(&hreq
->timeout
, 1000);
80 static const struct blobmsg_policy watch_policy
[__WATCH_MAX
] = {
81 [WATCH_ID
] = { .name
= "id", .type
= BLOBMSG_TYPE_INT32
},
82 [WATCH_COUNTER
] = { .name
= "counter", .type
= BLOBMSG_TYPE_INT32
},
86 test_handle_remove(struct ubus_context
*ctx
, struct ubus_subscriber
*s
,
89 fprintf(stderr
, "Object %08x went away\n", id
);
93 test_notify(struct ubus_context
*ctx
, struct ubus_object
*obj
,
94 struct ubus_request_data
*req
, const char *method
,
95 struct blob_attr
*msg
)
100 str
= blobmsg_format_json(msg
, true);
101 fprintf(stderr
, "Received notification '%s': %s\n", method
, str
);
108 static int test_watch(struct ubus_context
*ctx
, struct ubus_object
*obj
,
109 struct ubus_request_data
*req
, const char *method
,
110 struct blob_attr
*msg
)
112 struct blob_attr
*tb
[__WATCH_MAX
];
115 blobmsg_parse(watch_policy
, __WATCH_MAX
, tb
, blob_data(msg
), blob_len(msg
));
117 return UBUS_STATUS_INVALID_ARGUMENT
;
119 test_event
.remove_cb
= test_handle_remove
;
120 test_event
.cb
= test_notify
;
121 ret
= ubus_subscribe(ctx
, &test_event
, blobmsg_get_u32(tb
[WATCH_ID
]));
122 fprintf(stderr
, "Watching object %08x: %s\n", blobmsg_get_u32(tb
[WATCH_ID
]), ubus_strerror(ret
));
126 static const struct ubus_method test_methods
[] = {
127 UBUS_METHOD("hello", test_hello
, hello_policy
),
128 UBUS_METHOD("watch", test_watch
, watch_policy
),
131 static struct ubus_object_type test_object_type
=
132 UBUS_OBJECT_TYPE("test", test_methods
);
134 static struct ubus_object test_object
= {
136 .type
= &test_object_type
,
137 .methods
= test_methods
,
138 .n_methods
= ARRAY_SIZE(test_methods
),
141 static void server_main(void)
145 ret
= ubus_add_object(ctx
, &test_object
);
147 fprintf(stderr
, "Failed to add object: %s\n", ubus_strerror(ret
));
149 ret
= ubus_register_subscriber(ctx
, &test_event
);
151 fprintf(stderr
, "Failed to add watch handler: %s\n", ubus_strerror(ret
));
156 int main(int argc
, char **argv
)
158 const char *ubus_socket
= NULL
;
161 while ((ch
= getopt(argc
, argv
, "cs:")) != -1) {
164 ubus_socket
= optarg
;
176 ctx
= ubus_connect(ubus_socket
);
178 fprintf(stderr
, "Failed to connect to ubus\n");