Index: cdr/cdr_csv.c =================================================================== RCS file: /usr/cvsroot/asterisk/cdr/cdr_csv.c,v retrieving revision 1.8 diff -u -p -r1.8 cdr_csv.c --- cdr/cdr_csv.c 13 Jun 2004 21:25:10 -0000 1.8 +++ cdr/cdr_csv.c 14 Jul 2004 07:51:38 -0000 @@ -71,16 +71,16 @@ static char *name = "csv"; static FILE *mf = NULL; -static int append_string(char *buf, char *s, int len) +static int append_string(char *buf, char *s, size_t bufsize) { int pos = strlen(buf); int spos = 0; int error = 0; - if (pos >= len - 4) + if (pos >= bufsize - 4) return -1; buf[pos++] = '\"'; error = -1; - while(pos < len - 3) { + while(pos < bufsize - 3) { if (!s[spos]) { error = 0; break; @@ -96,87 +96,87 @@ static int append_string(char *buf, char return error; } -static int append_int(char *buf, int s, int len) +static int append_int(char *buf, int s, size_t bufsize) { char tmp[32]; int pos = strlen(buf); snprintf(tmp, sizeof(tmp), "%d", s); - if (pos + strlen(tmp) > len - 3) + if (pos + strlen(tmp) > bufsize - 3) return -1; - strncat(buf, tmp, len); + strncat(buf, tmp, bufsize - strlen(buf) - 1); pos = strlen(buf); buf[pos++] = ','; buf[pos++] = '\0'; return 0; } -static int append_date(char *buf, struct timeval tv, int len) +static int append_date(char *buf, struct timeval tv, size_t bufsize) { - char tmp[80]; + char tmp[80] = ""; struct tm tm; time_t t; t = tv.tv_sec; - if (strlen(buf) > len - 3) + if (strlen(buf) > bufsize - 3) return -1; if (!tv.tv_sec && !tv.tv_usec) { - strncat(buf, ",", len); + strncat(buf, ",", bufsize - strlen(buf) - 1); return 0; } localtime_r(&t,&tm); strftime(tmp, sizeof(tmp), DATE_FORMAT, &tm); - return append_string(buf, tmp, len); + return append_string(buf, tmp, bufsize); } -static int build_csv_record(char *buf, int len, struct ast_cdr *cdr) +static int build_csv_record(char *buf, size_t bufsize, struct ast_cdr *cdr) { buf[0] = '\0'; /* Account code */ - append_string(buf, cdr->accountcode, len); + append_string(buf, cdr->accountcode, bufsize); /* Source */ - append_string(buf, cdr->src, len); + append_string(buf, cdr->src, bufsize); /* Destination */ - append_string(buf, cdr->dst, len); + append_string(buf, cdr->dst, bufsize); /* Destination context */ - append_string(buf, cdr->dcontext, len); + append_string(buf, cdr->dcontext, bufsize); /* Caller*ID */ - append_string(buf, cdr->clid, len); + append_string(buf, cdr->clid, bufsize); /* Channel */ - append_string(buf, cdr->channel, len); + append_string(buf, cdr->channel, bufsize); /* Destination Channel */ - append_string(buf, cdr->dstchannel, len); + append_string(buf, cdr->dstchannel, bufsize); /* Last Application */ - append_string(buf, cdr->lastapp, len); + append_string(buf, cdr->lastapp, bufsize); /* Last Data */ - append_string(buf, cdr->lastdata, len); + append_string(buf, cdr->lastdata, bufsize); /* Start Time */ - append_date(buf, cdr->start, len); + append_date(buf, cdr->start, bufsize); /* Answer Time */ - append_date(buf, cdr->answer, len); + append_date(buf, cdr->answer, bufsize); /* End Time */ - append_date(buf, cdr->end, len); + append_date(buf, cdr->end, bufsize); /* Duration */ - append_int(buf, cdr->duration, len); + append_int(buf, cdr->duration, bufsize); /* Billable seconds */ - append_int(buf, cdr->billsec, len); + append_int(buf, cdr->billsec, bufsize); /* Disposition */ - append_string(buf, ast_cdr_disp2str(cdr->disposition), len); + append_string(buf, ast_cdr_disp2str(cdr->disposition), bufsize); /* AMA Flags */ - append_string(buf, ast_cdr_flags2str(cdr->amaflags), len); + append_string(buf, ast_cdr_flags2str(cdr->amaflags), bufsize); #ifdef CSV_LOGUNIQUEID /* Unique ID */ - append_string(buf, cdr->uniqueid, len); + append_string(buf, cdr->uniqueid, bufsize); #endif #ifdef CSV_LOGUSERFIELD /* append the user field */ - append_string(buf, cdr->userfield,len); + append_string(buf, cdr->userfield,bufsize); #endif /* If we hit the end of our buffer, log an error */ - if (strlen(buf) < len - 5) { + if (strlen(buf) < bufsize - 5) { /* Trim off trailing comma */ buf[strlen(buf) - 1] = '\0'; - strncat(buf, "\n", len); + strncat(buf, "\n", bufsize - strlen(buf) - 1); return 0; } return -1; @@ -205,7 +205,7 @@ static int csv_log(struct ast_cdr *cdr) /* Make sure we have a big enough buf */ char buf[1024]; char csvmaster[AST_CONFIG_MAX_PATH]; - snprintf((char *)csvmaster,sizeof(csvmaster)-1,"%s/%s/%s",(char *)ast_config_AST_LOG_DIR,CSV_LOG_DIR,CSV_MASTER); + snprintf(csvmaster, sizeof(csvmaster),"%s/%s/%s", ast_config_AST_LOG_DIR, CSV_LOG_DIR, CSV_MASTER); #if 0 printf("[CDR] %s ('%s' -> '%s') Dur: %ds Bill: %ds Disp: %s Flags: %s Account: [%s]\n", cdr->channel, cdr->src, cdr->dst, cdr->duration, cdr->billsec, ast_cdr_disp2str(cdr->disposition), ast_cdr_flags2str(cdr->amaflags), cdr->accountcode); #endif