]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 257810 via svnmerge from
authorTerry Wilson <twilson@digium.com>
Mon, 19 Apr 2010 18:22:24 +0000 (18:22 +0000)
committerTerry Wilson <twilson@digium.com>
Mon, 19 Apr 2010 18:22:24 +0000 (18:22 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r257810 | twilson | 2010-04-19 12:57:41 -0500 (Mon, 19 Apr 2010) | 5 lines

  Fix incomplete CDR merge from r195881

  Because res/res_features.c was removed and main/cdr.c added, these changes
  didn't make it to trunk and the 1.6.x branches
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@257833 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/features.c

index 386f39b4446c6570d3b67c545446913f499ee14c..2794a8c3155e05626e5a7ef4029a0c01116a6aad 100644 (file)
@@ -2420,8 +2420,8 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
        struct ast_bridge_config backup_config;
        struct ast_cdr *bridge_cdr = NULL;
        struct ast_cdr *orig_peer_cdr = NULL;
-       struct ast_cdr *chan_cdr = pick_unlocked_cdr(chan->cdr); /* the proper chan cdr, if there are forked cdrs */
-       struct ast_cdr *peer_cdr = pick_unlocked_cdr(peer->cdr); /* the proper chan cdr, if there are forked cdrs */
+       struct ast_cdr *chan_cdr = chan->cdr; /* the proper chan cdr, if there are forked cdrs */
+       struct ast_cdr *peer_cdr = peer->cdr; /* the proper chan cdr, if there are forked cdrs */
        struct ast_cdr *new_chan_cdr = NULL; /* the proper chan cdr, if there are forked cdrs */
        struct ast_cdr *new_peer_cdr = NULL; /* the proper chan cdr, if there are forked cdrs */
 
@@ -2483,6 +2483,10 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
                        ast_set_flag(chan_cdr, AST_CDR_FLAG_MAIN);
                        ast_cdr_update(chan);
                        bridge_cdr = ast_cdr_dup(chan_cdr);
+                       /* rip any forked CDR's off of the chan_cdr and attach
+                        * them to the bridge_cdr instead */
+                       bridge_cdr->next = chan_cdr->next;
+                       chan_cdr->next = NULL;
                        ast_copy_string(bridge_cdr->lastapp, S_OR(chan->appl, ""), sizeof(bridge_cdr->lastapp));
                        ast_copy_string(bridge_cdr->lastdata, S_OR(chan->data, ""), sizeof(bridge_cdr->lastdata));
                        if (peer_cdr && !ast_strlen_zero(peer_cdr->userfield)) {
@@ -2529,11 +2533,11 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
                   tvcmp check to the if below */
 
                if (peer_cdr && !ast_tvzero(peer_cdr->answer) && ast_tvcmp(peer_cdr->answer, bridge_cdr->start) >= 0) {
-                       bridge_cdr->answer = peer_cdr->answer;
-                       bridge_cdr->disposition = peer_cdr->disposition;
+                       ast_cdr_setanswer(bridge_cdr, peer_cdr->answer);
+                       ast_cdr_setdisposition(bridge_cdr, peer_cdr->disposition);
                        if (chan_cdr) {
-                               chan_cdr->answer = peer_cdr->answer;
-                               chan_cdr->disposition = peer_cdr->disposition;
+                               ast_cdr_setanswer(chan_cdr, peer_cdr->answer);
+                               ast_cdr_setdisposition(chan_cdr, peer_cdr->disposition);
                        }
                } else {
                        ast_cdr_answer(bridge_cdr);