30 static const char suricata_flowvar_mt[] =
"suricata:flowvar:mt";
46 static int LuaFlowvarRegister(
lua_State *L)
50 return luaL_error(L,
"flowvar API not available in this context");
53 return luaL_error(L,
"flowvar.register() must be called from init()");
55 const char *
name = luaL_checkstring(L, 1);
59 return luaL_error(L,
"too many flowvars registered");
62 if (flowvar_id == NULL) {
63 return luaL_error(L,
"failed to allocate flowvar");
66 if (*flowvar_id == 0) {
67 return luaL_error(L,
"failed to register flowvar");
71 luaL_getmetatable(L, suricata_flowvar_mt);
72 lua_setmetatable(L, -2);
79 const char *
name = luaL_checkstring(L, 1);
81 if (flowvar_id == NULL) {
82 return luaL_error(L,
"failed to allocate flowvar");
85 if (*flowvar_id == 0) {
86 return luaL_error(L,
"flowvar does not exist");
89 luaL_getmetatable(L, suricata_flowvar_mt);
90 lua_setmetatable(L, -2);
115 const char *value = luaL_checklstring(L, 2, &slen);
116 lua_Integer req = luaL_optinteger(L, 3, (lua_Integer)slen);
117 if (req < 0 || ((
size_t)req > slen) || (
size_t)req > UINT16_MAX) {
118 return luaL_error(L,
"length out of range");
120 const size_t len = (size_t)req;
124 return luaL_error(L,
"no flow");
129 return luaL_error(L,
"alloc failure");
131 memcpy(buf, value,
len);
140 static const luaL_Reg flowvarlib[] = {
142 {
"register", LuaFlowvarRegister, },
143 {
"get", LuaFlowvarGet },
148 static const luaL_Reg flowvarmt[] = {
150 {
"value", LuaFlowvarValue, },
151 {
"set", LuaFlowvarSet, },
158 luaL_newmetatable(L, suricata_flowvar_mt);
159 lua_pushvalue(L, -1);
160 lua_setfield(L, -2,
"__index");
161 luaL_setfuncs(L, flowvarmt, 0);
163 luaL_newlib(L, flowvarlib);