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
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)
/* 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);
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;
}
}
{
struct uci_delta *h;
const char *name;
+ const char *value;
h = uci_to_delta(e);
if (!h->section)
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);
}
case 0:
break;
default:
- luaL_error(L, "invalid argument count");
+ return luaL_error(L, "invalid argument count");
}
lua_newtable(L);
*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;