if (!lua_isuserdata(L, 1)) {
if (!global_ctx) {
global_ctx = uci_alloc_context();
- if (!global_ctx)
+ if (!global_ctx) {
luaL_error(L, "failed to allocate UCI context");
+ return NULL;
+ }
}
if (offset)
*offset = 0;
if (offset)
*offset = 1;
ctx = luaL_checkudata(L, 1, METANAME);
- if (!ctx || !*ctx)
+ if (!ctx || !*ctx) {
luaL_error(L, "failed to get UCI context");
+ return NULL;
+ }
return *ctx;
}
sep = strchr(str, '.');
if (sep) {
name = malloc(1 + sep - str);
- if (!name)
+ if (!name) {
luaL_error(L, "out of memory");
+ return NULL;
+ }
strncpy(name, str, sep - str);
name[sep - str] = 0;
} else
{
struct uci_context *ctx;
struct uci_package *p;
- struct uci_element *e;
+ struct uci_element *e, *tmp;
const char *package, *type;
bool ret = false;
int offset = 0;
type = luaL_checkstring(L, 2 + offset);
if (!lua_isfunction(L, 3 + offset) || !package)
- luaL_error(L, "Invalid argument");
+ return luaL_error(L, "Invalid argument");
p = find_package(L, ctx, package, true);
if (!p)
goto done;
- uci_foreach_element(&p->sections, e) {
+ uci_foreach_element_safe(&p->sections, tmp, e) {
struct uci_section *s = uci_to_section(e);
i++;
struct uci_ptr ptr;
int offset = 0;
char *s = NULL;
- int err = UCI_ERR_NOTFOUND;
ctx = find_context(L, &offset);
if (lookup_args(L, ctx, offset, &ptr, &s))
goto error;
- err = uci_delete(ctx, &ptr);
+ uci_delete(ctx, &ptr);
error:
if (s)
/* Format: uci.set("p", "s", "o", "v") */
if (lua_istable(L, nargs)) {
if (lua_objlen(L, nargs) < 1)
- luaL_error(L, "Cannot set an uci option to an empty table value");
+ return luaL_error(L, "Cannot set an uci option to an empty table value");
lua_rawgeti(L, nargs, 1);
ptr.value = luaL_checkstring(L, -1);
lua_pop(L, 1);
struct uci_element *e, *tmp;
struct uci_ptr ptr;
char *s = NULL;
- int failed = 0;
int nargs, offset = 0;
ctx = find_context(L, &offset);
uci_foreach_element_safe(&ctx->root, tmp, e) {
struct uci_package *p = uci_to_package(e);
- int ret = UCI_ERR_INVAL;
if (ptr.p && (ptr.p != p))
continue;
ptr.p = p;
switch(cmd) {
case CMD_COMMIT:
- ret = uci_commit(ctx, &p, false);
+ uci_commit(ctx, &p, false);
break;
case CMD_SAVE:
- ret = uci_save(ctx, p);
+ uci_save(ctx, p);
break;
case CMD_REVERT:
- ret = uci_revert(ctx, &ptr);
+ uci_revert(ctx, &ptr);
break;
}
-
- if (ret != 0)
- failed = 1;
}
err:
static void
uci_lua_add_change(lua_State *L, struct uci_element *e)
{
- struct uci_history *h;
+ struct uci_delta *h;
const char *name;
+ const char *value;
- h = uci_to_history(e);
+ h = uci_to_delta(e);
if (!h->section)
return;
lua_setfield(L, -3, h->section);
}
- name = (h->e.name ? h->e.name : ".type");
- if (h->value)
- lua_pushstring(L, h->value);
- else
- lua_pushstring(L, "");
- lua_setfield(L, -2, name);
+ name = h->e.name;
+ value = h->value ? h->value : "";
+
+ if (name) {
+ lua_getfield(L, -1, name);
+
+ /* this delta is a list add operation */
+ if (h->cmd == UCI_CMD_LIST_ADD) {
+ /* there seems to be no table yet */
+ if (!lua_istable(L, -1)) {
+ lua_newtable(L);
+
+ /* if there is a value on the stack already, add */
+ if (!lua_isnil(L, -2)) {
+ lua_pushvalue(L, -2);
+ lua_rawseti(L, -2, 1);
+ lua_pushstring(L, value);
+ lua_rawseti(L, -2, 2);
+
+ /* this is the first table item */
+ } else {
+ lua_pushstring(L, value);
+ lua_rawseti(L, -2, 1);
+ }
+
+ lua_setfield(L, -3, name);
+
+ /* a table is on the top of the stack and this is a subsequent,
+ * list_add, append this value to table */
+ } else {
+ lua_pushstring(L, value);
+ lua_rawseti(L, -2, lua_objlen(L, -2) + 1);
+ }
+
+ /* non-list change, simply set/replace field */
+ } else {
+ lua_pushstring(L, value);
+ lua_setfield(L, -3, name);
+ }
+
+ lua_pop(L, 1);
+ } else {
+ lua_pushstring(L, value);
+ lua_setfield(L, -2, ".type");
+ }
+
lua_pop(L, 1);
}
return;
}
- if (uci_list_empty(&p->history) && uci_list_empty(&p->saved_history))
+ if (uci_list_empty(&p->delta) && uci_list_empty(&p->saved_delta))
goto done;
lua_newtable(L);
- uci_foreach_element(&p->saved_history, e) {
+ uci_foreach_element(&p->saved_delta, e) {
uci_lua_add_change(L, e);
}
- uci_foreach_element(&p->history, e) {
+ uci_foreach_element(&p->delta, e) {
uci_lua_add_change(L, e);
}
lua_setfield(L, -2, p->e.name);
case 0:
break;
default:
- luaL_error(L, "invalid argument count");
+ return luaL_error(L, "invalid argument count");
}
lua_newtable(L);
uci_lua_set_confdir(lua_State *L)
{
struct uci_context *ctx;
- int ret, offset = 0;
+ int offset = 0;
ctx = find_context(L, &offset);
luaL_checkstring(L, 1 + offset);
- ret = uci_set_confdir(ctx, lua_tostring(L, -1));
+ uci_set_confdir(ctx, lua_tostring(L, -1));
return uci_push_status(L, ctx, false);
}
}
static int
-uci_lua_add_history(lua_State *L)
+uci_lua_add_delta(lua_State *L)
{
struct uci_context *ctx;
- int ret, offset = 0;
+ int 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_load_plugins(lua_State *L)
-{
- struct uci_context *ctx;
- int ret, offset = 0;
- const char *str = NULL;
-
- ctx = find_context(L, &offset);
- if (lua_isstring(L, -1))
- str = lua_tostring(L, -1);
- ret = uci_load_plugins(ctx, str);
+ uci_add_delta_path(ctx, lua_tostring(L, -1));
return uci_push_status(L, ctx, false);
}
uci_lua_set_savedir(lua_State *L)
{
struct uci_context *ctx;
- int ret, offset = 0;
+ int offset = 0;
ctx = find_context(L, &offset);
luaL_checkstring(L, 1 + offset);
- ret = uci_set_savedir(ctx, lua_tostring(L, -1));
+ uci_set_savedir(ctx, lua_tostring(L, -1));
return uci_push_status(L, ctx, false);
}
*u = uci_alloc_context();
if (!*u)
- luaL_error(L, "Cannot allocate UCI context");
+ return luaL_error(L, "Cannot allocate UCI context");
switch (argc) {
case 2:
if (lua_isstring(L, 2) &&
(uci_set_savedir(*u, luaL_checkstring(L, 2)) != UCI_OK))
- luaL_error(L, "Unable to set savedir");
+ return luaL_error(L, "Unable to set savedir");
/* fall through */
case 1:
if (lua_isstring(L, 1) &&
(uci_set_confdir(*u, luaL_checkstring(L, 1)) != UCI_OK))
- luaL_error(L, "Unable to set savedir");
+ return luaL_error(L, "Unable to set savedir");
break;
default:
break;
{ "reorder", uci_lua_reorder },
{ "changes", uci_lua_changes },
{ "foreach", uci_lua_foreach },
- { "add_history", uci_lua_add_history },
- { "load_plugins", uci_lua_load_plugins },
+ { "add_history", uci_lua_add_delta },
+ { "add_delta", uci_lua_add_delta },
{ "get_confdir", uci_lua_get_confdir },
{ "set_confdir", uci_lua_set_confdir },
{ "get_savedir", uci_lua_get_savedir },