aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcdr.c11
-rwxr-xr-xchannels/chan_sip.c16
-rwxr-xr-xchannels/chan_zap.c24
-rwxr-xr-xinclude/asterisk/cdr.h2
4 files changed, 49 insertions, 4 deletions
diff --git a/cdr.c b/cdr.c
index dd6a11ada..328a20b51 100755
--- a/cdr.c
+++ b/cdr.c
@@ -539,11 +539,16 @@ void ast_cdr_reset(struct ast_cdr *cdr, int flags)
}
-void ast_cdr_append(struct ast_cdr *cdr, struct ast_cdr *newcdr) {
+struct ast_cdr *ast_cdr_append(struct ast_cdr *cdr, struct ast_cdr *newcdr)
+{
+ struct ast_cdr *ret;
if (cdr) {
+ ret = cdr;
while(cdr->next)
cdr = cdr->next;
cdr->next = newcdr;
- } else
- ast_log(LOG_ERROR, "Can't append a CDR to NULL!\n");
+ } else {
+ ret = newcdr;
+ }
+ return ret;
}
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 94e4aa6d5..591e306f7 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7005,6 +7005,14 @@ static int attempt_transfer(struct sip_pvt *p1, struct sip_pvt *p2)
ast_moh_stop(p1->owner->bridge);
ast_moh_stop(p1->owner);
ast_moh_stop(p2->owner);
+ if (p1->owner->cdr) {
+ p2->owner->cdr = ast_cdr_append(p2->owner->cdr, p1->owner->cdr);
+ p1->owner->cdr = NULL;
+ }
+ if (p1->owner->bridge->cdr) {
+ p2->owner->cdr = ast_cdr_append(p2->owner->cdr, p1->owner->bridge->cdr);
+ p1->owner->bridge->cdr = NULL;
+ }
if (ast_channel_masquerade(p2->owner, p1->owner->bridge)) {
ast_log(LOG_WARNING, "Failed to masquerade %s into %s\n", p2->owner->name, p1->owner->bridge->name);
return -1;
@@ -7013,6 +7021,14 @@ static int attempt_transfer(struct sip_pvt *p1, struct sip_pvt *p2)
ast_moh_stop(p2->owner->bridge);
ast_moh_stop(p2->owner);
ast_moh_stop(p1->owner);
+ if (p2->owner->cdr) {
+ p1->owner->cdr = ast_cdr_append(p1->owner->cdr, p2->owner->cdr);
+ p2->owner->cdr = NULL;
+ }
+ if (p2->owner->bridge->cdr) {
+ p1->owner->cdr = ast_cdr_append(p1->owner->cdr, p2->owner->bridge->cdr);
+ p2->owner->bridge->cdr = NULL;
+ }
if (ast_channel_masquerade(p1->owner, p2->owner->bridge)) {
ast_log(LOG_WARNING, "Failed to masquerade %s into %s\n", p1->owner->name, p2->owner->bridge->name);
return -1;
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index a8b42402a..8ef934a93 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -2875,6 +2875,18 @@ static int attempt_transfer(struct zt_pvt *p)
if (p->subs[SUB_THREEWAY].owner->_state == AST_STATE_RINGING) {
ast_indicate(p->subs[SUB_REAL].owner->bridge, AST_CONTROL_RINGING);
}
+ if (p->subs[SUB_REAL].owner->cdr) {
+ /* Move CDR from second channel to current one */
+ p->subs[SUB_THREEWAY].owner->cdr =
+ ast_cdr_append(p->subs[SUB_THREEWAY].owner->cdr, p->subs[SUB_REAL].owner->cdr);
+ p->subs[SUB_REAL].owner->cdr = NULL;
+ }
+ if (p->subs[SUB_REAL].owner->bridge->cdr) {
+ /* Move CDR from second channel's bridge to current one */
+ p->subs[SUB_THREEWAY].owner->cdr =
+ ast_cdr_append(p->subs[SUB_THREEWAY].owner->cdr, p->subs[SUB_REAL].owner->bridge->cdr);
+ p->subs[SUB_REAL].owner->bridge->cdr = NULL;
+ }
if (ast_channel_masquerade(p->subs[SUB_THREEWAY].owner, p->subs[SUB_REAL].owner->bridge)) {
ast_log(LOG_WARNING, "Unable to masquerade %s as %s\n",
p->subs[SUB_REAL].owner->bridge->name, p->subs[SUB_THREEWAY].owner->name);
@@ -2888,6 +2900,18 @@ static int attempt_transfer(struct zt_pvt *p)
ast_indicate(p->subs[SUB_THREEWAY].owner->bridge, AST_CONTROL_RINGING);
}
ast_moh_stop(p->subs[SUB_THREEWAY].owner->bridge);
+ if (p->subs[SUB_THREEWAY].owner->cdr) {
+ /* Move CDR from second channel to current one */
+ p->subs[SUB_REAL].owner->cdr =
+ ast_cdr_append(p->subs[SUB_REAL].owner->cdr, p->subs[SUB_THREEWAY].owner->cdr);
+ p->subs[SUB_THREEWAY].owner->cdr = NULL;
+ }
+ if (p->subs[SUB_THREEWAY].owner->bridge->cdr) {
+ /* Move CDR from second channel's bridge to current one */
+ p->subs[SUB_REAL].owner->cdr =
+ ast_cdr_append(p->subs[SUB_REAL].owner->cdr, p->subs[SUB_THREEWAY].owner->bridge->cdr);
+ p->subs[SUB_THREEWAY].owner->bridge->cdr = NULL;
+ }
if (ast_channel_masquerade(p->subs[SUB_REAL].owner, p->subs[SUB_THREEWAY].owner->bridge)) {
ast_log(LOG_WARNING, "Unable to masquerade %s as %s\n",
p->subs[SUB_THREEWAY].owner->bridge->name, p->subs[SUB_REAL].owner->name);
diff --git a/include/asterisk/cdr.h b/include/asterisk/cdr.h
index 5c9f6c8e5..807ad6419 100755
--- a/include/asterisk/cdr.h
+++ b/include/asterisk/cdr.h
@@ -254,6 +254,6 @@ extern char ast_default_accountcode[20];
#define ast_cdr_add_flag(cdr, flag) ((cdr)->flags |= (flag))
#define ast_cdr_del_flag(cdr, flag) ((cdr)->flags &= ~(flag))
-extern void ast_cdr_append(struct ast_cdr *cdr, struct ast_cdr *newcdr);
+extern struct ast_cdr *ast_cdr_append(struct ast_cdr *cdr, struct ast_cdr *newcdr);
#endif /* _CDR_H */