diff -burN asterisk/cdr.c /7/asterisk/cdr.c --- asterisk/cdr.c 2006-05-05 15:38:42.000000000 +1000 +++ /7/asterisk/cdr.c 2006-05-05 15:38:35.000000000 +1000 @@ -55,6 +55,7 @@ /*! Default AMA flag for billing records (CDR's) */ int ast_default_amaflags = AST_CDR_DOCUMENTATION; +int end_cdr_before_h_exten; char ast_default_accountcode[AST_MAX_ACCOUNT_CODE] = ""; struct ast_cdr_beitem { @@ -664,6 +665,11 @@ ast_log(LOG_WARNING, "CDR on channel '%s' has not started\n", chan); if (ast_tvzero(cdr->end)) cdr->end = ast_tvnow(); + cdr->duration = cdr->end.tv_sec - cdr->start.tv_sec; + if (!ast_tvzero(cdr->answer)) + cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec; + else + cdr->billsec = 0; cdr = cdr->next; } } @@ -812,12 +818,7 @@ if (ast_tvzero(cdr->start)) { ast_log(LOG_WARNING, "CDR on channel '%s' lacks start\n", chan); cdr->disposition = AST_CDR_FAILED; - } else - cdr->duration = cdr->end.tv_sec - cdr->start.tv_sec; - if (!ast_tvzero(cdr->answer)) - cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec; - else - cdr->billsec = 0; + } ast_set_flag(cdr, AST_CDR_FLAG_POSTED); AST_LIST_LOCK(&be_list); AST_LIST_TRAVERSE(&be_list, i, list) { @@ -1131,6 +1132,7 @@ struct ast_config *config; const char *enabled_value; const char *batched_value; + const char *end_before_h_value; const char *scheduleronly_value; const char *batchsafeshutdown_value; const char *size_value; @@ -1151,6 +1153,8 @@ was_batchmode = batchmode; enabled = 1; batchmode = 0; + end_cdr_before_h_exten = 0; + /* don't run the next scheduled CDR posting while reloading */ if (cdr_sched > -1) @@ -1160,6 +1164,9 @@ if ((enabled_value = ast_variable_retrieve(config, "general", "enable"))) { enabled = ast_true(enabled_value); } + if ((end_before_h_value = ast_variable_retrieve(config, "general", "endbeforehexten"))) { + end_cdr_before_h_exten = ast_true(end_before_h_value); + } if ((batched_value = ast_variable_retrieve(config, "general", "batch"))) { batchmode = ast_true(batched_value); } diff -burN asterisk/configs/cdr.conf.sample /7/asterisk/configs/cdr.conf.sample --- asterisk/configs/cdr.conf.sample 2006-05-05 15:38:43.000000000 +1000 +++ /7/asterisk/configs/cdr.conf.sample 2006-05-05 14:54:27.000000000 +1000 @@ -49,3 +49,9 @@ ; is "yes". ;safeshutdown=yes +; Normally, CDR's are not closed out until after all extensions are finished +; executing. By enabling this option, the CDR will be ended before executing +; the "h" extension so that CDR values such as "end" and "billsec" may be +; retrieved inside of of this extension. +;endbeforehexten=no + diff -burN asterisk/include/asterisk/cdr.h /7/asterisk/include/asterisk/cdr.h --- asterisk/include/asterisk/cdr.h 2006-05-05 15:38:43.000000000 +1000 +++ /7/asterisk/include/asterisk/cdr.h 2006-05-05 15:33:41.000000000 +1000 @@ -280,6 +280,7 @@ extern int ast_default_amaflags; +extern int end_cdr_before_h_exten; extern char ast_default_accountcode[AST_MAX_ACCOUNT_CODE]; diff -burN asterisk/pbx.c /7/asterisk/pbx.c --- asterisk/pbx.c 2006-05-05 15:38:44.000000000 +1000 +++ /7/asterisk/pbx.c 2006-05-05 14:52:19.000000000 +1000 @@ -2442,6 +2442,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 && end_cdr_before_h_exten) + ast_cdr_end(c->cdr); c->exten[0] = 'h'; c->exten[1] = '\0'; c->priority = 1;