116 lines
3.6 KiB
C
116 lines
3.6 KiB
C
|
|
/*************************************************************************
|
||
|
|
> File Name: lua_plugin_cfunc.c
|
||
|
|
> Author:
|
||
|
|
> Created Time: 2024-08
|
||
|
|
> Encoding : UTF-8
|
||
|
|
************************************************************************/
|
||
|
|
|
||
|
|
/*************************************************************************
|
||
|
|
* version
|
||
|
|
* [ v0.1 ]
|
||
|
|
* 08-06
|
||
|
|
* 1. 实现函数
|
||
|
|
* void *lpm_ctx_new_func;
|
||
|
|
* void lpm_ctx_free_func;
|
||
|
|
************************************************************************/
|
||
|
|
#include "lua_plugin_manage_internal.h"
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Function: lpm_ctx_new_func
|
||
|
|
* Input: | struct session * | sess | 会话信息
|
||
|
|
* | void * | plugin_env | 插件运行环境
|
||
|
|
* Output:
|
||
|
|
* Return: | NULL | 运行函数错误
|
||
|
|
* | pointer | 运行插件上的ctx_new函数成功, 返回context
|
||
|
|
* Description: 与C插件管理器保持一致的ctx_new_func
|
||
|
|
*/
|
||
|
|
void *lpm_ctx_new_func(
|
||
|
|
struct session *sess,
|
||
|
|
void *plugin_env)
|
||
|
|
{
|
||
|
|
if (__glibc_unlikely(!sess || !plugin_env))
|
||
|
|
return NULL;
|
||
|
|
struct lua_plugin_env *env = (struct lua_plugin_env *)plugin_env;
|
||
|
|
|
||
|
|
/* 获取插件ID并找到该插件 */
|
||
|
|
// int plugin_id = session_get_pluginid(sess);
|
||
|
|
int plugin_id = 1;
|
||
|
|
struct lua_session_plugin *plugin = NULL;
|
||
|
|
while ((plugin = utarray_next(env->plugin_env_plugin_array, plugin)))
|
||
|
|
{
|
||
|
|
if (plugin->plugin_id == plugin_id)
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if (!plugin || plugin->plugin_id != plugin_id)
|
||
|
|
/* 未找到该插件 */
|
||
|
|
return NULL;
|
||
|
|
|
||
|
|
struct lua_context *new_context = lua_context_new(env->plugin_env_state);
|
||
|
|
if (__glibc_unlikely(!new_context))
|
||
|
|
/* 创建新的context失败 */
|
||
|
|
return NULL;
|
||
|
|
|
||
|
|
struct lua_cdata param[3] = {0};
|
||
|
|
param[0].cdata_type = DATATYPE_POINTER;
|
||
|
|
param[0].cdata_pointer = sess;
|
||
|
|
param[1].cdata_type = DATATYPE_TABLE;
|
||
|
|
param[1].cdata_table = env->plugin_env_ref_id;
|
||
|
|
param[2].cdata_type = DATATYPE_CONTEXT;
|
||
|
|
param[2].cdata_context = new_context;
|
||
|
|
|
||
|
|
if (script_execute(&plugin->plugin_ctx_new_script, 3, param, 0, NULL))
|
||
|
|
{
|
||
|
|
/* 脚本执行失败 */
|
||
|
|
free(new_context);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
return (void *)new_context;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Function: lpm_ctx_free_func
|
||
|
|
* Input: | struct session * | sess | 会话信息
|
||
|
|
* | void * | sess_ctx | 会话中的私有数据
|
||
|
|
* | void * | plugin_env | 插件运行环境
|
||
|
|
* Output:
|
||
|
|
* Return:
|
||
|
|
* Description: 与C插件管理器保持一致的ctx_free_func
|
||
|
|
*/
|
||
|
|
void lpm_ctx_free_func(
|
||
|
|
struct session *sess,
|
||
|
|
void *sess_ctx,
|
||
|
|
void *plugin_env)
|
||
|
|
{
|
||
|
|
if (__glibc_unlikely(!sess || !sess_ctx || !plugin_env))
|
||
|
|
return;
|
||
|
|
struct lua_context *context = (struct lua_context *)sess_ctx;
|
||
|
|
struct lua_plugin_env *env = (struct lua_plugin_env *)plugin_env;
|
||
|
|
|
||
|
|
/* 获取插件ID并找到该插件 */
|
||
|
|
// int plugin_id = session_get_pluginid(sess);
|
||
|
|
int plugin_id = 1;
|
||
|
|
struct lua_session_plugin *plugin = NULL;
|
||
|
|
while ((plugin = utarray_next(env->plugin_env_plugin_array, plugin)))
|
||
|
|
{
|
||
|
|
if (plugin->plugin_id == plugin_id)
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if (!plugin || plugin->plugin_id != plugin_id)
|
||
|
|
/* 未找到该插件 */
|
||
|
|
return;
|
||
|
|
|
||
|
|
struct lua_cdata param[3] = {0};
|
||
|
|
param[0].cdata_type = DATATYPE_POINTER;
|
||
|
|
param[0].cdata_pointer = sess;
|
||
|
|
param[1].cdata_type = DATATYPE_CONTEXT;
|
||
|
|
param[1].cdata_context = context;
|
||
|
|
param[2].cdata_type = DATATYPE_TABLE;
|
||
|
|
param[2].cdata_table = env->plugin_env_ref_id;
|
||
|
|
|
||
|
|
script_execute(&plugin->plugin_ctx_free_script, 3, param, 0, NULL);
|
||
|
|
lua_context_free(context);
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|