static int inject_payload(lua_State *lua) { static const char *default_type = "txt"; lsb_lua_sandbox *lsb = lua_touserdata(lua, lua_upvalueindex(1)); if (!lsb) { return luaL_error(lua, "%s invalid lightuserdata", __FUNCTION__); } int n = lua_gettop(lua); if (n > 2) { lsb_output(lsb, 3, n, 1); lua_pop(lua, n - 2); } size_t len = 0; const char *output = lsb_get_output(lsb, &len); if (!len) return 0; if (n > 0) { if (lua_type(lua, 1) != LUA_TSTRING) { return luaL_error(lua, "%s() payload_type argument must be a string", __FUNCTION__); } } if (n > 1) { if (lua_type(lua, 2) != LUA_TSTRING) { return luaL_error(lua, "%s() payload_name argument must be a string", __FUNCTION__); } } // build up a heka message table lua_createtable(lua, 0, 2); // message lua_createtable(lua, 0, 2); // Fields if (n > 0) { lua_pushvalue(lua, 1); } else { lua_pushstring(lua, default_type); } lua_setfield(lua, -2, "payload_type"); if (n > 1) { lua_pushvalue(lua, 2); lua_setfield(lua, -2, "payload_name"); } lua_setfield(lua, -2, LSB_FIELDS); lua_pushstring(lua, "inject_payload"); lua_setfield(lua, -2, LSB_TYPE); lua_pushlstring(lua, output, len); lua_setfield(lua, -2, LSB_PAYLOAD); if (lua_gettop(lua) > 1) lua_replace(lua, 1); inject_message_analysis(lua); return 0; }
static int output(lua_State *lua) { lsb_lua_sandbox *lsb = lua_touserdata(lua, lua_upvalueindex(1)); if (NULL == lsb) { return luaL_error(lua, "output() invalid lightuserdata"); } int n = lua_gettop(lua); if (n == 0) { return luaL_argerror(lsb->lua, 0, "must have at least one argument"); } lsb_output(lsb, 1, n, 1); return 0; }
static int inject_payload(lua_State* lua) { static const char* default_type = "txt"; static const char* func_name = "inject_payload"; void* luserdata = lua_touserdata(lua, lua_upvalueindex(1)); if (NULL == luserdata) { return luaL_error(lua, "%s invalid lightuserdata", func_name); } lua_sandbox* lsb = (lua_sandbox*)luserdata; int n = lua_gettop(lua); if (n > 2) { lsb_output(lsb, 3, n, 1); lua_pop(lua, n - 2); } size_t len = 0; const char* output = lsb_get_output(lsb, &len); if (!len) return 0; if (n > 0) { if (lua_type(lua, 1) != LUA_TSTRING) { return luaL_error(lua, "%s() payload_type argument must be a string", func_name); } } if (n > 1) { if (lua_type(lua, 2) != LUA_TSTRING) { return luaL_error(lua, "%s() payload_name argument must be a string", func_name); } } // build up a heka message table lua_createtable(lua, 0, 2); // message lua_createtable(lua, 0, 2); // Fields if (n > 0) { lua_pushvalue(lua, 1); } else { lua_pushstring(lua, default_type); } lua_setfield(lua, -2, "payload_type"); if (n > 1) { lua_pushvalue(lua, 2); lua_setfield(lua, -2, "payload_name"); } lua_setfield(lua, -2, "Fields"); lua_pushstring(lua, "inject_payload"); lua_setfield(lua, -2, "Type"); lua_pushlstring(lua, output, len); lua_setfield(lua, -2, "Payload"); lua_replace(lua, 1); // use inject_message to actually deliver it lua_getglobal(lua, "inject_message"); lua_CFunction fp = lua_tocfunction(lua, -1); lua_pop(lua, 1); // remove function pointer if (fp) { fp(lua); } else { return luaL_error(lua, "%s() failed to call inject_message", func_name); } return 0; }