Skip to content

Commit

Permalink
b2b_logic: port script functions to new param interface
Browse files Browse the repository at this point in the history
  • Loading branch information
rvlad-patrascu authored and liviuchircu committed Apr 4, 2019
1 parent 96141cb commit ada84e5
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 140 deletions.
2 changes: 1 addition & 1 deletion modules/b2b_entities/b2b_entities.h
Expand Up @@ -90,7 +90,7 @@ static inline int load_b2b_api( struct b2b_api *b2b_api)
load_b2b_f load_b2b;

/* import the b2b_entities auto-loading function */
if ( !(load_b2b=(load_b2b_f)find_export("load_b2b", 1, 0))) {
if ( !(load_b2b=(load_b2b_f)find_export("load_b2b", 0))) {
LM_ERR("can't import load_b2b\n");
return -1;
}
Expand Down
2 changes: 1 addition & 1 deletion modules/b2b_logic/b2b_load.h
Expand Up @@ -110,7 +110,7 @@ static inline int load_b2b_logic_api( b2bl_api_t *api)
load_b2bl_f load_b2b;

/* import the b2b logic auto-loading function */
if ( !(load_b2b=(load_b2bl_f)find_export("b2b_logic_bind", 1, 0))) {
if ( !(load_b2b=(load_b2bl_f)find_export("b2b_logic_bind", 0))) {
LM_ERR("failed to import b2b_logic_bind\n");
return -1;
}
Expand Down
206 changes: 73 additions & 133 deletions modules/b2b_logic/b2b_logic.c
Expand Up @@ -40,7 +40,6 @@
#include "../../ut.h"
#include "../../trim.h"
#include "../../mem/mem.h"
#include "../../mod_fix.h"

#include "records.h"
#include "pidf.h"
Expand All @@ -56,7 +55,8 @@ static void mod_destroy(void);
static int child_init(int rank);
static int load_script_scenario(modparam_t type, void* val);
static int load_extern_scenario(modparam_t type, void* val);
static int fixup_b2b_logic(void** param, int param_no);
static int fixup_b2b_logic(void** param);
static int fixup_free_b2b_logic(void** param);
static mi_response_t *mi_trigger_scenario(const mi_params_t *params,
struct mi_handler *async_hdl);
static mi_response_t *mi_b2b_bridge_2(const mi_params_t *params,
Expand All @@ -75,7 +75,7 @@ static void b2bl_clean(unsigned int ticks, void* param);
static void b2bl_db_timer_update(unsigned int ticks, void* param);
int b2b_init_request(struct sip_msg* msg, str* arg1, str* arg2, str* arg3,
str* arg4, str* arg5, str* arg6);
int b2b_bridge_request(struct sip_msg* msg, str* arg1, str* arg2);
int b2b_bridge_request(struct sip_msg* msg, str *key, int *entity_no);

void b2b_mark_todel( b2bl_tuple_t* tuple);

Expand Down Expand Up @@ -130,18 +130,20 @@ str server_address = {0, 0};
int b2bl_db_mode = WRITE_BACK;
int unsigned b2bl_th_init_timeout = 60;

/** Exported functions */
static cmd_export_t cmds[]=
{
{"b2b_init_request", (cmd_function)b2b_init_request, 5 , fixup_b2b_logic , 0 , REQUEST_ROUTE},
{"b2b_init_request", (cmd_function)b2b_init_request, 4 , fixup_b2b_logic , 0 , REQUEST_ROUTE},
{"b2b_init_request", (cmd_function)b2b_init_request, 3 , fixup_b2b_logic , 0 , REQUEST_ROUTE},
{"b2b_init_request", (cmd_function)b2b_init_request, 2 , fixup_b2b_logic , 0 , REQUEST_ROUTE},
{"b2b_init_request", (cmd_function)b2b_init_request, 1 , fixup_b2b_logic , 0 , REQUEST_ROUTE},
{"b2b_init_request", (cmd_function)b2b_init_request, 0 , 0 , 0 , REQUEST_ROUTE},
{"b2b_bridge_request",(cmd_function)b2b_bridge_request,2,fixup_pvar_pvar , 0 , REQUEST_ROUTE},
{"b2b_logic_bind", (cmd_function)b2b_logic_bind, 1 , 0, 0, 0},
{ 0, 0, 0 , 0 , 0, 0}
{"b2b_init_request", (cmd_function)b2b_init_request, {
{CMD_PARAM_STR, fixup_b2b_logic, fixup_free_b2b_logic},
{CMD_PARAM_STR|CMD_PARAM_OPT,0,0},
{CMD_PARAM_STR|CMD_PARAM_OPT,0,0},
{CMD_PARAM_STR|CMD_PARAM_OPT,0,0},
{CMD_PARAM_STR|CMD_PARAM_OPT,0,0}, {0,0,0}},
REQUEST_ROUTE},
{"b2b_bridge_request", (cmd_function)b2b_bridge_request,
{{CMD_PARAM_STR,0,0}, {CMD_PARAM_INT,0,0}, {0,0,0}},
REQUEST_ROUTE},
{"b2b_logic_bind", (cmd_function)b2b_logic_bind, {{0,0,0}}, 0},
{0,0,{{0,0,0}},0}
};

/** Exported parameters */
Expand Down Expand Up @@ -890,101 +892,80 @@ b2b_scenario_t* get_scenario_id(str* sid)
return get_scenario_id_list(sid, extern_scenarios);
}


static int fixup_b2b_logic(void** param, int param_no)
static int fixup_b2b_logic(void** param)
{
pv_elem_t *model;
str s;
str flags_s;
int st;
struct b2b_scen_fl *scf;

if(param_no== 0)
return 0;
s.s = (char*)(*param);
s.len = strlen(s.s);

if(*param)
scf = prepare_b2b_scen_fl_struct();
if (scf == NULL)
{
s.s = (char*)(*param);
s.len = strlen(s.s);

if(pv_parse_format(&s, &model)<0)
{
LM_ERR( "wrong format[%s]\n",(char*)(*param));
return E_UNSPEC;
}

/* the first parameter must be the scenario id and possible flags, must be a string */
if(param_no == 1)
{
if(model->spec.type != PVT_NONE )
{
LM_ERR("The first parameter is not a string\n");
return -1;
}
LM_ERR("no more pkg memory\n");
return -1;
}
scf->params.init_timeout = b2bl_th_init_timeout;

scf = prepare_b2b_scen_fl_struct();
if (scf == NULL)
{
LM_ERR("no more pkg memory\n");
return -1;
}
scf->params.init_timeout = b2bl_th_init_timeout;
if ( (flags_s.s = strchr(s.s,'/')) != NULL)
{
s.len = flags_s.s - s.s;
flags_s.s++;
flags_s.len = strlen(flags_s.s);

if ( (flags_s.s = strchr(s.s,'/')) != NULL)
/* parse flags */
for( st=0 ; st< flags_s.len ; st++ ) {
switch (flags_s.s[st])
{
s.len = flags_s.s - s.s;
flags_s.s++;
flags_s.len = strlen(flags_s.s);

/* parse flags */
for( st=0 ; st< flags_s.len ; st++ ) {
switch (flags_s.s[st])
{
case 't':
scf->params.init_timeout = 0;
while (st<flags_s.len-1 && isdigit(flags_s.s[st+1])) {
scf->params.init_timeout =
scf->params.init_timeout*10 + flags_s.s[st+1] - '0';
st++;
}
break;
case 'a':
scf->params.flags |= B2BL_FLAG_TRANSPARENT_AUTH;
break;
case 'p':
scf->params.flags |= B2BL_FLAG_TRANSPARENT_TO;
break;
default:
LM_WARN("unknown option `%c'\n", *flags_s.s);
case 't':
scf->params.init_timeout = 0;
while (st<flags_s.len-1 && isdigit(flags_s.s[st+1])) {
scf->params.init_timeout =
scf->params.init_timeout*10 + flags_s.s[st+1] - '0';
st++;
}
}
}

if(s.len == B2B_TOP_HIDING_SCENARY_LEN &&
strncmp(s.s,B2B_TOP_HIDING_SCENARY,B2B_TOP_HIDING_SCENARY_LEN)==0)
{
scf->scenario = NULL;
}
else
{
scf->scenario = get_scenario_id_list(&s, script_scenarios);
if (!scf->scenario)
{
LM_ERR("Wrong Scenary ID. No scenario with this ID [%.*s]\n", s.len, s.s);
return E_UNSPEC;
}
break;
case 'a':
scf->params.flags |= B2BL_FLAG_TRANSPARENT_AUTH;
break;
case 'p':
scf->params.flags |= B2BL_FLAG_TRANSPARENT_TO;
break;
default:
LM_WARN("unknown option `%c'\n", *flags_s.s);
}
*param=(void*)scf;
return 0;
}
}

*param = (void*)model;
return 0;
if(s.len == B2B_TOP_HIDING_SCENARY_LEN &&
strncmp(s.s,B2B_TOP_HIDING_SCENARY,B2B_TOP_HIDING_SCENARY_LEN)==0)
{
scf->scenario = NULL;
}
LM_ERR( "null format\n");
return E_UNSPEC;
else
{
scf->scenario = get_scenario_id_list(&s, script_scenarios);
if (!scf->scenario)
{
LM_ERR("Wrong Scenary ID. No scenario with this ID [%.*s]\n", s.len, s.s);
return E_UNSPEC;
}
}

*param=(void*)scf;
return 0;
}

static int fixup_free_b2b_logic(void** param)
{
if (*param)
pkg_free(*param);

return 0;
}

struct to_body* get_b2bl_from(struct sip_msg* msg)
{
Expand Down Expand Up @@ -1176,50 +1157,9 @@ mi_response_t *mi_trigger_scenario(const mi_params_t *params,
return init_mi_result_ok();
}

int b2b_bridge_request(struct sip_msg* msg, str* p1, str* p2)
int b2b_bridge_request(struct sip_msg* msg, str *key, int *entity_no)
{
pv_value_t pv_val;
str key = {NULL, 0};
int entity_no;

if (p1 && (pv_get_spec_value(msg, (pv_spec_t *)p1, &pv_val) == 0))
{
if (pv_val.flags & PV_VAL_STR)
{
LM_DBG("got key:'%.*s'\n", pv_val.rs.len, pv_val.rs.s);
key = pv_val.rs;
} else {
LM_ERR("Unable to get key from PV that is not a string\n");
return -1;
}
} else {
LM_ERR("Unable to get key from pv:%p\n", p1);
return -1;
}

if (p2 && (pv_get_spec_value(msg, (pv_spec_t *)p2, &pv_val) == 0))
{
if (pv_val.flags & PV_VAL_INT)
{
entity_no = pv_val.ri;
LM_DBG("got entity_no %d\n", entity_no);
}
else
if (pv_val.flags & PV_VAL_STR) {
if(str2int(&(pv_val.rs), (unsigned int*)&entity_no) != 0) {
LM_ERR("Unable to get entity_no from pv '%.*s'i\n",
pv_val.rs.len, pv_val.rs.s);
return -1;
}
} else {
LM_ERR("second pv not a str or int type\n");
return -1;
}
} else {
LM_ERR("Unable to get entity from pv:%p\n", p1);
return -1;
}
return b2bl_bridge_msg(msg, &key, entity_no);
return b2bl_bridge_msg(msg, key, *entity_no);
}

static mi_response_t *mi_b2b_terminate_call(const mi_params_t *params,
Expand Down
7 changes: 2 additions & 5 deletions modules/b2b_logic/logic.c
Expand Up @@ -3609,11 +3609,10 @@ str* internal_init_scenario(struct sip_msg* msg, str* name,
}


int b2b_init_request(struct sip_msg* msg, str* arg1, str* arg2, str* arg3,
str* arg4, str* arg5, str* arg6)
int b2b_init_request(struct sip_msg* msg, struct b2b_scen_fl *scf,
str* arg2, str* arg3, str* arg4, str* arg5, str* arg6)
{
str* args[MAX_SCENARIO_PARAMS];
struct b2b_scen_fl *scf;
str* key;
str auth_header;
str* cust_headers;
Expand All @@ -3623,7 +3622,6 @@ int b2b_init_request(struct sip_msg* msg, str* arg1, str* arg2, str* arg3,
destroy_avps( b2bl_key_avp_type, b2bl_key_avp_name, 1);

/* find the scenario with the corresponding id */
scf = (struct b2b_scen_fl*)arg1;
b2bl_caller = CALLER_SCRIPT;

/* process the arguments */
Expand Down Expand Up @@ -3659,7 +3657,6 @@ int b2b_init_request(struct sip_msg* msg, str* arg1, str* arg2, str* arg3,
return ret;
}


int b2bl_bridge(str* key, str* new_dst, str* new_from_dname, int entity_no)
{
b2bl_tuple_t* tuple;
Expand Down

0 comments on commit ada84e5

Please sign in to comment.