--- /usr/src/asterisk-1.2.14/cdr.c 2006-11-30 12:42:45.000000000 -0600 +++ /usr/src/asterisk/cdr.c 2007-01-26 19:06:07.000000000 -0600 @@ -238,6 +238,12 @@ localtime_r(&t, &tm); strftime(workspace, workspacelen, fmt, &tm); } + } else if (!strcasecmp(name, "pdd")) { /* LES */ + t = cdr->pdd.tv_sec; + if (t) { + localtime_r(&t, &tm); + strftime(workspace, workspacelen, fmt, &tm); + } } else if (!strcasecmp(name, "answer")) { t = cdr->answer.tv_sec; if (t) { @@ -252,6 +258,8 @@ } } else if (!strcasecmp(name, "duration")) snprintf(workspace, workspacelen, "%ld", cdr->duration); + else if (!strcasecmp(name, "pddsec")) /* LES */ + snprintf(workspace, workspacelen, "%ld", cdr->pddsec); else if (!strcasecmp(name, "billsec")) snprintf(workspace, workspacelen, "%ld", cdr->billsec); else if (!strcasecmp(name, "disposition")) @@ -279,7 +287,7 @@ struct ast_var_t *newvariable; struct varshead *headp; const char *read_only[] = { "clid", "src", "dst", "dcontext", "channel", "dstchannel", - "lastapp", "lastdata", "start", "answer", "end", "duration", + "lastapp", "lastdata", "start", "pdd", "answer", "end", "pddsec", "duration", /* LES */ "billsec", "disposition", "amaflags", "accountcode", "uniqueid", "userfield", NULL }; int x; @@ -363,8 +371,10 @@ "lastapp", "lastdata", "start", + "pdd", /* LES */ "answer", "end", + "pddsec", /* LES */ "duration", "billsec", "disposition", @@ -475,11 +485,28 @@ if (!ast_tvzero(cdr->start)) ast_log(LOG_WARNING, "CDR on channel '%s' already started\n", chan); cdr->start = ast_tvnow(); + cdr->pdd = ast_tvnow(); /* LES */ } cdr = cdr->next; } } +void ast_cdr_pdd(struct ast_cdr *cdr) /* LES */ +{ + char *chan; + + while (cdr) { + if (!ast_test_flag(cdr, AST_CDR_FLAG_LOCKED)) { + chan = !ast_strlen_zero(cdr->channel) ? cdr->channel : ""; + if (ast_test_flag(cdr, AST_CDR_FLAG_POSTED)) + ast_log(LOG_WARNING, "CDR on channel '%s' already posted\n", chan); + cdr->pdd = ast_tvnow(); + } + cdr = cdr->next; + } +} + + void ast_cdr_answer(struct ast_cdr *cdr) { char *chan; @@ -812,8 +839,10 @@ if (ast_tvzero(cdr->start)) { ast_log(LOG_NOTICE, "CDR on channel '%s' lacks start\n", chan); cdr->disposition = AST_CDR_FAILED; - } else + } else { + cdr->pddsec = cdr->pdd.tv_sec - cdr->start.tv_sec; /* LES */ 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 @@ -855,10 +884,12 @@ /* Reset to initial state */ ast_clear_flag(cdr, AST_FLAGS_ALL); memset(&cdr->start, 0, sizeof(cdr->start)); + memset(&cdr->pdd, 0, sizeof(cdr->pdd)); memset(&cdr->end, 0, sizeof(cdr->end)); memset(&cdr->answer, 0, sizeof(cdr->answer)); cdr->billsec = 0; cdr->duration = 0; + cdr->pddsec = 0; /* LES */ ast_cdr_start(cdr); cdr->disposition = AST_CDR_NOANSWER; }