aboutsummaryrefslogtreecommitdiffstats
path: root/cdr.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-20 23:37:01 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-20 23:37:01 +0000
commitec0590611f9d5092ee7488a4b3b4d872782c6314 (patch)
tree60b67f937be0e7f1b5ed94de1ec88af1dad653e0 /cdr.c
parent8ba8a2e02e9156e7e04672c194c9e7eeb38eab27 (diff)
use ast_build_string() to build strings into buffers, and general cleanup of variable serializing functions used by 'show channel' (bug #4558)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5944 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'cdr.c')
-rwxr-xr-xcdr.c59
1 files changed, 23 insertions, 36 deletions
diff --git a/cdr.c b/cdr.c
index 9a01ec03c..99612226b 100755
--- a/cdr.c
+++ b/cdr.c
@@ -324,17 +324,14 @@ int ast_cdr_copy_vars(struct ast_cdr *to_cdr, struct ast_cdr *from_cdr)
return x;
}
-#define CDR_CLEN 18
int ast_cdr_serialize_variables(struct ast_cdr *cdr, char *buf, size_t size, char delim, char sep, int recur)
{
struct ast_var_t *variables;
- struct varshead *headp;
- char *var=NULL ,*val=NULL;
- char *tmp = NULL;
+ char *var, *val;
+ char *tmp;
char workspace[256];
- int workspacelen;
- int total = 0, x = 0, i = 0;
- const char *cdrcols[CDR_CLEN] = {
+ int total = 0, x = 0, i;
+ const char *cdrcols[] = {
"clid",
"src",
"dst",
@@ -355,46 +352,36 @@ int ast_cdr_serialize_variables(struct ast_cdr *cdr, char *buf, size_t size, cha
"userfield"
};
+ memset(buf, 0, size);
- memset(buf,0,size);
- while (cdr) {
- x++;
- if (x > 1) {
- strncat(buf, "\n", size);
- }
- headp = &cdr->varshead;
- AST_LIST_TRAVERSE(headp,variables,entries) {
- if (cdr && variables &&
+ for (; cdr; cdr = recur ? cdr->next : NULL) {
+ if (++x > 1)
+ ast_build_string(&buf, &size, "\n");
+
+ AST_LIST_TRAVERSE(&cdr->varshead, variables, entries) {
+ if (variables &&
(var = ast_var_name(variables)) && (val = ast_var_value(variables)) &&
!ast_strlen_zero(var) && !ast_strlen_zero(val)) {
- snprintf(buf + strlen(buf), size - strlen(buf), "level %d: %s%c%s%c", x, var, delim, val, sep);
- if (strlen(buf) >= size) {
- ast_log(LOG_ERROR,"Data Buffer Size Exceeded!\n");
- break;
- }
- total++;
+ if (ast_build_string(&buf, &size, "level %d: %s%c%s%c", x, var, delim, val, sep)) {
+ ast_log(LOG_ERROR, "Data Buffer Size Exceeded!\n");
+ break;
+ } else
+ total++;
} else
break;
}
- for (i = 0 ; i < CDR_CLEN; i++) {
- workspacelen = sizeof(workspace);
- ast_cdr_getvar(cdr, cdrcols[i], &tmp, workspace, workspacelen, 0);
+
+ for (i = 0; i < (sizeof(cdrcols) / sizeof(cdrcols[0])); i++) {
+ ast_cdr_getvar(cdr, cdrcols[i], &tmp, workspace, sizeof(workspace), 0);
if (!tmp)
continue;
- snprintf(buf + strlen(buf), size - strlen(buf), "level %d: %s%c%s%c", x, cdrcols[i], delim, tmp, sep);
- if (strlen(buf) >= size) {
- ast_log(LOG_ERROR,"Data Buffer Size Exceeded!\n");
+ if (ast_build_string(&buf, &size, "level %d: %s%c%s%c", x, cdrcols[i], delim, tmp, sep)) {
+ ast_log(LOG_ERROR, "Data Buffer Size Exceeded!\n");
break;
- }
- total++;
- }
-
- if (!recur) {
- break;
+ } else
+ total++;
}
-
- cdr = cdr->next;
}
return total;