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;
+
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;
}
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 (!lua_isfunction(L, 3) || !package)
luaL_error(L, "Invalid argument");
- p = find_package(package);
+ p = find_package(L, package, true);
if (!p)
goto done;
goto error;
}
- p = find_package(package);
+ p = find_package(L, package, true);
if (!p) {
err = UCI_ERR_NOTFOUND;
goto error;
do {
package = luaL_checkstring(L, 1);
type = luaL_checkstring(L, 2);
- p = find_package(package);
+ p = find_package(L, package, true);
if (!p)
break;
goto error;
}
- p = find_package(package);
+ p = find_package(L, package, true);
if (!p) {
err = UCI_ERR_NOTFOUND;
goto error;
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;
}