X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=lua%2Fuci.c;h=70d02054062ecde669f864329cf07bcfd6a16346;hp=50321fb6591fe5318fefc832645eb991c77c4913;hb=cd9311c8d6b7432f507e9eed12587c971875a9de;hpb=43124956bc9c1083e476f6cadaedf27b7788d004 diff --git a/lua/uci.c b/lua/uci.c index 50321fb..70d0205 100644 --- a/lua/uci.c +++ b/lua/uci.c @@ -185,7 +185,7 @@ uci_push_option(lua_State *L, struct uci_option *o) } static void -uci_push_section(lua_State *L, struct uci_section *s) +uci_push_section(lua_State *L, struct uci_section *s, int index) { struct uci_element *e; @@ -196,6 +196,10 @@ uci_push_section(lua_State *L, struct uci_section *s) lua_setfield(L, -2, ".type"); lua_pushstring(L, s->e.name); lua_setfield(L, -2, ".name"); + if (index >= 0) { + lua_pushinteger(L, index); + lua_setfield(L, -2, ".index"); + } uci_foreach_element(&s->options, e) { struct uci_option *o = uci_to_option(e); @@ -212,9 +216,9 @@ uci_push_package(lua_State *L, struct uci_package *p) lua_newtable(L); uci_foreach_element(&p->sections, e) { - i++; - uci_push_section(L, uci_to_section(e)); + uci_push_section(L, uci_to_section(e), i); lua_setfield(L, -2, e->name); + i++; } } @@ -266,6 +270,7 @@ uci_lua_foreach(lua_State *L) const char *package, *type; bool ret = false; int offset = 0; + int i = 0; ctx = find_context(L, &offset); package = luaL_checkstring(L, 1 + offset); @@ -285,11 +290,13 @@ uci_lua_foreach(lua_State *L) uci_foreach_element(&p->sections, e) { struct uci_section *s = uci_to_section(e); + i++; + if (type && (strcmp(s->type, type) != 0)) continue; lua_pushvalue(L, 3 + offset); /* iterator function */ - uci_push_section(L, s); + uci_push_section(L, s, i - 1); if (lua_pcall(L, 1, 0, 0) == 0) ret = true; } @@ -332,7 +339,7 @@ uci_lua_get_any(lua_State *L, bool all) break; case UCI_TYPE_SECTION: if (all) - uci_push_section(L, ptr.s); + uci_push_section(L, ptr.s, -1); else lua_pushstring(L, ptr.s->type); break; @@ -419,6 +426,56 @@ error: } static int +uci_lua_rename(lua_State *L) +{ + struct uci_context *ctx; + struct uci_ptr ptr; + int err = UCI_ERR_MEM; + char *s = NULL; + int nargs, offset = 0; + + ctx = find_context(L, &offset); + nargs = lua_gettop(L); + if (lookup_args(L, ctx, offset, &ptr, &s)) + goto error; + + switch(nargs - offset) { + case 1: + /* Format: uci.set("p.s.o=v") or uci.set("p.s=v") */ + break; + case 4: + /* Format: uci.set("p", "s", "o", "v") */ + ptr.value = luaL_checkstring(L, nargs); + break; + case 3: + /* Format: uci.set("p", "s", "v") */ + ptr.value = ptr.option; + ptr.option = NULL; + break; + default: + err = UCI_ERR_INVAL; + goto error; + } + + err = uci_lookup_ptr(ctx, &ptr, NULL, false); + if (err) + goto error; + + if (((ptr.s == NULL) && (ptr.option != NULL)) || (ptr.value == NULL)) { + err = UCI_ERR_INVAL; + goto error; + } + + err = uci_rename(ctx, &ptr); + if (err) + goto error; + +error: + return uci_push_status(L, ctx, false); +} + + +static int uci_lua_set(lua_State *L) { struct uci_context *ctx; @@ -469,12 +526,19 @@ uci_lua_set(lua_State *L) goto error; } - err = uci_set(ctx, &ptr); - if (err) - goto error; - if (istable) { - for (i = 2; i <= lua_objlen(L, nargs); i++) { + if (lua_objlen(L, nargs) == 1) { + i = 1; + if (ptr.o) + err = uci_delete(ctx, &ptr); + } else { + i = 2; + err = uci_set(ctx, &ptr); + if (err) + goto error; + } + + for (; i <= lua_objlen(L, nargs); i++) { lua_rawgeti(L, nargs, i); ptr.value = luaL_checkstring(L, -1); err = uci_add_list(ctx, &ptr); @@ -482,8 +546,13 @@ uci_lua_set(lua_State *L) if (err) goto error; } + } else { + err = uci_set(ctx, &ptr); + if (err) + goto error; } + error: return uci_push_status(L, ctx, false); } @@ -684,6 +753,18 @@ uci_lua_get_savedir(lua_State *L) } static int +uci_lua_add_history(lua_State *L) +{ + struct uci_context *ctx; + int ret, offset = 0; + + ctx = find_context(L, &offset); + luaL_checkstring(L, 1 + offset); + ret = uci_add_history_path(ctx, lua_tostring(L, -1)); + return uci_push_status(L, ctx, false); +} + +static int uci_lua_set_savedir(lua_State *L) { struct uci_context *ctx; @@ -742,12 +823,14 @@ static const luaL_Reg uci[] = { { "get_all", uci_lua_get_all }, { "add", uci_lua_add }, { "set", uci_lua_set }, + { "rename", uci_lua_rename }, { "save", uci_lua_save }, { "delete", uci_lua_delete }, { "commit", uci_lua_commit }, { "revert", uci_lua_revert }, { "changes", uci_lua_changes }, { "foreach", uci_lua_foreach }, + { "add_history", uci_lua_add_history }, { "get_confdir", uci_lua_get_confdir }, { "set_confdir", uci_lua_set_confdir }, { "get_savedir", uci_lua_get_savedir },