summaryrefslogtreecommitdiff
path: root/src/lua_plugin_cfunc.c
blob: 4115453cb65b3021010f920352096517b5248d11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include "lua_binding_function.h"

void *lpm_ctx_new_func(struct session *sess, void *plugin_env)
{
    if (!plugin_env)
        return NULL;
    struct lua_session_plugin_env *env = (struct lua_session_plugin_env *)plugin_env;
    struct lua_plugin_manage *plugin_manage = env->plugin_manage;
    struct stellar *st = plugin_manage->st;

    int thread_id = stellar_get_current_thread_id(st);
    struct lua_state *state = (struct lua_state *)plugin_manage->state_array[thread_id];
    struct lua_context *new_context = lua_context_new(state);

    struct lua_cdata param[3] = {0};
    param[0].type = DATATYPE_POINTER;
    param[0].pointer = sess;
    param[1].type = DATATYPE_TABLE;
    param[1].table = env->lua_plug_env_ref_id;
    param[2].type = DATATYPE_CONTEXT;
    param[2].context = new_context;

    if (lua_chunk_execute(state, env->lua_ctx_new_fn_ref_id, param, 3, NULL, 0, NULL, 0))
    {
        lua_context_free(new_context);
        return NULL;
    }
    return (void *)new_context;
}

void lpm_ctx_free_func(struct session *sess, void *sess_ctx, void *plugin_env)
{
    if (!plugin_env)
        return;
    struct lua_session_plugin_env *env = (struct lua_session_plugin_env *)plugin_env;
    struct lua_plugin_manage *plugin_manage = env->plugin_manage;
    struct stellar *st = plugin_manage->st;

    int thread_id = stellar_get_current_thread_id(st);
    struct lua_state *state = plugin_manage->state_array[thread_id];

    struct lua_cdata param[3] = {0};
    param[0].type = DATATYPE_POINTER;
    param[0].pointer = sess;
    param[1].type = DATATYPE_CONTEXT;
    param[1].context = (struct lua_context *)sess_ctx;
    param[2].type = DATATYPE_TABLE;
    param[2].table = env->lua_plug_env_ref_id;

    lua_chunk_execute(state, env->lua_ctx_free_fn_ref_id, param, 3, NULL, 0, NULL, 0);
    lua_context_free((struct lua_context *)sess_ctx);
    return;
}

void lpm_session_message_free_func(struct session *sess, void *msg, void *msg_free_arg)
{
    if (!msg_free_arg)
        return;
    struct lua_message_free_arg *free_arg = (struct lua_message_free_arg *)msg_free_arg;
    struct lua_plugin_manage *plugin_manage = free_arg->plugin_manage;
    struct stellar *st = plugin_manage->st;

    int thread_id = stellar_get_current_thread_id(st);
    struct lua_state *state = plugin_manage->state_array[thread_id];

    struct lua_cdata param[3] = {0};
    param[0].type = DATATYPE_POINTER;
    param[0].pointer = sess;
    param[1].type = DATATYPE_CONTEXT;
    param[1].context = (struct lua_context *)msg;
    param[2].type = DATATYPE_TABLE;
    param[2].table = free_arg->lua_msg_free_arg_ref_id;

    lua_chunk_execute(state, free_arg->lua_msg_free_fn_ref_id, param, 3, NULL, 0, NULL, 0);
    lua_context_free((struct lua_context *)msg);
    return;
}

void lpm_on_session_msg_func(struct session *sess, int topic_id, const void *msg, void *sess_ctx, void *plugin_env)
{
    if (!plugin_env)
        return;

    struct lua_session_plugin_env *env = (struct lua_session_plugin_env *)plugin_env;
    struct lua_plugin_manage *plugin_manage = env->plugin_manage;
    struct lua_on_message_fn *on_message = hash_find_on_msg_fn(plugin_manage->on_session_message_hashlist, topic_id, env->session_plugin_id);
    struct stellar *st = plugin_manage->st;

    int thread_id = stellar_get_current_thread_id(st);
    struct lua_state *state = plugin_manage->state_array[thread_id];

    struct lua_cdata param[5] = {0};
    param[0].type = DATATYPE_POINTER;
    param[0].pointer = sess;
    param[1].type = DATATYPE_INT;
    param[1].integer = topic_id;
    /* 这里是不是有更好的办法 */
    struct lua_context *context = (struct lua_context *)msg;
    if (context && context->magic_code == context_magic_code)
    {
        param[2].type = DATATYPE_CONTEXT;
        param[2].context = context;
    }
    else
    {
        param[2].type = DATATYPE_POINTER;
        param[2].pointer = (void *)msg;
    }
    param[3].type = DATATYPE_CONTEXT;
    param[3].context = (struct lua_context *)sess_ctx;
    param[4].type = DATATYPE_TABLE;
    param[4].table = env->lua_plug_env_ref_id;

    lua_chunk_execute(state, on_message->lua_on_msg_fn_ref_id, param, 5, NULL, 0, NULL, 0);
    return;
}

void lpm_on_packet_func(struct packet *pkt, unsigned char ip_protocol, void *plugin_env)
{
    if (!plugin_env)
        return;

    struct lua_packet_plugin_env *env = (struct lua_packet_plugin_env *)plugin_env;
    struct lua_plugin_manage *plugin_manage = env->plugin_manage;
    struct stellar *st = plugin_manage->st;

    int thread_id = stellar_get_current_thread_id(st);
    struct lua_state *state = plugin_manage->state_array[thread_id];

    struct lua_cdata param[3] = {0};
    param[0].type = DATATYPE_POINTER;
    param[0].pointer = pkt;
    param[1].type = DATATYPE_INT;
    param[1].integer = (int)ip_protocol;
    param[2].type = DATATYPE_TABLE;
    param[2].table = env->lua_plug_env_ref_id;

    lua_chunk_execute(state, env->lua_on_packet_fn_ref_id, param, 3, NULL, 0, NULL, 0);
    return;
}

void lpm_packet_message_free_func(struct packet *pkt, void *msg, void *msg_free_arg)
{
    if (!msg_free_arg)
        return;
    struct lua_message_free_arg *free_arg = (struct lua_message_free_arg *)msg_free_arg;
    struct lua_plugin_manage *plugin_manage = free_arg->plugin_manage;
    struct stellar *st = plugin_manage->st;

    int thread_id = stellar_get_current_thread_id(st);
    struct lua_state *state = plugin_manage->state_array[thread_id];

    struct lua_cdata param[3] = {0};
    param[0].type = DATATYPE_POINTER;
    param[0].pointer = pkt;
    param[1].type = DATATYPE_CONTEXT;
    param[1].context = (struct lua_context *)msg;
    param[2].type = DATATYPE_TABLE;
    param[2].table = free_arg->lua_msg_free_arg_ref_id;

    lua_chunk_execute(state, free_arg->lua_msg_free_fn_ref_id, param, 3, NULL, 0, NULL, 0);
    lua_context_free((struct lua_context *)msg);
    return;
}

void lpm_on_packet_msg_func(struct packet *pkt, int topic_id, const void *msg, void *plugin_env)
{
    if (!plugin_env)
        return;

    struct lua_packet_plugin_env *env = (struct lua_packet_plugin_env *)plugin_env;
    struct lua_plugin_manage *plugin_manage = env->plugin_manage;
    struct lua_on_message_fn *on_message = hash_find_on_msg_fn(plugin_manage->on_packet_message_hashlist, topic_id, env->packet_plugin_id);
    struct stellar *st = plugin_manage->st;

    int thread_id = stellar_get_current_thread_id(st);
    struct lua_state *state = plugin_manage->state_array[thread_id];

    struct lua_cdata param[4] = {0};
    param[0].type = DATATYPE_POINTER;
    param[0].pointer = pkt;
    param[1].type = DATATYPE_INT;
    param[1].integer = topic_id;
    /* 这里是不是有更好的办法 */
    struct lua_context *context = (struct lua_context *)msg;
    if (context && context->magic_code == context_magic_code)
    {
        param[2].type = DATATYPE_CONTEXT;
        param[2].context = (struct lua_context *)msg;
    }
    else
    {
        param[2].type = DATATYPE_POINTER;
        param[2].pointer = (void *)msg;
    }
    param[3].type = DATATYPE_TABLE;
    param[3].table = env->lua_plug_env_ref_id;

    lua_chunk_execute(state, on_message->lua_on_msg_fn_ref_id, param, 5, NULL, 0, NULL, 0);
    return;
}