假如一个模块暴露了一个函数,叫做do_something(), 仅支持传递一个参数。这个函数在c文件中对应w_do_something()

// 在opensips.cfg文件中

route{
	do_something("abc")
}

static int w_do_something(struct sip_msg* msg, char* str1){
 	// 在c文件中,我们打印str1的值,这个字符串就是abc
}
// 在opensips.cfg文件中

route{
	$var(num)="abc";
	do_something("$var(num)")
}

static int w_do_something(struct sip_msg* msg, char* str1){
 	// 在c文件中,我们打印str1的值,这个字符串就是$var(num)
  // 这时候就有问题了,其实我们想获取的是$var(num)的值abc, 而不是字符串$var(num)
}

那怎么获取$var()的传参的值呢?这里就需要用到了函数的fixup_函数。

static cmd_export_t cmds[]={
    {"find_zone_code", (cmd_function)w_do_something, 2, fixup_do_something, 0, REQUEST_ROUTE},
    {0,0,0,0,0,0}
};

// 调用fixup_spve, 只有在fixup函数中,对函数的参数执行了fixup, 在真正的执行函数中,才能得到真正的$var()的值
static int fixup_do_something(void** param, int param_no)
{
    LM_INFO("fixup_find_zone_code: param: %s  param_no: %d\n", (char *)*param, param_no);
    return fixup_spve(param);
}


static int w_do_something (struct sip_msg* msg, char* str1){
    str zone;

    if (fixup_get_svalue(msg, (gparam_p)str1, &zone) != 0) {
        LM_WARN("cannot find the phone!\n");
        return -1;
    }
    
    LM_INFO("zone:%s\n", zone.s);
    return 1;
}