static int inject_message_analysis(lua_State *lua) { luaL_checktype(lua, 1, LUA_TTABLE); lsb_lua_sandbox *lsb = lua_touserdata(lua, lua_upvalueindex(1)); if (NULL == lsb) { return luaL_error(lua, "%s() invalid lightuserdata", im_func_name); } lsb_heka_sandbox *hsb = lsb_get_parent(lsb); lua_pushstring(lua, hsb->name); lua_setfield(lua, 1, LSB_LOGGER); lua_pushstring(lua, hsb->hostname); lua_setfield(lua, 1, LSB_HOSTNAME); if (heka_encode_message_table(lsb, 1)) { return luaL_error(lua, "%s() failed: %s", im_func_name, lsb_get_error(lsb)); } size_t output_len = 0; const char *output = lsb_get_output(lsb, &output_len); if (hsb->cb.aim(hsb->parent, output, output_len) != 0) { return luaL_error(lua, "%s() failed: rejected by the callback", im_func_name); } ++hsb->stats.im_cnt; hsb->stats.im_bytes += output_len; return 0; }
int heka_encode_message(lua_State *lua) { int n = lua_gettop(lua); bool framed = false; switch (n) { case 2: luaL_checktype(lua, 2, LUA_TBOOLEAN); framed = lua_toboolean(lua, 2); // fall thru case 1: luaL_checktype(lua, 1, LUA_TTABLE); break; default: return luaL_argerror(lua, n, "incorrect number of arguments"); } lsb_lua_sandbox *lsb = lua_touserdata(lua, lua_upvalueindex(1)); if (!lsb) { return luaL_error(lua, "encode_message() invalid upvalueindex"); } lsb_heka_sandbox *hsb = lsb_get_parent(lsb); set_missing_headers(lua, 1, hsb); lsb->output.pos = 0; lsb_err_value ret = heka_encode_message_table(lsb, 1); if (ret) { const char *err = lsb_get_error(lsb); if (strlen(err) == 0) err = ret; return luaL_error(lua, "encode_message() failed: %s", err); } size_t len = 0; const char *output = lsb_get_output(lsb, &len); lsb->usage[LSB_UT_OUTPUT][LSB_US_CURRENT] = len; if (framed) { char header[14] = "\x1e\x00\x08"; // up to 10 varint bytes and a \x1f int hlen = lsb_pb_output_varint(header + 3, len) + 1; lsb->usage[LSB_UT_OUTPUT][LSB_US_CURRENT] = len + hlen + LSB_HDR_FRAME_SIZE; header[1] = (char)hlen; header[hlen + 2] = '\x1f'; luaL_Buffer b; luaL_buffinit(lua, &b); luaL_addlstring(&b, header, hlen + LSB_HDR_FRAME_SIZE); luaL_addlstring(&b, output, len); luaL_pushresult(&b); } else { lua_pushlstring(lua, output, len); } if (lsb->usage[LSB_UT_OUTPUT][LSB_US_CURRENT] > lsb->usage[LSB_UT_OUTPUT][LSB_US_MAXIMUM]) { lsb->usage[LSB_UT_OUTPUT][LSB_US_MAXIMUM] = lsb->usage[LSB_UT_OUTPUT][LSB_US_CURRENT]; } return 1; }
static int inject_message_input(lua_State *lua) { lsb_lua_sandbox *lsb = lua_touserdata(lua, lua_upvalueindex(1)); if (NULL == lsb) { return luaL_error(lua, "%s() invalid lightuserdata", im_func_name); } const char *scp = NULL; double ncp = NAN; int t = lua_type(lua, 2); switch (t) { case LUA_TNUMBER: ncp = lua_tonumber(lua, 2); break; case LUA_TSTRING: scp = lua_tostring(lua, 2); break; case LUA_TNONE: case LUA_TNIL: break; default: return luaL_error(lua, "%s() unsupported checkpoint type: %s", im_func_name, lua_typename(lua, t)); } lsb_const_string output; t = lua_type(lua, 1); switch (t) { case LUA_TUSERDATA: { heka_stream_reader *hsr = luaL_checkudata(lua, 1, mozsvc_heka_stream_reader); if (hsr->msg.raw.s) { output.len = hsr->msg.raw.len; output.s = hsr->msg.raw.s; } else { return luaL_error(lua, "%s() attempted to inject a nil message", im_func_name); } } break; case LUA_TSTRING: { lsb_heka_message m; lsb_init_heka_message(&m, 8); output.s = lua_tolstring(lua, 1, &output.len); bool ok = lsb_decode_heka_message(&m, output.s, output.len, NULL); lsb_free_heka_message(&m); if (!ok) { return luaL_error(lua, "%s() attempted to inject a invalid protobuf " "string", im_func_name); } } break; case LUA_TTABLE: if (heka_encode_message_table(lsb, 1)) { const char *err = lsb_get_error(lsb); if (strlen(err) == 0) err = "exceeded output_limit"; return luaL_error(lua, "%s() failed: %s", im_func_name, err); } output.len = 0; output.s = lsb_get_output(lsb, &output.len); break; default: return luaL_error(lua, "%s() unsupported message type: %s", im_func_name, lua_typename(lua, t)); } lsb_heka_sandbox *hsb = lsb_get_parent(lsb); if (hsb->cb.iim(hsb->parent, output.s, output.len, ncp, scp) != 0) { return luaL_error(lua, "%s() failed: rejected by the callback", im_func_name); } ++hsb->stats.im_cnt; hsb->stats.im_bytes += output.len; return 0; }