Index: cdr.c =================================================================== RCS file: /usr/cvsroot/asterisk/cdr.c,v retrieving revision 1.11 diff -u -r1.11 cdr.c --- cdr.c 11 Jan 2004 03:23:05 -0000 1.11 +++ cdr.c 29 Jan 2004 02:42:47 -0000 @@ -410,18 +410,24 @@ return -1; } -void ast_cdr_post(struct ast_cdr *cdr) +void ast_cdr_post(struct ast_channel *chan) { - char *chan; struct ast_cdr_beitem *i; + struct ast_cdr *cdr; + char *name; + + if (!chan) + return; + cdr = chan->cdr; + if (cdr) { - chan = strlen(cdr->channel) ? cdr->channel : ""; + name = strlen(cdr->channel) ? cdr->channel : ""; if (cdr->posted) - ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan); + ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", name); if (!cdr->end.tv_sec && !cdr->end.tv_usec) - ast_log(LOG_WARNING, "CDR on channel '%s' lacks end\n", chan); + ast_log(LOG_WARNING, "CDR on channel '%s' lacks end\n", name); if (!cdr->start.tv_sec && !cdr->start.tv_usec) - ast_log(LOG_WARNING, "CDR on channel '%s' lacks start\n", chan); + ast_log(LOG_WARNING, "CDR on channel '%s' lacks start\n", name); cdr->duration = cdr->end.tv_sec - cdr->start.tv_sec + (cdr->end.tv_usec - cdr->start.tv_usec) / 1000000; if (cdr->answer.tv_sec || cdr->answer.tv_usec) { cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec + (cdr->end.tv_usec - cdr->answer.tv_usec) / 1000000; @@ -431,20 +437,25 @@ ast_mutex_lock(&cdrlock); i = bes; while(i) { - i->be(cdr); + i->be(chan); i = i->next; } ast_mutex_unlock(&cdrlock); } } -void ast_cdr_reset(struct ast_cdr *cdr, int post) +void ast_cdr_reset(struct ast_channel *chan, int post) { + struct ast_cdr *cdr; + if (!chan) + return; + cdr = chan->cdr; + if (cdr) { /* Post if requested */ if (post) { ast_cdr_end(cdr); - ast_cdr_post(cdr); + ast_cdr_post(chan); } /* Reset to initial state */ cdr->posted = 0; Index: channel.c =================================================================== RCS file: /usr/cvsroot/asterisk/channel.c,v retrieving revision 1.71 diff -u -r1.71 channel.c --- channel.c 14 Jan 2004 06:04:46 -0000 1.71 +++ channel.c 29 Jan 2004 02:42:48 -0000 @@ -648,7 +648,7 @@ /* End the CDR if it hasn't already */ ast_cdr_end(chan->cdr); /* Post and Free the CDR */ - ast_cdr_post(chan->cdr); + ast_cdr_post(chan); ast_cdr_free(chan->cdr); } if (chan->blocking) { Index: pbx.c =================================================================== RCS file: /usr/cvsroot/asterisk/pbx.c,v retrieving revision 1.94 diff -u -r1.94 pbx.c --- pbx.c 15 Jan 2004 23:06:51 -0000 1.94 +++ pbx.c 29 Jan 2004 02:42:50 -0000 @@ -4177,9 +4177,9 @@ { /* Reset the CDR as specified */ if (data) - ast_cdr_reset(chan->cdr, strchr((char *)data, 'w') ? 1 : 0); + ast_cdr_reset(chan, strchr((char *)data, 'w') ? 1 : 0); else - ast_cdr_reset(chan->cdr, 0); + ast_cdr_reset(chan, 0); return 0; } Index: include/asterisk/cdr.h =================================================================== RCS file: /usr/cvsroot/asterisk/include/asterisk/cdr.h,v retrieving revision 1.6 diff -u -r1.6 cdr.h --- include/asterisk/cdr.h 11 Jan 2004 03:23:05 -0000 1.6 +++ include/asterisk/cdr.h 29 Jan 2004 02:42:50 -0000 @@ -76,7 +76,7 @@ char userfield[AST_MAX_USER_FIELD]; }; -typedef int (*ast_cdrbe)(struct ast_cdr *cdr); +typedef int (*ast_cdrbe)(struct ast_channel *chan); //! Allocate a record /*! @@ -176,7 +176,7 @@ * Actually outputs the CDR record to the CDR plugins installed * Returns nothing */ -extern void ast_cdr_post(struct ast_cdr *cdr); +extern void ast_cdr_post(struct ast_channel *chan); //! Set the destination channel, if there was one /*! @@ -217,7 +217,7 @@ * \param cdr which cdr to act upon * \param post whether or not to post the cdr first before resetting it */ -extern void ast_cdr_reset(struct ast_cdr *cdr, int post); +extern void ast_cdr_reset(struct ast_channel *chan, int post); //! Flags to a string /*! Index: cdr/cdr_csv.c =================================================================== RCS file: /usr/cvsroot/asterisk/cdr/cdr_csv.c,v retrieving revision 1.6 diff -u -r1.6 cdr_csv.c --- cdr/cdr_csv.c 11 Jan 2004 05:04:16 -0000 1.6 +++ cdr/cdr_csv.c 29 Jan 2004 02:42:50 -0000 @@ -199,11 +199,17 @@ } -static int csv_log(struct ast_cdr *cdr) +static int csv_log(struct ast_channel *chan) { + struct ast_cdr *cdr; /* Make sure we have a big enough buf */ char buf[1024]; char csvmaster[AST_CONFIG_MAX_PATH]; + + if (!chan) + return -1; + cdr = chan->cdr; + snprintf((char *)csvmaster,sizeof(csvmaster)-1,"%s/%s/%s",(char *)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); Index: cdr/cdr_odbc.c =================================================================== RCS file: /usr/cvsroot/asterisk/cdr/cdr_odbc.c,v retrieving revision 1.11 diff -u -r1.11 cdr_odbc.c --- cdr/cdr_odbc.c 22 Jan 2004 21:27:07 -0000 1.11 +++ cdr/cdr_odbc.c 29 Jan 2004 02:42:50 -0000 @@ -50,8 +50,9 @@ static SQLHDBC ODBC_con; /* global ODBC Connection Handle */ static SQLHSTMT ODBC_stmt; /* global ODBC Statement Handle */ -static int odbc_log(struct ast_cdr *cdr) +static int odbc_log(struct ast_channel *chan) { + struct ast_cdr *cdr; long int ODBC_err; short int ODBC_mlen; int ODBC_res; @@ -61,6 +62,10 @@ struct tm tm; struct timeval tv; time_t t; + + if (!chan) + return -1; + cdr = chan->cdr; gettimeofday(&tv,NULL); t = tv.tv_sec; Index: cdr/cdr_pgsql.c =================================================================== RCS file: /usr/cvsroot/asterisk/cdr/cdr_pgsql.c,v retrieving revision 1.6 diff -u -r1.6 cdr_pgsql.c --- cdr/cdr_pgsql.c 22 Jan 2004 17:03:11 -0000 1.6 +++ cdr/cdr_pgsql.c 29 Jan 2004 02:42:50 -0000 @@ -46,13 +46,18 @@ PGconn *conn; PGresult *result; -static int pgsql_log(struct ast_cdr *cdr) +static int pgsql_log(struct ast_channel *chan) { + struct ast_cdr *cdr; struct tm tm; struct timeval tv; char sqlcmd[2048], timestr[128]; time_t t; char *pgerror; + + if (!chan) + return -1; + cdr = chan-> cdr; ast_mutex_lock(&pgsql_lock);