コード例 #1
0
ファイル: lua_sandbox_private.c プロジェクト: Fewbytes/heka
int inject_message(lua_State* lua)
{
    static const char* default_type = "txt";
    static const char* default_name = "";
    void* luserdata = lua_touserdata(lua, lua_upvalueindex(1));
    if (NULL == luserdata) {
        lua_pushstring(lua, "inject_message() invalid lightuserdata");
        lua_error(lua);
    }
    lua_sandbox* lsb = (lua_sandbox*)luserdata;

    int n = lua_gettop(lua);
    if (n > 2) {
        lua_pushstring(lua, "inject_message() takes a maximum of 2 arguments");
        lua_error(lua);
    }

    const char* type = default_type;
    const char* name = default_name;
    switch (n) {
    case 2:
        name = luaL_checkstring(lua, 2);
        // fall thru
    case 1:
        type = luaL_checkstring(lua, 1);
        break;
    }

    if (lsb->m_output.m_pos != 0) {
        int result = go_lua_inject_message(lsb->m_go, 
                                           lsb->m_output.m_data,
                                           (char*)type,
                                           (char*)name);
        lsb->m_output.m_pos = 0;
        if (result != 0) {
            lua_pushstring(lua, "inject_message() exceeded MaxMsgLoops");
            lua_error(lua);
        }
    }
    return 0;
}
コード例 #2
0
ファイル: lua_sandbox_private.c プロジェクト: hellcoderz/heka
int inject_message(lua_State* lua)
{
    void* luserdata = lua_touserdata(lua, lua_upvalueindex(1));
    if (NULL == luserdata) {
        lua_pushstring(lua, "inject_message() invalid lightuserdata");
        lua_error(lua);
    }
    if (lua_gettop(lua) != 0) {
        lua_pushstring(lua, "inject_message() takes no arguments");
        lua_error(lua);
    }
    lua_sandbox* lsb = (lua_sandbox*)luserdata;

    if (lsb->m_output.m_pos != 0) {
        int result = go_lua_inject_message(lsb->m_go, lsb->m_output.m_data);
        lsb->m_output.m_pos = 0;
        if (result != 0) {
            lua_pushstring(lua, "inject_message() exceeded MaxMsgLoops");
            lua_error(lua);
        }
    }
    return 0;
}
コード例 #3
0
ファイル: lua_sandbox_private.c プロジェクト: KushalP/heka
int inject_message(lua_State* lua)
{
    static const char* default_type = "txt";
    static const char* default_name = "";
    void* luserdata = lua_touserdata(lua, lua_upvalueindex(1));
    if (NULL == luserdata) {
        luaL_error(lua, "inject_message() invalid lightuserdata");
    }
    lua_sandbox* lsb = (lua_sandbox*)luserdata;

    void* ud = NULL;
    const char* type = default_type;
    const char* name = default_name;
    switch (lua_gettop(lua)) {
    case 0:
        break;
    case 2:
        name = luaL_checkstring(lua, 2);
        // fallthru
    case 1:
        switch (lua_type(lua, 1)) {
        case LUA_TSTRING:
            type = lua_tostring(lua, 1);
            if (strlen(type) == 0) type = default_type;
            break;
        case LUA_TTABLE:
            type = "";
            if (serialize_table_as_pb(lsb) != 0) {
                luaL_error(lua, "inject_message() cound not encode protobuf - %s",
                           lsb->m_error_message);
            }
            break;
        case LUA_TUSERDATA:
            ud = lua_touserdata(lua, 1);
            if (heka_circular_buffer == userdata_type(lua, ud, 1)) {
                circular_buffer* cb = (circular_buffer*)ud;
                type = get_output_format(cb);
                lsb->m_output.m_pos = 0;
                if (output_circular_buffer(lua, cb, &lsb->m_output)) {
                    luaL_error(lua, lsb->m_error_message);
                }
            } else {
                luaL_typerror(lua, 1, "circular_buffer");
            }
            break;
        default:
            luaL_typerror(lua, 1, "string, table, or circular_buffer");
            break;
        }
        break;
    default:
        luaL_error(lua, "inject_message() takes a maximum of 2 arguments");
        break;
    }

    if (lsb->m_output.m_pos != 0) {
        update_output_stats(lsb);
        if (lsb->m_usage[USAGE_TYPE_OUTPUT][USAGE_STAT_CURRENT]
            > lsb->m_usage[USAGE_TYPE_OUTPUT][USAGE_STAT_LIMIT]) {
            if (lsb->m_error_message[0] == 0) {
                luaL_error(lua, "output_limit exceeded");
            }
            luaL_error(lua, lsb->m_error_message);
        }
        int result = go_lua_inject_message(lsb->m_go,
                                           lsb->m_output.m_data,
                                           (int)(lsb->m_output.m_pos),
                                           (char*)type,
                                           (char*)name);
        lsb->m_output.m_pos = 0;
        if (result != 0) {
            luaL_error(lua, "inject_message() exceeded MaxMsgLoops");
        }
    }
    return 0;
}