X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubus.git;a=blobdiff_plain;f=lua%2Fubus.c;h=92fb0a151fb9ac445938abc3e68848f4b49fc192;hp=84ee06bd1e37f5aca3d47920d03200baeeccc051;hb=7b79b6226e737e28aafb4e9b668b86b5f180314b;hpb=8ea96670367e5dd23988b51ee4f0f790393effaf diff --git a/lua/ubus.c b/lua/ubus.c index 84ee06b..92fb0a1 100644 --- a/lua/ubus.c +++ b/lua/ubus.c @@ -19,8 +19,8 @@ #include #include -#define MODNAME "ubus" -#define METANAME MODNAME ".meta" +#define MODNAME "ubus" +#define METANAME MODNAME ".meta" static lua_State *state; @@ -285,10 +285,13 @@ ubus_method_handler(struct ubus_context *ctx, struct ubus_object *obj, struct blob_attr *msg) { struct ubus_lua_object *o = container_of(obj, struct ubus_lua_object, o); + int rv = 0; lua_getglobal(state, "__ubus_cb"); lua_rawgeti(state, -1, o->r); lua_getfield(state, -1, method); + lua_remove(state, -2); + lua_remove(state, -2); if (lua_isfunction(state, -1)) { lua_pushlightuserdata(state, req); @@ -296,9 +299,13 @@ ubus_method_handler(struct ubus_context *ctx, struct ubus_object *obj, lua_pushnil(state); else ubus_lua_parse_blob_array(state, blob_data(msg), blob_len(msg), true); - lua_call(state, 2, 0); - } - return 0; + lua_call(state, 2, 1); + if (lua_isnumber(state, -1)) + rv = lua_tonumber(state, -1); + } else + lua_pop(state, 1); + + return rv; } static int lua_gettablelen(lua_State *L, int index) @@ -349,12 +356,11 @@ static int ubus_lua_load_methods(lua_State *L, struct ubus_method *m) /* get the policy table */ lua_pushinteger(L, 2); lua_gettable(L, -3); - plen = lua_gettablelen(L, -1); /* check if the method table is valid */ if ((lua_type(L, -2) != LUA_TFUNCTION) || (lua_type(L, -1) != LUA_TTABLE) || - lua_objlen(L, -1) || !plen) { + lua_objlen(L, -1)) { lua_pop(L, 2); return 1; } @@ -363,6 +369,17 @@ static int ubus_lua_load_methods(lua_State *L, struct ubus_method *m) lua_pushvalue(L, -2); lua_setfield(L, -6, lua_tostring(L, -5)); + m->name = lua_tostring(L, -4); + m->handler = ubus_method_handler; + + plen = lua_gettablelen(L, -1); + + /* exit if policy table is empty */ + if (!plen) { + lua_pop(L, 2); + return 0; + } + /* setup the policy pointers */ p = malloc(sizeof(struct blobmsg_policy) * plen); memset(p, 0, sizeof(struct blobmsg_policy) * plen); @@ -386,8 +403,6 @@ static int ubus_lua_load_methods(lua_State *L, struct ubus_method *m) } m->n_policy = pidx; - m->name = lua_tostring(L, -4); - m->handler = ubus_method_handler; lua_pop(L, 2); return 0; @@ -417,7 +432,7 @@ static struct ubus_object* ubus_lua_load_object(lua_State *L) obj->o.type->id = 0; obj->o.type->methods = obj->o.methods; - /* create the he callback lookup table */ + /* create the callback lookup table */ lua_createtable(L, 1, 0); lua_getglobal(L, "__ubus_cb"); lua_pushvalue(L, -2);