return LuaCallbackFileStatePushToStackFromFile(luastate, file);
}
+/** \internal
+ * \brief fill lua stack with thread info
+ * \param luastate the lua state
+ * \param pa pointer to packet alert struct
+ * \retval cnt number of data items placed on the stack
+ *
+ * Places: thread id (number), thread name (string, thread group name (string)
+ */
+static int LuaCallbackThreadInfoPushToStackFromThreadVars(lua_State *luastate, const ThreadVars *tv)
+{
+ u_long tid = SCGetThreadIdLong();
+ lua_pushinteger (luastate, (lua_Integer)tid);
+ lua_pushstring (luastate, tv->name);
+ lua_pushstring (luastate, tv->thread_group_name);
+ return 3;
+}
+
+/** \internal
+ * \brief Wrapper for getting tuple info into a lua script
+ * \retval cnt number of items placed on the stack
+ */
+static int LuaCallbackThreadInfo(lua_State *luastate)
+{
+ const ThreadVars *tv = LuaStateGetThreadVars(luastate);
+ if (tv == NULL)
+ return LuaCallbackError(luastate, "internal error: no tv");
+
+ return LuaCallbackThreadInfoPushToStackFromThreadVars(luastate, tv);
+}
+
int LogLuaRegisterFunctions(lua_State *luastate)
{
/* registration of the callbacks */
lua_pushcfunction(luastate, LuaCallbackFileState);
lua_setglobal(luastate, "SCFileState");
+ lua_pushcfunction(luastate, LuaCallbackThreadInfo);
+ lua_setglobal(luastate, "SCThreadInfo");
return 0;
}
SCMutexLock(&td->lua_ctx->m);
+ LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
LuaStateSetTX(td->lua_ctx->luastate, txptr);
LuaStateSetFlow(td->lua_ctx->luastate, f, /* locked */FALSE);
lua_getglobal(td->lua_ctx->luastate, "log");
+ LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */TRUE);
LuaStateSetPacketAlert(td->lua_ctx->luastate, (PacketAlert *)pa);
SCMutexLock(&td->lua_ctx->m);
lua_getglobal(td->lua_ctx->luastate, "log");
+ LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* unlocked */TRUE);
SCMutexLock(&td->lua_ctx->m);
+ LuaStateSetThreadVars(td->lua_ctx->luastate, tv);
LuaStateSetPacket(td->lua_ctx->luastate, (Packet *)p);
LuaStateSetTX(td->lua_ctx->luastate, txptr);
LuaStateSetFlow(td->lua_ctx->luastate, p->flow, /* locked */FALSE);
#include <lualib.h>
#include <lauxlib.h>
+/* key for tv (threadvars) pointer */
+const char lua_ext_key_tv[] = "suricata:lua:tv:ptr";
/* key for tx pointer */
const char lua_ext_key_tx[] = "suricata:lua:tx:ptr";
/* key for p (packet) pointer */
/* key for file pointer */
const char lua_ext_key_file[] = "suricata:lua:file:ptr";
+/** \brief get tv pointer from the lua state */
+ThreadVars *LuaStateGetThreadVars(lua_State *luastate)
+{
+ lua_pushlightuserdata(luastate, (void *)&lua_ext_key_tv);
+ lua_gettable(luastate, LUA_REGISTRYINDEX);
+ void *tv = lua_touserdata(luastate, -1);
+ return (ThreadVars *)tv;
+}
+
+void LuaStateSetThreadVars(lua_State *luastate, ThreadVars *tv)
+{
+ lua_pushlightuserdata(luastate, (void *)&lua_ext_key_tv);
+ lua_pushlightuserdata(luastate, (void *)tv);
+ lua_settable(luastate, LUA_REGISTRYINDEX);
+}
+
/** \brief get packet pointer from the lua state */
Packet *LuaStateGetPacket(lua_State *luastate)
{
/* gets */
+/** \brief get tv pointer from the lua state */
+ThreadVars *LuaStateGetThreadVars(lua_State *luastate);
+
Packet *LuaStateGetPacket(lua_State *luastate);
void *LuaStateGetTX(lua_State *luastate);
void LuaStateSetFile(lua_State *luastate, File *file);
+void LuaStateSetThreadVars(lua_State *luastate, ThreadVars *tv);
+
void LuaPrintStack(lua_State *state);
#endif /* HAVE_LUA */