diff options
author | Steven Barth <steven@midlink.org> | 2014-03-20 12:59:15 +0100 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2014-03-20 12:59:15 +0100 |
commit | c7a8e2380a5299d48a851717e139c0876e85483e (patch) | |
tree | 20c6d6b3f73e2fd38389b7bb3a6746d1048341ae /src/ubus.c | |
parent | 2e486ef14235777e5c71a6e15044637025d0770c (diff) |
ubus: convert to async calls
Diffstat (limited to 'src/ubus.c')
-rw-r--r-- | src/ubus.c | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -13,6 +13,7 @@ static struct ubus_subscriber netifd; static struct blob_buf b; static struct blob_attr *dump = NULL; static uint32_t objid = 0; +static struct ubus_request req_dump = { .list = LIST_HEAD_INIT(req_dump.list) }; static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_object *obj, @@ -188,6 +189,19 @@ static void handle_dump(_unused struct ubus_request *req, _unused int type, stru } +static void update_netifd(bool subscribe) +{ + if (subscribe) + ubus_subscribe(ubus, &netifd, objid); + + ubus_abort_request(ubus, &req_dump); + if (!ubus_invoke_async(ubus, objid, "dump", NULL, &req_dump)) { + req_dump.data_cb = handle_dump; + ubus_complete_request_async(ubus, &req_dump); + } +} + + static int handle_update(_unused struct ubus_context *ctx, _unused struct ubus_object *obj, _unused struct ubus_request_data *req, _unused const char *method, struct blob_attr *msg) @@ -208,18 +222,11 @@ static int handle_update(_unused struct ubus_context *ctx, _unused struct ubus_o if (iface && iface->ignore) return 0; - ubus_invoke(ubus, objid, "dump", NULL, handle_dump, NULL, 0); + update_netifd(false); return 0; } -static void subscribe_netifd(void) -{ - ubus_subscribe(ubus, &netifd, objid); - ubus_invoke(ubus, objid, "dump", NULL, handle_dump, NULL, 0); -} - - void ubus_apply_network(void) { struct blob_attr *a; @@ -288,7 +295,7 @@ static void handle_event(_unused struct ubus_context *ctx, _unused struct ubus_e return; objid = blobmsg_get_u32(tb[OBJ_ATTR_ID]); - subscribe_netifd(); + update_netifd(true); } static struct ubus_event_handler event_handler = { .cb = handle_event }; @@ -429,7 +436,7 @@ int init_ubus(void) ubus_add_object(ubus, &main_object); ubus_register_event_handler(ubus, &event_handler, "ubus.object.add"); if (!ubus_lookup_id(ubus, "network.interface", &objid)) - subscribe_netifd(); + update_netifd(true); return 0; } |