static int in_list_fixup(void** param, int param_no) { if (param_no==1) { /* the ip to test */ return fixup_pvar(param); } else if (param_no==2) { /* the port to test */ if (*param==NULL) { return 0; } else if ( *((char*)*param)==0 ) { pkg_free(*param); *param = NULL; return 0; } return fixup_pvar(param); } else if (param_no==3) { /* the group to check in */ return fixup_uint(param); } else if (param_no==4) { /* active only check ? */ return fixup_uint(param); } else { LM_CRIT("bug - too many params (%d) in is_in_list()\n",param_no); return -1; } }
static int fixup_diversion_params(void** param, int param_no) { if (param_no == 1) { /* diversion reason */ return fixup_str(param); } else if (param_no == 2) { /* diversion uri */ return fixup_spve(param); } else { /* diversion counter */ return fixup_uint(param); } }
static int fixup_cnt_call(void** param, int param_no) { if (param_no==1) /* IP */ return fixup_is_dst(param, 1); if (param_no==2) /* port */ return fixup_is_dst(param, 2); if (param_no==3) /* group id */ return fixup_resources(param, 1); if (param_no==4) /* resources */ return fixup_resources(param, 2); if (param_no==5) /* count or un-count */ return fixup_uint(param); LM_CRIT("error - wrong params count (%d)\n",param_no); return -1; }
static int fixup_resources(void** param, int param_no) { struct lb_res_str_list *lb_rl; struct lb_grp_param *lbgp; struct lb_res_parse *lbp; pv_elem_t *model=NULL; str s; if (param_no==1) { lbgp = (struct lb_grp_param *)pkg_malloc(sizeof(struct lb_grp_param)); if (lbgp==NULL) { LM_ERR("no more pkg mem\n"); return E_OUT_OF_MEM; } /* try first as number */ s.s = (char*)*param; s.len = strlen(s.s); if (str2int(&s, (unsigned int*)&lbgp->grp_no)==0) { lbgp->grp_pv = NULL; pkg_free(*param); } else { lbgp->grp_pv = (pv_spec_t*)pkg_malloc(sizeof(pv_spec_t)); if (lbgp->grp_pv==NULL) { LM_ERR("no pkg memory left\n"); return E_OUT_OF_MEM; } if (pv_parse_spec(&s, lbgp->grp_pv)==0 || lbgp->grp_pv->type==PVT_NULL) { LM_ERR("%s is not integer nor PV !\n", (char*)*param); return E_UNSPEC; } } *param=(void *)(unsigned long)lbgp; return 0; } else if (param_no==2) { /* parameter is string (semi-colon separated list) * of needed resources */ lbp = (struct lb_res_parse *)pkg_malloc(sizeof(struct lb_res_parse)); if (!lbp) { LM_ERR("no more pkg mem\n"); return E_OUT_OF_MEM; } s.s = (char*)*param; s.len = strlen(s.s); if(pv_parse_format(&s ,&model) || model==NULL) { LM_ERR("wrong format [%s] in resource list!\n", s.s); return E_CFG; } /* check if there is any pv in string */ if (!model->spec.getf && !model->next) lbp->type = RES_TEXT; else lbp->type = RES_ELEM; if (lbp->type & RES_TEXT) { lb_rl = parse_resources_list( (char *)(*param), 0); if (lb_rl==NULL) { LM_ERR("invalid paramter %s\n",(char *)(*param)); return E_CFG; } pkg_free(*param); lbp->param = (void*)(unsigned long)lb_rl; } else { lbp->param = (void*)(unsigned long)model; } *param = (void *)(unsigned long)lbp; } else if (param_no==3) { fixup_uint(param); } return 0; }