Module: kamailio Branch: master Commit: f9261f10188eabc7b4e5cd1fc7964fc01fedb9e0 URL: https://github.com/kamailio/kamailio/commit/f9261f10188eabc7b4e5cd1fc7964fc0...
Author: Nicolas C nchaigne@capgemini.fr Committer: GitHub noreply@github.com Date: 2021-01-18T17:36:12+01:00
core: added xavu_serialize_fields function (#2603)
* core: added xavu_serialize_fields function
Also added a function called by the three "*_serialize_fields" to reduce code duplication.
The interface is not modified.
* Revert refactoring
We can add xavu_serialize_fields, but do not change the other functions.
---
Modified: src/core/xavp.c Modified: src/core/xavp.h
---
Diff: https://github.com/kamailio/kamailio/commit/f9261f10188eabc7b4e5cd1fc7964fc0... Patch: https://github.com/kamailio/kamailio/commit/f9261f10188eabc7b4e5cd1fc7964fc0...
---
diff --git a/src/core/xavp.c b/src/core/xavp.c index efa7c32cb8..de6da0c858 100644 --- a/src/core/xavp.c +++ b/src/core/xavp.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Daniel-Constantin Mierla (asipto.com) + * Copyright (C) 2009 Daniel-Constantin Mierla (asipto.com) * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -1446,6 +1446,69 @@ sr_xavp_t *xavu_set_child_sval(str *rname, str *cname, str *sval) return xavu_set_child_xval(rname, cname, &xval); }
+/** + * serialize the values in subfields of an xavu in name=value; format + * - rname - name of the root list xavu + * - obuf - buffer were to write the output + * - olen - the size of obuf + * return: 0 - not found; -1 - error; >0 - length of output + */ +int xavu_serialize_fields(str *rname, char *obuf, int olen) +{ + sr_xavp_t *ravu = NULL; + sr_xavp_t *avu = NULL; + str ostr; + int rlen; + + ravu = xavu_get(rname, NULL); + if(ravu==NULL || ravu->val.type!=SR_XTYPE_XAVP) { + /* not found or not holding subfields */ + return 0; + } + + rlen = 0; + ostr.s = obuf; + avu = ravu->val.v.xavp; + while(avu) { + switch(avu->val.type) { + case SR_XTYPE_INT: + LM_DBG(" XAVP int value: %d\n", avu->val.v.i); + ostr.len = snprintf(ostr.s, olen-rlen, "%.*s=%u;", + avu->name.len, avu->name.s, (unsigned int)avu->val.v.i); + if(ostr.len<=0 || ostr.len>=olen-rlen) { + LM_ERR("failed to serialize int value (%d/%d\n", + ostr.len, olen-rlen); + return -1; + } + break; + case SR_XTYPE_STR: + LM_DBG(" XAVP str value: %s\n", avu->val.v.s.s); + if(avu->val.v.s.len == 0) { + ostr.len = snprintf(ostr.s, olen-rlen, "%.*s;", + avu->name.len, avu->name.s); + } else { + ostr.len = snprintf(ostr.s, olen-rlen, "%.*s=%.*s;", + avu->name.len, avu->name.s, + avu->val.v.s.len, avu->val.v.s.s); + } + if(ostr.len<=0 || ostr.len>=olen-rlen) { + LM_ERR("failed to serialize int value (%d/%d\n", + ostr.len, olen-rlen); + return -1; + } + break; + default: + LM_DBG("skipping value type: %d\n", avu->val.type); + ostr.len = 0; + } + if(ostr.len>0) { + ostr.s += ostr.len; + rlen += ostr.len; + } + avu = avu->next; + } + return rlen; +}
/** * diff --git a/src/core/xavp.h b/src/core/xavp.h index 50ae165c13..198f0c09c4 100644 --- a/src/core/xavp.h +++ b/src/core/xavp.h @@ -131,6 +131,7 @@ sr_xavp_t *xavu_set_sval(str *rname, str *sval); sr_xavp_t *xavu_set_child_xval(str *rname, str *cname, sr_xval_t *xval); sr_xavp_t *xavu_set_child_ival(str *rname, str *cname, int ival); sr_xavp_t *xavu_set_child_sval(str *rname, str *cname, str *sval); +int xavu_serialize_fields(str *rname, char *obuf, int olen);
/** xavi api */ int xavi_init_head(void);