rendered paste bodyIndex: pbx.c
===================================================================
--- pbx.c (revision 7950)
+++ pbx.c (working copy)
@@ -2361,6 +2361,8 @@
ast_log(LOG_WARNING, "Don't know what to do with '%s'\n", c->name);
out:
if ((res != AST_PBX_KEEPALIVE) && ast_exists_extension(c, c->context, "h", 1, c->cid.cid_num)) {
+ if (c->cdr)
+ ast_cdr_end(c->cdr);
c->exten[0] = 'h';
c->exten[1] = '\0';
c->priority = 1;
Index: cdr.c
===================================================================
--- cdr.c (revision 7950)
+++ cdr.c (working copy)
@@ -637,7 +637,7 @@
{
char *chan;
- while (cdr) {
+ for (; cdr; cdr = cdr->next) {
chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
if (ast_test_flag(cdr, AST_CDR_FLAG_POSTED))
ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
@@ -645,7 +645,11 @@
ast_log(LOG_WARNING, "CDR on channel '%s' has not started\n", chan);
if (ast_tvzero(cdr->end))
cdr->end = ast_tvnow();
- cdr = cdr->next;
+ cdr->duration = cdr->end.tv_sec - cdr->start.tv_sec + (cdr->end.tv_usec - cdr->start.tv_usec) / 1000000;
+ if (!ast_tvzero(cdr->answer))
+ cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec + (cdr->end.tv_usec - cdr->answer.tv_usec) / 1000000;
+ else
+ cdr->billsec = 0;
}
}
@@ -784,7 +788,7 @@
char *chan;
struct ast_cdr_beitem *i;
- while (cdr) {
+ for (; cdr; cdr = cdr->next) {
chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : "<unknown>";
if (ast_test_flag(cdr, AST_CDR_FLAG_POSTED))
ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan);
@@ -792,18 +796,12 @@
ast_log(LOG_WARNING, "CDR on channel '%s' lacks end\n", chan);
if (ast_tvzero(cdr->start))
ast_log(LOG_WARNING, "CDR on channel '%s' lacks start\n", chan);
- cdr->duration = cdr->end.tv_sec - cdr->start.tv_sec + (cdr->end.tv_usec - cdr->start.tv_usec) / 1000000;
- if (!ast_tvzero(cdr->answer))
- cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec + (cdr->end.tv_usec - cdr->answer.tv_usec) / 1000000;
- else
- cdr->billsec = 0;
ast_set_flag(cdr, AST_CDR_FLAG_POSTED);
AST_LIST_LOCK(&be_list);
AST_LIST_TRAVERSE(&be_list, i, list) {
i->be(cdr);
}
AST_LIST_UNLOCK(&be_list);
- cdr = cdr->next;
}
}