Module: kamailio Branch: master Commit: 356ee3ad0c40d74fd95e5be1bfe3b311d7c7abeb URL: https://github.com/kamailio/kamailio/commit/356ee3ad0c40d74fd95e5be1bfe3b311...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2018-12-04T09:21:38+01:00
sl: new pv $ltt(key) - return local generated to tag
- the to-tag used when kamailio sends a reply - $ltt(s) - the to-tag used in stateless replies - $ltt(t) - the to-tag used in transaction stateful replies (transaction has to be created at that time, eg., by t_newtran() or in a branch/failure route, otherwise it returns $null) - $ltt(x) - $ltt(t) if the transaction was created already, otherwise $ltt(s)
---
Modified: src/modules/sl/sl.c
---
Diff: https://github.com/kamailio/kamailio/commit/356ee3ad0c40d74fd95e5be1bfe3b311... Patch: https://github.com/kamailio/kamailio/commit/356ee3ad0c40d74fd95e5be1bfe3b311...
---
diff --git a/src/modules/sl/sl.c b/src/modules/sl/sl.c index 96c3fdfdf5..36c8a8eec7 100644 --- a/src/modules/sl/sl.c +++ b/src/modules/sl/sl.c @@ -78,6 +78,17 @@ static int child_init(int rank); static void mod_destroy(); static int fixup_sl_reply(void** param, int param_no);
+static int pv_get_ltt(sip_msg_t *msg, pv_param_t *param, pv_value_t *res); +static int pv_parse_ltt_name(pv_spec_p sp, str *in); + + +static pv_export_t mod_pvs[] = { + { {"ltt", (sizeof("ltt")-1)}, PVT_OTHER, pv_get_ltt, 0, + pv_parse_ltt_name, 0, 0, 0 }, + + { {0, 0}, 0, 0, 0, 0, 0, 0, 0 } +}; + static cmd_export_t cmds[]={ {"sl_send_reply", w_sl_send_reply, 2, fixup_sl_reply, 0, REQUEST_ROUTE}, @@ -120,7 +131,7 @@ struct module_exports exports= { cmds, /* cmd (cfg function) exports */ params, /* param exports */ sl_rpc, /* RPC method exports */ - 0, /* pv exports */ + mod_pvs, /* pv exports */ 0, /* response handling function */ mod_init, /* module init function */ child_init, /* per-child init function */ @@ -485,6 +496,83 @@ static int w_sl_forward_reply2(sip_msg_t* msg, char* str1, char* str2) return w_sl_forward_reply(msg, &code, &reason); }
+/** + * + */ +static int pv_get_ltt(sip_msg_t *msg, pv_param_t *param, pv_value_t *res) +{ + str ttag = STR_NULL; + tm_cell_t *t = NULL; + + if(msg==NULL) + return pv_get_null(msg, param, res); + + if(param==NULL) + return pv_get_null(msg, param, res); + + switch(param->pvn.u.isname.name.n) { + case 0: /* mixed */ + if(get_reply_totag(msg, &ttag)<0) { + return pv_get_null(msg, param, res); + } + return pv_get_strval(msg, param, res, &ttag); + case 1: /* stateless */ + if(sl_get_reply_totag(msg, &ttag)<0) { + return pv_get_null(msg, param, res); + } + return pv_get_strval(msg, param, res, &ttag); + case 2: /* transaction stateful */ + if(sl_bind_tm==0 || tmb.t_gett==0) { + return pv_get_null(msg, param, res); + } + + t = tmb.t_gett(); + if(t== NULL || t==T_UNDEFINED) { + return pv_get_null(msg, param, res); + } + if(tmb.t_get_reply_totag(msg, &ttag)<0) { + return pv_get_null(msg, param, res); + } + return pv_get_strval(msg, param, res, &ttag); + default: + return pv_get_null(msg, param, res); + } +} + +/** + * + */ +static int pv_parse_ltt_name(pv_spec_p sp, str *in) +{ + if(sp==NULL || in==NULL || in->len<=0) + return -1; + + switch(in->len) { + case 1: + if(strncmp(in->s, "x", 1)==0) { + sp->pvp.pvn.u.isname.name.n = 0; + } else if(strncmp(in->s, "s", 1)==0) { + sp->pvp.pvn.u.isname.name.n = 1; + } else if(strncmp(in->s, "t", 1)==0) { + sp->pvp.pvn.u.isname.name.n = 2; + } else { + goto error; + } + break; + default: + goto error; + } + sp->pvp.pvn.type = PV_NAME_INTSTR; + sp->pvp.pvn.u.isname.type = 0; + + return 0; + +error: + LM_ERR("unknown PV ltt key: %.*s\n", in->len, in->s); + return -1; +} + + /** * @brief bind functions to SL API structure */
+1! Thank you. :-)
On Tue, Dec 04, 2018 at 09:22:08AM +0100, Daniel-Constantin Mierla wrote:
Module: kamailio Branch: master Commit: 356ee3ad0c40d74fd95e5be1bfe3b311d7c7abeb URL: https://github.com/kamailio/kamailio/commit/356ee3ad0c40d74fd95e5be1bfe3b311...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2018-12-04T09:21:38+01:00
sl: new pv $ltt(key) - return local generated to tag
- the to-tag used when kamailio sends a reply
- $ltt(s) - the to-tag used in stateless replies
- $ltt(t) - the to-tag used in transaction stateful replies (transaction
has to be created at that time, eg., by t_newtran() or in a branch/failure route, otherwise it returns $null)
- $ltt(x) - $ltt(t) if the transaction was created already, otherwise
$ltt(s)
Modified: src/modules/sl/sl.c
Diff: https://github.com/kamailio/kamailio/commit/356ee3ad0c40d74fd95e5be1bfe3b311... Patch: https://github.com/kamailio/kamailio/commit/356ee3ad0c40d74fd95e5be1bfe3b311...
diff --git a/src/modules/sl/sl.c b/src/modules/sl/sl.c index 96c3fdfdf5..36c8a8eec7 100644 --- a/src/modules/sl/sl.c +++ b/src/modules/sl/sl.c @@ -78,6 +78,17 @@ static int child_init(int rank); static void mod_destroy(); static int fixup_sl_reply(void** param, int param_no);
+static int pv_get_ltt(sip_msg_t *msg, pv_param_t *param, pv_value_t *res); +static int pv_parse_ltt_name(pv_spec_p sp, str *in);
+static pv_export_t mod_pvs[] = {
- { {"ltt", (sizeof("ltt")-1)}, PVT_OTHER, pv_get_ltt, 0,
pv_parse_ltt_name, 0, 0, 0 },
- { {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
+};
static cmd_export_t cmds[]={ {"sl_send_reply", w_sl_send_reply, 2, fixup_sl_reply, 0, REQUEST_ROUTE}, @@ -120,7 +131,7 @@ struct module_exports exports= { cmds, /* cmd (cfg function) exports */ params, /* param exports */ sl_rpc, /* RPC method exports */
- 0, /* pv exports */
- mod_pvs, /* pv exports */ 0, /* response handling function */ mod_init, /* module init function */ child_init, /* per-child init function */
@@ -485,6 +496,83 @@ static int w_sl_forward_reply2(sip_msg_t* msg, char* str1, char* str2) return w_sl_forward_reply(msg, &code, &reason); }
+/**
- */
+static int pv_get_ltt(sip_msg_t *msg, pv_param_t *param, pv_value_t *res) +{
- str ttag = STR_NULL;
- tm_cell_t *t = NULL;
- if(msg==NULL)
return pv_get_null(msg, param, res);
- if(param==NULL)
return pv_get_null(msg, param, res);
- switch(param->pvn.u.isname.name.n) {
case 0: /* mixed */
if(get_reply_totag(msg, &ttag)<0) {
return pv_get_null(msg, param, res);
}
return pv_get_strval(msg, param, res, &ttag);
case 1: /* stateless */
if(sl_get_reply_totag(msg, &ttag)<0) {
return pv_get_null(msg, param, res);
}
return pv_get_strval(msg, param, res, &ttag);
case 2: /* transaction stateful */
if(sl_bind_tm==0 || tmb.t_gett==0) {
return pv_get_null(msg, param, res);
}
t = tmb.t_gett();
if(t== NULL || t==T_UNDEFINED) {
return pv_get_null(msg, param, res);
}
if(tmb.t_get_reply_totag(msg, &ttag)<0) {
return pv_get_null(msg, param, res);
}
return pv_get_strval(msg, param, res, &ttag);
default:
return pv_get_null(msg, param, res);
- }
+}
+/**
- */
+static int pv_parse_ltt_name(pv_spec_p sp, str *in) +{
- if(sp==NULL || in==NULL || in->len<=0)
return -1;
- switch(in->len) {
case 1:
if(strncmp(in->s, "x", 1)==0) {
sp->pvp.pvn.u.isname.name.n = 0;
} else if(strncmp(in->s, "s", 1)==0) {
sp->pvp.pvn.u.isname.name.n = 1;
} else if(strncmp(in->s, "t", 1)==0) {
sp->pvp.pvn.u.isname.name.n = 2;
} else {
goto error;
}
break;
default:
goto error;
- }
- sp->pvp.pvn.type = PV_NAME_INTSTR;
- sp->pvp.pvn.u.isname.type = 0;
- return 0;
+error:
- LM_ERR("unknown PV ltt key: %.*s\n", in->len, in->s);
- return -1;
+}
/**
- @brief bind functions to SL API structure
*/
Kamailio (SER) - Development Mailing List sr-dev@lists.kamailio.org https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev