lua: add 'defer_request' and 'complete_deferred_request' functions
authorVasily Goldobin <vasily@lynxtech.ru>
Wed, 16 Nov 2016 15:26:13 +0000 (20:26 +0500)
committerJohn Crispin <john@phrozen.org>
Mon, 21 Nov 2016 10:27:05 +0000 (11:27 +0100)
Add Lua bindings for 'ubus_defer_request' and 'ubus_complete_deferred_request' functions with sample code.

Signed-off-by: Vasily Goldobin <vasily@lynxtech.ru>
lua/test.lua
lua/ubus.c

index d24ac6e43b5124fd01003ba41a25dd025c2e2a9a..277956a99259b2e4a154ed2487aa5d270268009d 100755 (executable)
@@ -34,6 +34,18 @@ local my_method = {
                                conn:reply(req, {message="foo2"});
                                print("Call to function 'hello1'")
                        end, {id = ubus.INT32, msg = ubus.STRING }
+               },
+               deferred = {
+                       function(req)
+                               conn:reply(req, {message="wait for it"})
+                               local def_req = conn:defer_request(req)
+                               uloop.timer(function()
+                                               conn:reply(def_req, {message="done"})
+                                               conn:complete_deferred_request(def_req, 0)
+                                               print("Deferred request complete")
+                                       end, 2000)
+                               print("Call to function 'deferred'")
+                       end, {}
                }
        }
 }
index f59af90c20d10debc874a68d086b9bf781d25fff..74a15b058dee1b4df0af8461dafd9bdc6ba4c43c 100644 (file)
@@ -352,6 +352,26 @@ static int ubus_lua_reply(lua_State *L)
        return 0;
 }
 
+static int ubus_lua_defer_request(lua_State *L)
+{
+       struct ubus_lua_connection *c = luaL_checkudata(L, 1, METANAME);
+       struct ubus_request_data *req = lua_touserdata(L, 2);
+       struct ubus_request_data *new_req = lua_newuserdata(L, sizeof(struct ubus_request_data));
+       ubus_defer_request(c->ctx, req, new_req);
+
+       return 1;
+}
+
+static int ubus_lua_complete_deferred_request(lua_State *L)
+{
+       struct ubus_lua_connection *c = luaL_checkudata(L, 1, METANAME);
+       struct ubus_request_data *req = lua_touserdata(L, 2);
+       int ret = luaL_checkinteger(L, 3);
+       ubus_complete_deferred_request(c->ctx, req, ret);
+
+       return 0;
+}
+
 static int ubus_lua_load_methods(lua_State *L, struct ubus_method *m)
 {
        struct blobmsg_policy *p;
@@ -920,6 +940,8 @@ static const luaL_Reg ubus[] = {
        { "add", ubus_lua_add },
        { "notify", ubus_lua_notify },
        { "reply", ubus_lua_reply },
+       { "defer_request", ubus_lua_defer_request },
+       { "complete_deferred_request", ubus_lua_complete_deferred_request },
        { "signatures", ubus_lua_signatures },
        { "call", ubus_lua_call },
        { "close", ubus_lua__gc },