module_exports

这个结构在每个模块中都有,这个有点类似js的export或者说是node.js的module.export。

这是一个接口的规范。

重要讲解几个关键点:

  • local_zone_code是模块名字,这个是必需的
  • cmds表示在opensips脚本里可以有那些暴露的函数
  • params规定了模块的参数
  • mod_init在模块初始化的时候会被调用, 只会被调用一次

关于module_exports这个结构的定义,可以查阅:sr_module.h文件

struct module_exports exports= {
    "local_zone_code",
    MOD_TYPE_DEFAULT,/* class of this module */
    MODULE_VERSION,
    DEFAULT_DLFLAGS, /* dlopen flags */
    0,               /* load function */
    NULL,            /* OpenSIPS module dependencies */
    cmds,
    0,
    params,
    0,          /* exported statistics */
    0,          /* exported MI functions */
    0,          /* exported pseudo-variables */
    0,          /* exported transformations */
    0,          /* extra processes */
    0,          /* pre-init function */
    mod_init,
    (response_function) 0,
    (destroy_function) 0,
    0  /* per-child init function */
};

cmds

struct cmd_export_ {
    char* name;             /* opensips脚本里的函数名 */
    cmd_function function;  /* 关联的C代码里的函数 */
    int param_no;           /* 参数的个数 */
    fixup_function fixup;   /* 修正参数 */
    free_fixup_function free_fixup; /* 修正参数的 */
    int flags;              /* 函数flag,主要是用来标记函数可以在哪些路由中使用 */
};

cmd_function

typedef  int (*cmd_function)(struct sip_msg*, char*, char*, char*, char*,
            char*, char*);

cmd_function与fixup_function的关系

  • cmd_function是在opensips运行后,在路由脚本中会执行到
  • fixup_function实际上是在opensips运行前,脚本解析完成后会执行
  • fixup_function的目的是在脚本解析阶段发现参数的问题,或者修改某些参数的值

真实的栗子:

static cmd_export_t cmds[]={
    {"lzc_change", (cmd_function)change_code, 2, change_code_fix, 0, REQUEST_ROUTE},
    {0,0,0,0,0,0}
};

static int change_code_fix(void** param, int param_no)
{
    LM_INFO("enter change_code_fix: param: %s\n", (char *)*param);
    LM_INFO("enter change_code_fix: param_no: %d\n", param_no);
    LM_INFO("enter change_code_fix: local_zone_code: %s len:%d\n", local_zone_code.s,local_zone_code.len);
    return 0;
}

上面的定义,可以在opensips脚本中使用lzc_change这个函数。这个函数对应c代码里的change_code函数。这个函数允许接受2两个参数。

opensips脚本

route{
   lzc_change("abcd","desf");
}

debug日志:从日志可以看出来lzc_change有两个参数,change_code_fix被调用了两次,每次调用可以获取参数的值,和参数的序号。

DBG:core:fix_actions: fixing lzc_change, opensips.mf2.cfg:18
INFO:local_zone_code:change_code_fix: enter change_code_fix: param: abcd
INFO:local_zone_code:change_code_fix: enter change_code_fix: param_no: 1
INFO:local_zone_code:change_code_fix: enter change_code_fix: local_zone_code: 0728 len:4
INFO:local_zone_code:change_code_fix: enter change_code_fix: param: desf
INFO:local_zone_code:change_code_fix: enter change_code_fix: param_no: 2
INFO:local_zone_code:change_code_fix: enter change_code_fix: local_zone_code: 0728 len:4