diff --git a/src/core/cfg.lex b/src/core/cfg.lex index cd6808d0630..0bd8fbc40a3 100644 --- a/src/core/cfg.lex +++ b/src/core/cfg.lex @@ -113,7 +113,7 @@ struct sr_yy_fname *next; } *sr_yy_fname_list = 0; - static str *pp_define_get(int len, const char * text); + str *pp_define_get(int len, const char * text); static int pp_ifdef_type(int pos); static void pp_ifdef_var(int len, const char * text); static void pp_ifdef(); @@ -1828,7 +1828,7 @@ int pp_define_set(int len, char *text) return 0; } -static str *pp_define_get(int len, const char * text) +str *pp_define_get(int len, const char * text) { str var = {(char *)text, len}; int i; diff --git a/src/core/ppcfg.c b/src/core/ppcfg.c index f8688988aa5..0e634bbbe63 100644 --- a/src/core/ppcfg.c +++ b/src/core/ppcfg.c @@ -32,6 +32,7 @@ #include "dprint.h" #include "ppcfg.h" +#include "fmsg.h" typedef struct _pp_subst_rule { char *indata; @@ -184,7 +185,8 @@ int pp_subst_run(char **data) i = 0; while(pr) { - result=subst_str(*data, 0, + sip_msg_t *fmsg = faked_msg_get_next(); + result=subst_str(*data, fmsg, (struct subst_expr*)pr->ppdata, 0); /* pkg malloc'ed result */ if(result!=NULL) { diff --git a/src/modules/pv/pv.c b/src/modules/pv/pv.c index 63c158680b7..447ed8f0b4c 100644 --- a/src/modules/pv/pv.c +++ b/src/modules/pv/pv.c @@ -188,6 +188,8 @@ static pv_export_t mod_pvs[] = { {{"dd", (sizeof("dd")-1)}, /* */ PVT_OTHER, pv_get_dsturi_attr, 0, 0, 0, pv_init_iname, 1}, + {{"def", (sizeof("env")-1)}, PVT_OTHER, pv_get_def, 0, + pv_parse_def_name, 0, 0, 0}, {{"di", (sizeof("di")-1)}, /* */ PVT_OTHER, pv_get_diversion, 0, 0, 0, pv_init_iname, 1}, diff --git a/src/modules/pv/pv_core.c b/src/modules/pv/pv_core.c index b087f5ad1b9..37d9cfb616d 100644 --- a/src/modules/pv/pv_core.c +++ b/src/modules/pv/pv_core.c @@ -3494,3 +3494,28 @@ int pv_get_env(sip_msg_t *msg, pv_param_t *param, pv_value_t *res) return pv_get_null(msg, param, res); } +int pv_parse_def_name(pv_spec_p sp, str *in) +{ + if (in == NULL || in->s == NULL || sp == NULL) { + LM_ERR("INVALID DEF NAME\n"); + return -1; + } + sp->pvp.pvn.type = PV_NAME_INTSTR; + sp->pvp.pvn.u.isname.type = AVP_NAME_STR; + sp->pvp.pvn.u.isname.name.s = *in; + return 0; + +} + +extern str *pp_define_get(int len, const char * text); + +int pv_get_def(sip_msg_t *msg, pv_param_t *param, pv_value_t *res) +{ + str *val = pp_define_get(param->pvn.u.isname.name.s.len, param->pvn.u.isname.name.s.s); + + if (val) { + return pv_get_strval(msg, param, res, val); + } + return pv_get_null(msg, param, res); +} + diff --git a/src/modules/pv/pv_core.h b/src/modules/pv/pv_core.h index 898b3a85130..2767bb97a7f 100644 --- a/src/modules/pv/pv_core.h +++ b/src/modules/pv/pv_core.h @@ -367,5 +367,9 @@ int pv_get_msg_attrs(sip_msg_t *msg, pv_param_t *param, int pv_parse_env_name(pv_spec_p sp, str *in); int pv_get_env(sip_msg_t *msg, pv_param_t *param, pv_value_t *res); + +int pv_parse_def_name(pv_spec_p sp, str *in); +int pv_get_def(sip_msg_t *msg, pv_param_t *param, pv_value_t *res); + #endif