static int fixup_binary_op(void **param, int param_no) { pv_spec_p sp; str s; switch (param_no) { case 1: return fixup_sgp(param); case 2: if (!(sp = pkg_malloc(sizeof(*sp)))) { LM_ERR("No more pkg memory!\n"); return -1; } memset(sp, 0, sizeof(*sp)); s.s = (char *)*param; s.len = strlen(s.s); if (!pv_parse_spec(&s, sp)) { LM_ERR("Parameter 2 only accepts pvars! Given: <%.*s>\n", s.len, s.s); return -1; } *param = (void *)sp; return 0; default: LM_ERR("Invalid parameter number: %d\n", param_no); return E_UNSPEC; } }
/* fixup functions */ static int fixup_rl_check(void **param, int param_no) { switch (param_no) { /* pipe name */ case 1: return fixup_spve(param); /* limit */ case 2: return fixup_igp(param); /* algorithm */ case 3: return fixup_sgp(param); /* error */ default: LM_ERR("[BUG] too many params (%d)\n", param_no); } return E_UNSPEC; }
static int fixup_create_dlg2(void **param, int param_no) { return fixup_sgp(param); }
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 parameter %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; return 0; } else if (param_no==3) { /* string with flags */ return fixup_sgp(param); } LM_CRIT("error - wrong params count (%d)\n",param_no); return -1; }
static int fixup_topo_hiding(void **param, int param_no) { return fixup_sgp(param); }
int do_acc_fixup(void** param, int param_no) { str s; pv_elem_p el; unsigned long long ival; unsigned long long* ival_p; acc_type_param_t* acc_param; do_acc_parser parser; if (param_no < 1 || param_no > 3) { LM_ERR("invalid param_no <%d>!\n", param_no); return -1; } switch (param_no) { case 1: parser=do_acc_type_parser; s.s = *param; s.len = strlen(s.s); if (pv_parse_format(&s, &el) < 0) { LM_ERR("invalid format <%.*s>!\n", s.len, s.s); return -1; } acc_param=pkg_malloc(sizeof(acc_type_param_t)); if (acc_param == NULL) { LM_ERR("no more pkg mem!\n"); return -1; } memset(acc_param, 0, sizeof(acc_type_param_t)); if (el->next == 0 && el->spec.getf == 0) { pv_elem_free_all(el); if ( (ival=do_acc_parse(&el->text, parser)) < 0) { LM_ERR("Invalid value <%.*s>!\n", el->text.len, el->text.s); return -1; } acc_param->t = DO_ACC_PARAM_TYPE_VALUE; acc_param->u.ival = ival; } else { acc_param->t = DO_ACC_PARAM_TYPE_PV; acc_param->u.pval = el; } *param = acc_param; break; case 2: parser=do_acc_flags_parser; s.s = *param; s.len = strlen(s.s); if ( (ival=do_acc_parse(&s, parser)) < 0) { LM_ERR("Invalid value <%.*s>!\n", s.len, s.s); return -1; } if ((ival_p=pkg_malloc(sizeof(unsigned long long))) == NULL) { LM_ERR("no more pkg mem!\n"); return -1; } *ival_p = ival; *param = ival_p; break; case 3: return fixup_sgp(param); } return 0; }