/* first param: DPID: type: INT, AVP, SVAR * second param: SRC/DST type: RURI, RURI_USERNAME, AVP, SVAR * default value for the second param: $ru.user/$ru.user */ static int dp_trans_fixup(void ** param, int param_no){ int dpid; dp_param_p dp_par= NULL; char *p, *s = NULL; str lstr, partition_name; dp_connection_list_t *list = NULL; if (param_no < 1 || param_no > 3) return 0; p = (char*)*param; if(!p || (*p == '\0')){ LM_DBG("null param %i\n", param_no); return E_CFG; } dp_par = (dp_param_p)pkg_malloc(sizeof(dp_param_t)); if(dp_par == NULL){ LM_ERR("no more pkg memory\n"); return E_OUT_OF_MEM; } memset(dp_par, 0, sizeof(dp_param_t)); switch (param_no) { case 1: p = parse_dp_command(p, -1, &partition_name); if (p == NULL) { LM_ERR("Invalid dp command\n"); return E_CFG; } if (!partition_name.s && !partition_name.len) { partition_name.s = DEFAULT_PARTITION; partition_name.len = sizeof(DEFAULT_PARTITION) - 1; } if (*partition_name.s != PV_MARKER) { list = dp_get_connection(&partition_name); if(!list){ LM_ERR("Partition with name [%.*s] is not defined\n", partition_name.len, partition_name.s ); return -1; } dp_par->type = DP_VAL_STR; } else { dp_par->type = DP_VAL_SPEC; } if (*p != PV_MARKER) { lstr.s = p; lstr.len = strlen(p); if(str2sint(&lstr, &dpid) != 0) { LM_ERR("bad number <%s>\n",(char *)(*param)); pkg_free(dp_par); return E_CFG; } if(dp_par->type == DP_VAL_SPEC){ /*int dpid and pv partition_name*/ dp_par->type = DP_VAL_INT; dp_par->v.pv_id.id = dpid; if( !pv_parse_spec( &partition_name, &dp_par->v.pv_id.partition)) goto error; } else { /*DP_VAL_STR remains DP_VAL_STR ( int dpid and str partition_name)*/ dp_par->v.id = dpid; } } else { if (dp_par->type == DP_VAL_STR) { /*pv dpid and str partition_name*/ dp_par->type = DP_VAL_STR_SPEC; } else { /*DP_VAL_SPEC remains DP_VAL_SPEC ( pv dpid and pv partition_name) */ if( !pv_parse_spec( &partition_name, &dp_par->v.sp[1])) goto error; } lstr.s = p; lstr.len = strlen(p); if (pv_parse_spec( &lstr, &dp_par->v.sp[0])==NULL) goto error; verify_par_type(dp_par->v.sp[0]); } dp_par->hash = list; break; case 2: if( ((s = strchr(p, '/')) == 0) ||( *(s+1)=='\0')) goto error; *s = '\0'; s++; lstr.s = p; lstr.len = strlen(p); if(pv_parse_spec( &lstr, &dp_par->v.sp[0])==NULL) goto error; verify_par_type(dp_par->v.sp[0]); lstr.s = s; lstr.len = strlen(s); if (pv_parse_spec( &lstr, &dp_par->v.sp[1] )==NULL) goto error; verify_par_type(dp_par->v.sp[1]); if (dp_par->v.sp[1].setf==NULL) { LM_ERR("the output PV is read-only!!\n"); return E_CFG; } dp_par->type = DP_VAL_SPEC; break; case 3: return fixup_pvar(param); } *param = (void *)dp_par; return 0; error: LM_ERR("failed to parse param %i\n", param_no); return E_INVALID_PARAMS; }
/* first param: DPID: type: INT, AVP, SVAR * second param: SRC/DST type: RURI, RURI_USERNAME, AVP, SVAR * default value for the second param: $ru.user/$ru.user */ static int dp_trans_fixup(void ** param, int param_no){ int dpid; dp_param_p dp_par= NULL; char *p, *s=NULL; str lstr; if(param_no!=1 && param_no!=2) return 0; p = (char*)*param; if(!p || (*p == '\0')){ LM_DBG("null param %i\n", param_no); return E_CFG; } LM_DBG("param_no is %i\n", param_no); dp_par = (dp_param_p)pkg_malloc(sizeof(dp_param_t)); if(dp_par == NULL){ LM_ERR("no more pkg memory\n"); return E_OUT_OF_MEM; } memset(dp_par, 0, sizeof(dp_param_t)); if(param_no == 1) { if(*p != '$') { dp_par->type = DP_VAL_INT; lstr.s = *param; lstr.len = strlen(*param); if(str2sint(&lstr, &dpid) != 0) { LM_ERR("bad number <%s>\n",(char *)(*param)); pkg_free(dp_par); return E_CFG; } dp_par->type = DP_VAL_INT; dp_par->v.id = dpid; }else{ lstr.s = p; lstr.len = strlen(p); if (pv_parse_spec( &lstr, &dp_par->v.sp[0])==NULL) goto error; verify_par_type(dp_par->v.sp[0]); dp_par->type = DP_VAL_SPEC; } } else { if( ((s = strchr(p, '/')) == 0) ||( *(s+1)=='\0')) goto error; *s = '\0'; s++; lstr.s = p; lstr.len = strlen(p); if(pv_parse_spec( &lstr, &dp_par->v.sp[0])==NULL) goto error; verify_par_type(dp_par->v.sp[0]); lstr.s = s; lstr.len = strlen(s); if (pv_parse_spec( &lstr, &dp_par->v.sp[1] )==NULL) goto error; verify_par_type(dp_par->v.sp[1]); if (dp_par->v.sp[1].setf==NULL) { LM_ERR("the output PV is read-only!!\n"); return E_CFG; } dp_par->type = DP_VAL_SPEC; } *param = (void *)dp_par; return 0; error: LM_ERR("failed to parse param %i\n", param_no); return E_INVALID_PARAMS; }