diff options
author | Felix Fietkau <nbd@openwrt.org> | 2008-08-19 22:22:18 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2008-08-19 22:22:18 +0200 |
commit | e1738122f616e3dce498598d55f84fa8a7e2263b (patch) | |
tree | e626f0fc316f0bacc04f5afd178aac2e922086b2 | |
parent | 28d2cc2adde3f9ec077a77cf363045a17f116032 (diff) | |
download | uci-e1738122f616e3dce498598d55f84fa8a7e2263b.tar.gz |
lua: allow uci.set() to create/update a list value
-rw-r--r-- | lua/uci.c | 24 |
1 files changed, 22 insertions, 2 deletions
@@ -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) |