diff options
Diffstat (limited to 'main/cdr.c')
-rw-r--r-- | main/cdr.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/main/cdr.c b/main/cdr.c index 259328fe1..160052000 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -781,6 +781,10 @@ void ast_cdr_setapp(struct ast_cdr *cdr, char *app, char *data) for (; cdr; cdr = cdr->next) { if (!ast_test_flag(cdr, AST_CDR_FLAG_LOCKED)) { check_post(cdr); + if (!app) + app = ""; + if (!data) + data = ""; ast_copy_string(cdr->lastapp, S_OR(app, ""), sizeof(cdr->lastapp)); ast_copy_string(cdr->lastdata, S_OR(data, ""), sizeof(cdr->lastdata)); } @@ -864,7 +868,13 @@ void ast_cdr_end(struct ast_cdr *cdr) cdr->disposition = AST_CDR_FAILED; } else cdr->duration = cdr->end.tv_sec - cdr->start.tv_sec; - cdr->billsec = ast_tvzero(cdr->answer) ? 0 : cdr->end.tv_sec - cdr->answer.tv_sec; + if (ast_tvzero(cdr->answer)) { + if (cdr->disposition == AST_CDR_ANSWERED) { + ast_log(LOG_WARNING, "CDR on channel '%s' has no answer time but is 'ANSWERED'\n", S_OR(cdr->channel, "<unknown>")); + cdr->disposition = AST_CDR_FAILED; + } + } else + cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec; } } @@ -1064,6 +1074,27 @@ void ast_cdr_reset(struct ast_cdr *cdr, struct ast_flags *_flags) } } +void ast_cdr_specialized_reset(struct ast_cdr *cdr, struct ast_flags *_flags) +{ + struct ast_flags flags = { 0 }; + + if (_flags) + ast_copy_flags(&flags, _flags, AST_FLAGS_ALL); + + if (_flags) + ast_copy_flags(&flags, _flags, AST_FLAGS_ALL); + + /* Reset to initial state */ + ast_clear_flag(cdr, AST_FLAGS_ALL); + memset(&cdr->start, 0, sizeof(cdr->start)); + memset(&cdr->end, 0, sizeof(cdr->end)); + memset(&cdr->answer, 0, sizeof(cdr->answer)); + cdr->billsec = 0; + cdr->duration = 0; + ast_cdr_start(cdr); + cdr->disposition = AST_CDR_NULL; +} + struct ast_cdr *ast_cdr_append(struct ast_cdr *cdr, struct ast_cdr *newcdr) { struct ast_cdr *ret; |