summaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-03-15 14:00:33 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-03-15 14:00:33 +0000
commit83f4454b042f8c2b62e52ce447748823c7e52365 (patch)
treef1424bf2661356ea2675e35ad56379f7ad3d9c1d /src/lua
parent7a580591aabfda1fc1474c8baba45b8b9a679195 (diff)
downloadrspamd-83f4454b042f8c2b62e52ce447748823c7e52365.tar.gz
rspamd-83f4454b042f8c2b62e52ce447748823c7e52365.zip
[Minor] Allow to require some Lua function in C
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_common.c46
-rw-r--r--src/lua/lua_common.h10
2 files changed, 56 insertions, 0 deletions
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 */