summaryrefslogtreecommitdiffhomepage
path: root/libs
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2008-06-04 00:01:21 +0000
committerFelix Fietkau <nbd@openwrt.org>2008-06-04 00:01:21 +0000
commitf7fab0d54f3dfedb3a568c30f2569bd1b3cef5fe (patch)
tree326b84276a1b83ca78e4d983d0a795ec1fa75221 /libs
parent18efb3f75bd0c51f005ae247cbabc6bf3be41539 (diff)
allow the sgi-webuci prepare_req function to reload the lua context if necessary (not used yet)
Diffstat (limited to 'libs')
-rw-r--r--libs/sgi-webuci/root/usr/lib/boa/luci.lua1
-rw-r--r--libs/sgi-webuci/src/luci.c51
2 files changed, 36 insertions, 16 deletions
diff --git a/libs/sgi-webuci/root/usr/lib/boa/luci.lua b/libs/sgi-webuci/root/usr/lib/boa/luci.lua
index e34bd5e2d..c0dab39bc 100644
--- a/libs/sgi-webuci/root/usr/lib/boa/luci.lua
+++ b/libs/sgi-webuci/root/usr/lib/boa/luci.lua
@@ -47,6 +47,7 @@ function prepare_req(uri)
luci.dispatcher.createindex()
env = {}
env.REQUEST_URI = uri
+ -- TODO: setting luci-plugin.reload = true allows this function to trigger a context reload
end
function handle_req(context)
diff --git a/libs/sgi-webuci/src/luci.c b/libs/sgi-webuci/src/luci.c
index d65fc20b6..24d4324a9 100644
--- a/libs/sgi-webuci/src/luci.c
+++ b/libs/sgi-webuci/src/luci.c
@@ -27,56 +27,63 @@ static lua_State *L = NULL;
extern int luci_parse_header (lua_State *L);
-static int luci_init(struct httpd_plugin *p)
+static lua_State *luci_context_init(struct httpd_plugin *p)
{
char *path = NULL;
+ lua_State *Lnew;
int ret = 0;
- L = luaL_newstate();
- if (!L)
+ Lnew = luaL_newstate();
+ if (!Lnew)
goto error;
- luaL_openlibs(L);
+ luaL_openlibs(Lnew);
path = malloc(strlen(p->dir) + sizeof(LUAMAIN) + 2);
strcpy(path, p->dir);
strcat(path, "/" LUAMAIN);
- ret = luaL_dofile(L, path);
+ ret = luaL_dofile(Lnew, path);
- lua_getfield(L, LUA_GLOBALSINDEX, "luci-plugin");
+ lua_getfield(Lnew, LUA_GLOBALSINDEX, "luci-plugin");
do {
- if (!lua_istable(L, -1)) {
+ if (!lua_istable(Lnew, -1)) {
ret = 1;
break;
}
- lua_getfield(L, -1, "init");
- if (!lua_isfunction(L, -1))
+ lua_getfield(Lnew, -1, "init");
+ if (!lua_isfunction(Lnew, -1))
break;
- lua_pushstring(L, p->dir);
- ret = lua_pcall(L, 1, 0, 0);
+ lua_pushstring(Lnew, p->dir);
+ ret = lua_pcall(Lnew, 1, 0, 0);
} while (0);
free(path);
if (ret != 0)
goto error;
- return 1;
+ return Lnew;
error:
fprintf(stderr, "Error: ");
- if (L) {
- const char *s = lua_tostring(L, -1);
+ if (Lnew) {
+ const char *s = lua_tostring(Lnew, -1);
if (!s)
s = "unknown error";
fprintf(stderr, "%s\n", s);
- lua_close(L);
+ lua_close(Lnew);
} else {
fprintf(stderr, "Out of memory!\n");
}
- return 0;
+ return NULL;
+}
+
+static int luci_init(struct httpd_plugin *p)
+{
+ L = luci_context_init(p);
+ return (L != NULL);
}
static void pushvar(char *name, char *val)
@@ -116,8 +123,20 @@ done:
static int luci_prepare_req(struct httpd_plugin *p, struct http_context *ctx)
{
int ret;
+ bool reload = false;
lua_getglobal(L, "luci-plugin");
+ lua_getfield(L, -1, "reload");
+ if (lua_isboolean(L, -1))
+ reload = lua_toboolean(L, -1);
+ lua_pop(L, 1);
+
+ if (reload) {
+ lua_close(L);
+ L = luci_context_init(p);
+ lua_getglobal(L, "luci-plugin");
+ }
+
lua_getfield(L, -1, "prepare_req");
ret = lua_isfunction(L, -1);