projects
/
project
/
uci.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
e137b2f
)
implement autoload for uci lua binding (optional, enabled by default)
author
Felix Fietkau
<nbd@openwrt.org>
Mon, 26 May 2008 14:09:46 +0000
(16:09 +0200)
committer
Felix Fietkau
<nbd@openwrt.org>
Mon, 26 May 2008 14:09:46 +0000
(16:09 +0200)
lua/uci.c
patch
|
blob
|
history
diff --git
a/lua/uci.c
b/lua/uci.c
index
988c9b9
..
f98a9c9
100644
(file)
--- a/
lua/uci.c
+++ b/
lua/uci.c
@@
-36,17
+36,35
@@
static struct uci_context *ctx = NULL;
static struct uci_package *
static struct uci_context *ctx = NULL;
static struct uci_package *
-find_package(
const char *name
)
+find_package(
lua_State *L, const char *name, bool autoload
)
{
struct uci_package *p = NULL;
struct uci_element *e;
{
struct uci_package *p = NULL;
struct uci_element *e;
+
uci_foreach_element(&ctx->root, e) {
if (strcmp(e->name, name) != 0)
continue;
p = uci_to_package(e);
uci_foreach_element(&ctx->root, e) {
if (strcmp(e->name, name) != 0)
continue;
p = uci_to_package(e);
- break;
+ goto done;
+ }
+
+ if (autoload) {
+ do {
+ lua_getfield(L, LUA_GLOBALSINDEX, "uci");
+ lua_getfield(L, -1, "autoload");
+ if (!lua_isboolean(L, -1))
+ break;
+
+ if (!lua_toboolean(L, -1))
+ break;
+
+ uci_load(ctx, name, &p);
+ } while (0);
+ lua_pop(L, 2);
}
}
+
+done:
return p;
}
return p;
}
@@
-107,7
+125,7
@@
uci_lua_unload(lua_State *L)
luaL_checkstring(L, 1);
s = lua_tostring(L, -1);
luaL_checkstring(L, 1);
s = lua_tostring(L, -1);
- p = find_package(
s
);
+ p = find_package(
L, s, false
);
if (p) {
uci_unload(ctx, p);
lua_pushboolean(L, 1);
if (p) {
uci_unload(ctx, p);
lua_pushboolean(L, 1);
@@
-156,7
+174,7
@@
uci_lua_foreach(lua_State *L)
if (!lua_isfunction(L, 3) || !package)
luaL_error(L, "Invalid argument");
if (!lua_isfunction(L, 3) || !package)
luaL_error(L, "Invalid argument");
- p = find_package(
packag
e);
+ p = find_package(
L, package, tru
e);
if (!p)
goto done;
if (!p)
goto done;
@@
-211,7
+229,7
@@
uci_lua_get_any(lua_State *L, bool all)
goto error;
}
goto error;
}
- p = find_package(
packag
e);
+ p = find_package(
L, package, tru
e);
if (!p) {
err = UCI_ERR_NOTFOUND;
goto error;
if (!p) {
err = UCI_ERR_NOTFOUND;
goto error;
@@
-282,7
+300,7
@@
uci_lua_add(lua_State *L)
do {
package = luaL_checkstring(L, 1);
type = luaL_checkstring(L, 2);
do {
package = luaL_checkstring(L, 1);
type = luaL_checkstring(L, 2);
- p = find_package(
packag
e);
+ p = find_package(
L, package, tru
e);
if (!p)
break;
if (!p)
break;
@@
-341,7
+359,7
@@
uci_lua_set(lua_State *L)
goto error;
}
goto error;
}
- p = find_package(
packag
e);
+ p = find_package(
L, package, tru
e);
if (!p) {
err = UCI_ERR_NOTFOUND;
goto error;
if (!p) {
err = UCI_ERR_NOTFOUND;
goto error;
@@
-492,5
+510,12
@@
luaopen_uci(lua_State *L)
if (!ctx)
luaL_error(L, "Cannot allocate UCI context\n");
luaL_register(L, MODNAME, uci);
if (!ctx)
luaL_error(L, "Cannot allocate UCI context\n");
luaL_register(L, MODNAME, uci);
+
+ /* enable autoload by default */
+ lua_getfield(L, LUA_GLOBALSINDEX, "uci");
+ lua_pushboolean(L, 1);
+ lua_setfield(L, -2, "autoload");
+ lua_pop(L, 1);
+
return 0;
}
return 0;
}