diff --git a/modules/pv/pv_xavp.c b/modules/pv/pv_xavp.c index 28bb06ed267..d6fd83d9545 100644 --- a/modules/pv/pv_xavp.c +++ b/modules/pv/pv_xavp.c @@ -622,7 +622,7 @@ int xavp_params_explode(str *params, str *xname) int pv_var_to_xavp(str *varname, str *xname) { script_var_t *it; - sr_xavp_t *xavp = NULL; + sr_xavp_t *avp = NULL; sr_xval_t xval; LM_DBG("xname:%.*s varname:%.*s\n", xname->len, xname->s, @@ -638,18 +638,29 @@ int pv_var_to_xavp(str *varname, str *xname) { xval.type = SR_XTYPE_INT; xval.v.i = it->v.value.n; + LM_DBG("[%.*s]: %d\n", it->name.len, it->name.s, xval.v.i); } else { if(it->v.value.s.len==0) continue; xval.type = SR_XTYPE_STR; xval.v.s.s = it->v.value.s.s; xval.v.s.len = it->v.value.s.len; + LM_DBG("[%.*s]: '%.*s'\n", it->name.len, it->name.s, + xval.v.s.len, xval.v.s.s); } - xavp = xavp_add_xavp_value(xname, &it->name, &xval, NULL); - if(xavp==NULL) { + if(xavp_add_value(&it->name, &xval, &avp)==NULL) { LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s); goto error; } } + if(avp) { + memset(&xval, 0, sizeof(sr_xval_t)); + xval.type = SR_XTYPE_XAVP; + xval.v.xavp = avp; + if(xavp_add_value(xname, &xval, NULL)==NULL) { + LM_ERR("Can't create xavp[%.*s]\n", xname->len, xname->s); + goto error; + } + } } else { it = get_var_by_name(varname); @@ -662,21 +673,23 @@ int pv_var_to_xavp(str *varname, str *xname) { xval.type = SR_XTYPE_INT; xval.v.i = it->v.value.n; + LM_DBG("[%.*s]: %d\n", it->name.len, it->name.s, xval.v.i); } else { xval.type = SR_XTYPE_STR; xval.v.s.s = it->v.value.s.s; xval.v.s.len = it->v.value.s.len; + LM_DBG("[%.*s]: '%.*s'\n", it->name.len, it->name.s, + xval.v.s.len, xval.v.s.s); } - xavp = xavp_add_xavp_value(xname, &it->name, &xval, NULL); - if(xavp==NULL) { + if(xavp_add_xavp_value(xname, &it->name, &xval, NULL)==NULL) { LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s); - goto error; + return -1; } } return 1; error: - xavp_rm_by_name(xname, 1, NULL); + if(avp) xavp_destroy_list(&avp); return -1; } @@ -691,7 +704,7 @@ int pv_xavp_to_var_helper(sr_xavp_t *avp) { flags |= VAR_VAL_STR; value.s.len = avp->val.v.s.len; value.s.s = avp->val.v.s.s; - LM_DBG("var:[%.*s] STR:[%.*s]\n", avp->name.len, avp->name.s, + LM_DBG("var:[%.*s] STR:[%.*s]\n", avp->name.len, avp->name.s, value.s.len, value.s.s); } else if(avp->val.type==SR_XTYPE_INT) { @@ -723,18 +736,21 @@ int pv_xavp_to_var(str *xname) { LM_ERR("%.*s not xavp type?\n", xname->len, xname->s); return -1; } - avp = xavp->val.v.xavp; - if (avp) - { - if(pv_xavp_to_var_helper(avp)<0) return -1; - avp = avp->next; - } + do { + avp = xavp->val.v.xavp; + if (avp) + { + if(pv_xavp_to_var_helper(avp)<0) return -1; + avp = avp->next; + } - while(avp) - { - if(pv_xavp_to_var_helper(avp)<0) return -1; - avp = avp->next; - } + while(avp) + { + if(pv_xavp_to_var_helper(avp)<0) return -1; + avp = avp->next; + } + xavp = xavp_get_next(xavp); + } while(xavp); return 1; } #endif