From: Felix Fietkau Date: Wed, 4 Jun 2008 00:01:21 +0000 (+0000) Subject: allow the sgi-webuci prepare_req function to reload the lua context if necessary... X-Git-Tag: 0.8.0~884 X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=f7fab0d54f3dfedb3a568c30f2569bd1b3cef5fe allow the sgi-webuci prepare_req function to reload the lua context if necessary (not used yet) --- 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);