summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2008-08-19 22:22:18 +0200
committerFelix Fietkau <nbd@openwrt.org>2008-08-19 22:22:18 +0200
commite1738122f616e3dce498598d55f84fa8a7e2263b (patch)
treee626f0fc316f0bacc04f5afd178aac2e922086b2
parent28d2cc2adde3f9ec077a77cf363045a17f116032 (diff)
downloaduci-e1738122f616e3dce498598d55f84fa8a7e2263b.tar.gz
lua: allow uci.set() to create/update a list value
-rw-r--r--lua/uci.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/lua/uci.c b/lua/uci.c
index b3be0c9..1c67742 100644
--- a/lua/uci.c
+++ b/lua/uci.c
@@ -401,7 +401,8 @@ uci_lua_set(lua_State *L)
const char *value = NULL;
const char *s;
int err = UCI_ERR_MEM;
- int nargs;
+ int i, nargs;
+ bool istable = false;
nargs = lua_gettop(L);
@@ -424,7 +425,16 @@ uci_lua_set(lua_State *L)
/* Format: uci.set("p", "s", "v") */
package = s;
section = luaL_checkstring(L, 2);
- value = luaL_checkstring(L, nargs);
+ if (lua_istable(L, nargs)) {
+ if (lua_objlen(L, nargs) < 1)
+ luaL_error(L, "Cannot set an uci option to an empty table value");
+ lua_rawgeti(L, nargs, 1);
+ value = luaL_checkstring(L, -1);
+ lua_pop(L, 1);
+ istable = true;
+ } else {
+ value = luaL_checkstring(L, nargs);
+ }
break;
default:
err = UCI_ERR_INVAL;
@@ -442,6 +452,16 @@ uci_lua_set(lua_State *L)
goto error;
}
err = uci_set(ctx, p, section, option, value, NULL);
+ if (istable) {
+ for (i = 2; i <= lua_objlen(L, nargs); i++) {
+ lua_rawgeti(L, nargs, i);
+ value = luaL_checkstring(L, -1);
+ err = uci_add_list(ctx, p, section, option, value, NULL);
+ lua_pop(L, 1);
+ if (err)
+ goto error;
+ }
+ }
error:
if (err)