From: Vsevolod Stakhov Date: Thu, 15 Mar 2018 14:00:33 +0000 (+0000) Subject: [Minor] Allow to require some Lua function in C X-Git-Tag: 1.7.1~42 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=83f4454b042f8c2b62e52ce447748823c7e52365;p=rspamd.git [Minor] Allow to require some Lua function in C --- diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index b44931682..f484c02b9 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -1897,3 +1897,49 @@ rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool, rspamd_mempool_add_destructor (pool, rspamd_lua_ref_dtor, cbdata); } } + +gboolean +rspamd_lua_require_function (lua_State *L, const gchar *modname, + const gchar *funcname) +{ + gint table_pos; + + lua_getglobal (L, "require"); + + if (lua_isnil (L, -1)) { + lua_pop (L, 1); + + return FALSE; + } + + lua_pushstring (L, modname); + + /* Now try to call */ + if (lua_pcall (L, 1, 1, 0) != 0) { + lua_pop (L, 1); + + return FALSE; + } + + /* Now we should have a table with results */ + if (!lua_istable (L, -1)) { + lua_pop (L, 1); + + return FALSE; + } + + table_pos = lua_gettop (L); + lua_pushstring (L, funcname); + lua_gettable (L, -2); + + if (lua_type (L, -1) == LUA_TFUNCTION) { + /* Remove table, preserve just a function */ + lua_remove (L, table_pos); + + return TRUE; + } + + lua_pop (L, 2); + + return FALSE; +} diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h index 0d95d9092..310a5504c 100644 --- a/src/lua/lua_common.h +++ b/src/lua/lua_common.h @@ -390,5 +390,15 @@ gboolean rspamd_lua_run_postloads (lua_State *L, struct rspamd_config *cfg, void rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool, gint ref); +/** + * Tries to load some module using `require` and get some method from it + * @param L + * @param modname + * @param funcname + * @return TRUE if function exists in that module, the function is pushed in stack, otherwise stack is unchanged and FALSE is returned + */ +gboolean rspamd_lua_require_function (lua_State *L, const gchar *modname, + const gchar *funcname); + #endif /* WITH_LUA */ #endif /* RSPAMD_LUA_H */