|
@@ -48,7 +48,7 @@ MODULE_VERSION
|
|
|
|
|
|
str suffix = {"", 0};
|
|
str suffix = {"", 0};
|
|
|
|
|
|
-int add_diversion(struct sip_msg* msg, char* r, char* s);
|
|
|
|
|
|
+int add_diversion(struct sip_msg* msg, char* r, char* u);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Module initialization function prototype
|
|
* Module initialization function prototype
|
|
@@ -60,8 +60,10 @@ static int mod_init(void);
|
|
* Exported functions
|
|
* Exported functions
|
|
*/
|
|
*/
|
|
static cmd_export_t cmds[] = {
|
|
static cmd_export_t cmds[] = {
|
|
- {"add_diversion", (cmd_function)add_diversion, 1, fixup_str_null,
|
|
|
|
- 0, REQUEST_ROUTE|FAILURE_ROUTE|LOCAL_ROUTE},
|
|
|
|
|
|
+ {"add_diversion", (cmd_function)add_diversion, 1, fixup_spve_null,
|
|
|
|
+ 0, REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
|
|
|
|
+ {"add_diversion", (cmd_function)add_diversion, 2, fixup_spve_spve,
|
|
|
|
+ 0, REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
|
|
{0, 0, 0, 0, 0, 0}
|
|
{0, 0, 0, 0, 0, 0}
|
|
};
|
|
};
|
|
|
|
|
|
@@ -136,18 +138,31 @@ static inline int add_diversion_helper(struct sip_msg* msg, str* s)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-int add_diversion(struct sip_msg* msg, char* r, char* s)
|
|
|
|
|
|
+int add_diversion(struct sip_msg* msg, char* r, char* u)
|
|
{
|
|
{
|
|
str div_hf;
|
|
str div_hf;
|
|
char *at;
|
|
char *at;
|
|
- str* uri;
|
|
|
|
- str* reason;
|
|
|
|
|
|
+ str uri;
|
|
|
|
+ str reason;
|
|
|
|
+
|
|
|
|
+ if(fixup_get_svalue(msg, (gparam_t*)r, &reason)<0)
|
|
|
|
+ {
|
|
|
|
+ LM_ERR("cannot get the script\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
|
|
- reason = (str*)r;
|
|
|
|
|
|
|
|
- uri = &msg->first_line.u.request.uri;
|
|
|
|
|
|
+ if(u==NULL) {
|
|
|
|
+ uri = msg->first_line.u.request.uri;
|
|
|
|
+ } else {
|
|
|
|
+ if(fixup_get_svalue(msg, (gparam_t*)u, &uri)<0)
|
|
|
|
+ {
|
|
|
|
+ LM_ERR("cannot get the uri parameter\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- div_hf.len = DIVERSION_PREFIX_LEN + uri->len + DIVERSION_SUFFIX_LEN + reason->len + CRLF_LEN;
|
|
|
|
|
|
+ div_hf.len = DIVERSION_PREFIX_LEN + uri.len + DIVERSION_SUFFIX_LEN + reason.len + CRLF_LEN;
|
|
div_hf.s = pkg_malloc(div_hf.len);
|
|
div_hf.s = pkg_malloc(div_hf.len);
|
|
if (!div_hf.s) {
|
|
if (!div_hf.s) {
|
|
LM_ERR("no pkg memory left\n");
|
|
LM_ERR("no pkg memory left\n");
|
|
@@ -158,14 +173,14 @@ int add_diversion(struct sip_msg* msg, char* r, char* s)
|
|
memcpy(at, DIVERSION_PREFIX, DIVERSION_PREFIX_LEN);
|
|
memcpy(at, DIVERSION_PREFIX, DIVERSION_PREFIX_LEN);
|
|
at += DIVERSION_PREFIX_LEN;
|
|
at += DIVERSION_PREFIX_LEN;
|
|
|
|
|
|
- memcpy(at, uri->s, uri->len);
|
|
|
|
- at += uri->len;
|
|
|
|
|
|
+ memcpy(at, uri.s, uri.len);
|
|
|
|
+ at += uri.len;
|
|
|
|
|
|
memcpy(at, DIVERSION_SUFFIX, DIVERSION_SUFFIX_LEN);
|
|
memcpy(at, DIVERSION_SUFFIX, DIVERSION_SUFFIX_LEN);
|
|
at += DIVERSION_SUFFIX_LEN;
|
|
at += DIVERSION_SUFFIX_LEN;
|
|
|
|
|
|
- memcpy(at, reason->s, reason->len);
|
|
|
|
- at += reason->len;
|
|
|
|
|
|
+ memcpy(at, reason.s, reason.len);
|
|
|
|
+ at += reason.len;
|
|
|
|
|
|
memcpy(at, CRLF, CRLF_LEN);
|
|
memcpy(at, CRLF, CRLF_LEN);
|
|
|
|
|