diff --git a/debian/patches/series b/debian/patches/series index 101b99bc7..8aeb03c20 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -61,6 +61,9 @@ sipwise/pua_dialoginfo_uuid.patch sipwise/dialplan-don-t-stop-loading-rules-on-error.patch sipwise/cfgt-skip-tm-vars-T_.patch sipwise/cfgt-skip.patch +sipwise/cfgt-improve-detection-of-dynamic-format.patch +sipwise/cfgt-fix-memory-leaks.patch +sipwise/cfgt-skip_unknown.patch sipwise/topos-don-t-insert-contact-header-for-4xx-replies.patch sipwise/db_redis_skip_empty_keys.patch sipwise/db_redis_graceful_scan.patch @@ -71,9 +74,8 @@ sipwise/pv_headers-fix-build-warning.patch sipwise/pv_headers-use-memset.patch ### active development sipwise/lcr-stopper_mode-parameter.patch -sipwise/cfgt-improve-detection-of-dynamic-format.patch -sipwise/cfgt-fix-memory-leaks.patch -sipwise/cfgt-skip_unknown.patch +sipwise/dialog-dlg_get_var.patch +sipwise/dialog-dlg_set_var.patch # ### Don't just put stuff in any order ### use gbp pq import/export tooling to help maintain patches diff --git a/debian/patches/sipwise/dialog-dlg_get_var.patch b/debian/patches/sipwise/dialog-dlg_get_var.patch new file mode 100644 index 000000000..0658c4e79 --- /dev/null +++ b/debian/patches/sipwise/dialog-dlg_get_var.patch @@ -0,0 +1,213 @@ +From: Victor Seva +Date: Fri, 6 May 2022 13:30:01 +0200 +Subject: dialog: dlg_get_var(ci, ft, tt, key, dst_var) + +--- + src/modules/dialog/dialog.c | 113 +++++++++++++++++++++++++++++++- + src/modules/dialog/doc/dialog_admin.xml | 48 ++++++++++++++ + 2 files changed, 160 insertions(+), 1 deletion(-) + +diff --git a/src/modules/dialog/dialog.c b/src/modules/dialog/dialog.c +index 243bb9b..8e06c01 100644 +--- a/src/modules/dialog/dialog.c ++++ b/src/modules/dialog/dialog.c +@@ -193,7 +193,9 @@ static int w_is_known_dlg(struct sip_msg *); + static int w_dlg_set_ruri(sip_msg_t *, char *, char *); + static int w_dlg_db_load_callid(sip_msg_t *msg, char *ci, char *p2); + static int w_dlg_db_load_extra(sip_msg_t *msg, char *p1, char *p2); +- ++static int fixup_dlg_get_var(void** param, int param_no); ++static int fixup_dlg_get_var_free(void** param, int param_no); ++static int w_dlg_get_var(struct sip_msg*, char*, char*, char*, char*, char*); + static int w_dlg_remote_profile(sip_msg_t *msg, char *cmd, char *pname, + char *pval, char *puid, char *expires); + static int fixup_dlg_remote_profile(void** param, int param_no); +@@ -255,6 +257,8 @@ static cmd_export_t cmds[]={ + 0, ANY_ROUTE }, + {"dlg_db_load_extra", (cmd_function)w_dlg_db_load_extra, 0, 0, + 0, ANY_ROUTE }, ++ {"dlg_get_var",(cmd_function)w_dlg_get_var, 5, fixup_dlg_get_var, ++ fixup_dlg_get_var_free, ANY_ROUTE }, + + {"load_dlg", (cmd_function)load_dlg, 0, 0, 0, 0}, + {0,0,0,0,0,0} +@@ -1496,6 +1500,108 @@ static int fixup_dlg_bridge(void** param, int param_no) + return 0; + } + ++static str *ki_dlg_get_var(sip_msg_t *msg, str *sc, str *sf, str *st, str *key) ++{ ++ dlg_cell_t *dlg = NULL; ++ unsigned int dir = 0; ++ str *val = NULL; ++ ++ if(sc==NULL || sc->s==NULL || sc->len == 0) { ++ LM_ERR("invalid Call-ID parameter\n"); ++ return val; ++ } ++ if(sf==NULL || sf->s==NULL || sf->len == 0) { ++ LM_ERR("invalid From tag parameter\n"); ++ return val; ++ } ++ if(st==NULL || st->s==NULL || st->len == 0) { ++ LM_ERR("invalid To tag parameter\n"); ++ return val; ++ } ++ ++ dlg = get_dlg(sc, sf, st, &dir); ++ if(dlg==NULL) ++ return val; ++ val = get_dlg_variable(dlg, key); ++ dlg_release(dlg); ++ return val; ++} ++ ++static int w_dlg_get_var(struct sip_msg *msg, char *ci, char *ft, char *tt, char *key, char *pv) ++{ ++ str sc = STR_NULL; ++ str sf = STR_NULL; ++ str st = STR_NULL; ++ str k = STR_NULL; ++ str *val = NULL; ++ pv_value_t dst_val; ++ pv_spec_t* dst_pv; ++ ++ if(ci==0 || ft==0 || tt==0) ++ { ++ LM_ERR("invalid parameters\n"); ++ return -1; ++ } ++ ++ if(fixup_get_svalue(msg, (gparam_p)ci, &sc)!=0) ++ { ++ LM_ERR("unable to get Call-ID\n"); ++ return -1; ++ } ++ ++ if(fixup_get_svalue(msg, (gparam_p)ft, &sf)!=0) ++ { ++ LM_ERR("unable to get From tag\n"); ++ return -1; ++ } ++ ++ if(fixup_get_svalue(msg, (gparam_p)tt, &st)!=0) ++ { ++ LM_ERR("unable to get To Tag\n"); ++ return -1; ++ } ++ if(st.s==NULL || st.len == 0) ++ { ++ LM_ERR("invalid To tag parameter\n"); ++ return -1; ++ } ++ if(fixup_get_svalue(msg, (gparam_p)key, &k)!=0) ++ { ++ LM_ERR("unable to get key name\n"); ++ return -1; ++ } ++ dst_pv = (pv_spec_t *)pv; ++ val = ki_dlg_get_var(msg, &sc, &sf, &st, &k); ++ if(val) { ++ memset(&dst_val, 0, sizeof(pv_value_t)); ++ dst_val.flags |= PV_VAL_STR; ++ dst_val.rs.s = val->s; ++ dst_val.rs.len = val->len; ++ if(pv_set_spec_value(msg, dst_pv, 0, &dst_val) != 0) return -1; ++ } else { ++ if(pv_get_null(msg, NULL, &dst_val) != 0) return -1; ++ } ++ return 1; ++} ++ ++static int fixup_dlg_get_var(void** param, int param_no) ++{ ++ if(param_no>=1 && param_no<=4) ++ return fixup_spve_null(param, 1); ++ if(param_no==5) ++ return fixup_pvar_all(param, 1); ++ return 0; ++} ++ ++static int fixup_dlg_get_var_free(void** param, int param_no) ++{ ++ if (param_no <= 4) ++ return fixup_free_spve_null(param, 1); ++ if (param_no == 5) ++ return fixup_free_pvar_all(param, 1); ++ return -1; ++} ++ + static int ki_dlg_get(sip_msg_t *msg, str *sc, str *sf, str *st) + { + dlg_cell_t *dlg = NULL; +@@ -2081,6 +2187,11 @@ static sr_kemi_t sr_kemi_dialog_exports[] = { + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, ++ { str_init("dialog"), str_init("dlg_get_var"), ++ SR_KEMIP_STR, ki_dlg_get_var, ++ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR, ++ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE } ++ }, + { str_init("dialog"), str_init("set_dlg_profile_static"), + SR_KEMIP_INT, ki_set_dlg_profile_static, + { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, +diff --git a/src/modules/dialog/doc/dialog_admin.xml b/src/modules/dialog/doc/dialog_admin.xml +index 987bd54..26d1cbb 100644 +--- a/src/modules/dialog/doc/dialog_admin.xml ++++ b/src/modules/dialog/doc/dialog_admin.xml +@@ -2076,6 +2076,54 @@ if(dlg_get("abcdef", "123", "456")) + + + ++
++ ++ <function moreinfo="none">dlg_get_var(callid, ftag, ttag, name, dst)</function> ++ ++ ++ Get dlg_var of another dialog value based on Call-ID, From-Tag and To-Tag ++ parameters. ++ ++ Meaning of the parameters is as follows: ++ ++ ++ callid - SIP call-id. ++ ++ ++ ++ ftag - SIP From tag. ++ ++ ++ ++ ttag - SIP To tag. ++ ++ ++ ++ name - key name of the $dlg_var. ++ ++ ++ ++ dst - pv to store the value of $dlg_var(name). ++ ++ ++ ++ ++ This function can be used from BRANCH_ROUTE, ++ REQUEST_ROUTE, ONREPLY_ROUTE and FAILURE_ROUTE. ++ ++ ++ <function>dlg_get_var</function> usage ++ ++... ++if(dlg_get_var("$var(ci)", "$var(ft)", "456", "test", "$var(tmp)")) ++{ ++ xdbg("$$dlg_var(test):$var(tmp)\n"); ++} ++... ++ ++ ++
++ +
+ + <function moreinfo="none">is_known_dlg()</function> diff --git a/debian/patches/sipwise/dialog-dlg_set_var.patch b/debian/patches/sipwise/dialog-dlg_set_var.patch new file mode 100644 index 000000000..89f240deb --- /dev/null +++ b/debian/patches/sipwise/dialog-dlg_set_var.patch @@ -0,0 +1,200 @@ +From: Victor Seva <vseva@sipwise.com> +Date: Wed, 11 May 2022 15:50:14 +0200 +Subject: dialog: dlg_set_var(callid, ft, tt, key, value) + +--- + src/modules/dialog/dialog.c | 100 ++++++++++++++++++++++++++++++++ + src/modules/dialog/doc/dialog_admin.xml | 48 +++++++++++++++ + 2 files changed, 148 insertions(+) + +diff --git a/src/modules/dialog/dialog.c b/src/modules/dialog/dialog.c +index 8e06c01..42e3e1b 100644 +--- a/src/modules/dialog/dialog.c ++++ b/src/modules/dialog/dialog.c +@@ -196,6 +196,9 @@ static int w_dlg_db_load_extra(sip_msg_t *msg, char *p1, char *p2); + static int fixup_dlg_get_var(void** param, int param_no); + static int fixup_dlg_get_var_free(void** param, int param_no); + static int w_dlg_get_var(struct sip_msg*, char*, char*, char*, char*, char*); ++static int fixup_dlg_set_var(void** param, int param_no); ++static int fixup_dlg_set_var_free(void** param, int param_no); ++static int w_dlg_set_var(struct sip_msg*, char*, char*, char*, char*, char*); + static int w_dlg_remote_profile(sip_msg_t *msg, char *cmd, char *pname, + char *pval, char *puid, char *expires); + static int fixup_dlg_remote_profile(void** param, int param_no); +@@ -259,6 +262,8 @@ static cmd_export_t cmds[]={ + 0, ANY_ROUTE }, + {"dlg_get_var",(cmd_function)w_dlg_get_var, 5, fixup_dlg_get_var, + fixup_dlg_get_var_free, ANY_ROUTE }, ++ {"dlg_set_var",(cmd_function)w_dlg_set_var, 5, fixup_dlg_set_var, ++ fixup_dlg_set_var_free, ANY_ROUTE }, + + {"load_dlg", (cmd_function)load_dlg, 0, 0, 0, 0}, + {0,0,0,0,0,0} +@@ -1602,6 +1607,96 @@ static int fixup_dlg_get_var_free(void** param, int param_no) + return -1; + } + ++static int ki_dlg_set_var(sip_msg_t *msg, str *sc, str *sf, str *st, str *key, str *val) ++{ ++ dlg_cell_t *dlg = NULL; ++ unsigned int dir = 0; ++ int ret = 1; ++ ++ if(sc==NULL || sc->s==NULL || sc->len == 0) { ++ LM_ERR("invalid Call-ID parameter\n"); ++ return -1; ++ } ++ if(sf==NULL || sf->s==NULL || sf->len == 0) { ++ LM_ERR("invalid From tag parameter\n"); ++ return -1; ++ } ++ if(st==NULL || st->s==NULL || st->len == 0) { ++ LM_ERR("invalid To tag parameter\n"); ++ return -1; ++ } ++ ++ dlg = get_dlg(sc, sf, st, &dir); ++ if(dlg==NULL) ++ return -1; ++ if(set_dlg_variable(dlg, key, val) != 0) ret = -1; ++ dlg_release(dlg); ++ return ret; ++} ++ ++static int w_dlg_set_var(struct sip_msg *msg, char *ci, char *ft, char *tt, char *key, char *val) ++{ ++ str sc = STR_NULL; ++ str sf = STR_NULL; ++ str st = STR_NULL; ++ str k = STR_NULL; ++ str v = STR_NULL; ++ ++ if(ci==0 || ft==0 || tt==0) ++ { ++ LM_ERR("invalid parameters\n"); ++ return -1; ++ } ++ ++ if(fixup_get_svalue(msg, (gparam_p)ci, &sc)!=0) ++ { ++ LM_ERR("unable to get Call-ID\n"); ++ return -1; ++ } ++ ++ if(fixup_get_svalue(msg, (gparam_p)ft, &sf)!=0) ++ { ++ LM_ERR("unable to get From tag\n"); ++ return -1; ++ } ++ ++ if(fixup_get_svalue(msg, (gparam_p)tt, &st)!=0) ++ { ++ LM_ERR("unable to get To Tag\n"); ++ return -1; ++ } ++ if(st.s==NULL || st.len == 0) ++ { ++ LM_ERR("invalid To tag parameter\n"); ++ return -1; ++ } ++ if(fixup_get_svalue(msg, (gparam_p)key, &k)!=0) ++ { ++ LM_ERR("unable to get key name\n"); ++ return -1; ++ } ++ if(fixup_get_svalue(msg, (gparam_p)val, &v)!=0) ++ { ++ LM_ERR("unable to get value\n"); ++ return -1; ++ } ++ return ki_dlg_set_var(msg, &sc, &sf, &st, &k, &v); ++} ++ ++static int fixup_dlg_set_var(void** param, int param_no) ++{ ++ if(param_no>=1 && param_no<=5) ++ return fixup_spve_null(param, 1); ++ return 0; ++} ++ ++static int fixup_dlg_set_var_free(void** param, int param_no) ++{ ++ if (param_no <= 5) ++ return fixup_free_spve_null(param, 1); ++ return -1; ++} ++ + static int ki_dlg_get(sip_msg_t *msg, str *sc, str *sf, str *st) + { + dlg_cell_t *dlg = NULL; +@@ -2192,6 +2287,11 @@ static sr_kemi_t sr_kemi_dialog_exports[] = { + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR, + SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, ++ { str_init("dialog"), str_init("dlg_set_var"), ++ SR_KEMIP_INT, ki_dlg_set_var, ++ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR, ++ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE } ++ }, + { str_init("dialog"), str_init("set_dlg_profile_static"), + SR_KEMIP_INT, ki_set_dlg_profile_static, + { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, +diff --git a/src/modules/dialog/doc/dialog_admin.xml b/src/modules/dialog/doc/dialog_admin.xml +index 26d1cbb..242a487 100644 +--- a/src/modules/dialog/doc/dialog_admin.xml ++++ b/src/modules/dialog/doc/dialog_admin.xml +@@ -2124,6 +2124,54 @@ if(dlg_get_var("$var(ci)", "$var(ft)", "456", "test", "$var(tmp)")) + </example> + </section> + ++ <section id="dialog.f.dlg_set_var"> ++ <title> ++ <function moreinfo="none">dlg_set_var(callid, ftag, ttag, name, value)</function> ++ ++ ++ Set dlg_var of another dialog value based on Call-ID, From-Tag and To-Tag ++ parameters. ++ ++ Meaning of the parameters is as follows: ++ ++ ++ callid - SIP call-id. ++ ++ ++ ++ ftag - SIP From tag. ++ ++ ++ ++ ttag - SIP To tag. ++ ++ ++ ++ name - key name of the $dlg_var. ++ ++ ++ ++ value - string value to store at $dlg_var(name). ++ ++ ++ ++ ++ This function can be used from BRANCH_ROUTE, ++ REQUEST_ROUTE, ONREPLY_ROUTE and FAILURE_ROUTE. ++ ++ ++ <function>dlg_set_var</function> usage ++ ++... ++if(dlg_set_var("$var(ci)", "$var(ft)", "456", "test", "$var(tmp)")) ++{ ++ xdbg("set $$dlg_var(test):$var(tmp)\n"); ++} ++... ++ ++ ++
++ +
+ + <function moreinfo="none">is_known_dlg()</function>