diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-07-25 22:56:18 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-07-25 22:56:18 +0000 |
commit | 757aadd53d3f0334f03d4872a7dbdd2258c8d09c (patch) | |
tree | fbd26c63149113f1251a6f1c2c001a7a737c2ea9 | |
parent | 1c3fb6124c461a6b424c21c2e5bfc3992b40609b (diff) |
use CDR API calls instead of re-implementing them (bug #4726)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6213 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | apps/app_forkcdr.c | 33 | ||||
-rwxr-xr-x | cdr.c | 4 | ||||
-rwxr-xr-x | include/asterisk/cdr.h | 6 |
3 files changed, 21 insertions, 22 deletions
diff --git a/apps/app_forkcdr.c b/apps/app_forkcdr.c index 9300dc257..23be3bcd4 100755 --- a/apps/app_forkcdr.c +++ b/apps/app_forkcdr.c @@ -40,28 +40,21 @@ STANDARD_LOCAL_USER; LOCAL_USER_DECL; - -static void ast_cdr_clone(struct ast_cdr *cdr) -{ - struct ast_cdr *newcdr = ast_cdr_alloc(); - memcpy(newcdr,cdr,sizeof(struct ast_cdr)); - ast_cdr_append(cdr,newcdr); - newcdr->start = ast_tvnow(); - memset(&newcdr->answer, 0, sizeof(newcdr->answer)); - memset(&newcdr->varshead, 0, sizeof(newcdr->varshead)); - ast_cdr_copy_vars(newcdr, cdr); - if (!ast_test_flag(cdr, AST_CDR_FLAG_KEEP_VARS)) { - ast_cdr_free_vars(cdr, 0); - } - newcdr->disposition = AST_CDR_NOANSWER; - ast_set_flag(cdr, AST_CDR_FLAG_CHILD|AST_CDR_FLAG_LOCKED); -} - static void ast_cdr_fork(struct ast_channel *chan) { - if(chan && chan->cdr) { - ast_cdr_clone(chan->cdr); - } + struct ast_cdr *cdr; + struct ast_cdr *newcdr; + if (!chan || !(cdr = chan->cdr)) + return; + while (cdr->next) + cdr = cdr->next; + if (!(newcdr = ast_cdr_dup(cdr))) + return; + ast_cdr_append(cdr, newcdr); + ast_cdr_reset(newcdr, AST_CDR_FLAG_KEEP_VARS); + if (!ast_test_flag(cdr, AST_CDR_FLAG_KEEP_VARS)) + ast_cdr_free_vars(cdr, 0); + ast_set_flag(cdr, AST_CDR_FLAG_CHILD | AST_CDR_FLAG_LOCKED); } static int forkcdr_exec(struct ast_channel *chan, void *data) @@ -147,7 +147,7 @@ void ast_cdr_unregister(char *name) AST_LIST_UNLOCK(&be_list); } -static struct ast_cdr *cdr_dup(struct ast_cdr *cdr) +struct ast_cdr *ast_cdr_dup(struct ast_cdr *cdr) { struct ast_cdr *newcdr; @@ -809,7 +809,7 @@ void ast_cdr_reset(struct ast_cdr *cdr, int flags) if (ast_test_flag(&tmp, AST_CDR_FLAG_LOCKED) || !ast_test_flag(cdr, AST_CDR_FLAG_LOCKED)) { if (ast_test_flag(&tmp, AST_CDR_FLAG_POSTED)) { ast_cdr_end(cdr); - if ((dup = cdr_dup(cdr))) { + if ((dup = ast_cdr_dup(cdr))) { ast_cdr_detach(dup); } ast_set_flag(cdr, AST_CDR_FLAG_POSTED); diff --git a/include/asterisk/cdr.h b/include/asterisk/cdr.h index e9b8aad07..e42a4e690 100755 --- a/include/asterisk/cdr.h +++ b/include/asterisk/cdr.h @@ -104,6 +104,12 @@ typedef int (*ast_cdrbe)(struct ast_cdr *cdr); */ extern struct ast_cdr *ast_cdr_alloc(void); +/*! Duplicate a record */ +/*! + * Returns a malloc'd ast_cdr structure, returns NULL on error (malloc failure) + */ +extern struct ast_cdr *ast_cdr_dup(struct ast_cdr *cdr); + /*! Free a record */ /* \param cdr ast_cdr structure to free * Returns nothing important |