From 538fc9986c203a33cdc89393d2dc1cac247cba3c Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Wed, 27 May 2009 17:21:04 +0000 Subject: [PATCH] Fix broken attended transfers The bridge was terminating immediately after the attended transfer was completed. The problem was because upon reentering ast_channel_bridge nexteventts was checked to see if it was set and if so could possibly return AST_BRIDGE_COMPLETE. (closes issue #15183) Reported by: andrebarbosa Tested by: andrebarbosa, tootai, loloski git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@197145 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- include/asterisk/channel.h | 1 + main/channel.c | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index e71d897424..de3670f97c 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -583,6 +583,7 @@ struct ast_bridge_config { struct ast_flags features_callee; struct timeval start_time; struct timeval nexteventts; + struct timeval partialfeature_timer; long feature_timer; long timelimit; long play_warning; diff --git a/main/channel.c b/main/channel.c index 106bd2ae5e..33c8a4ca73 100644 --- a/main/channel.c +++ b/main/channel.c @@ -4471,10 +4471,11 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct ast_poll_channel_add(c0, c1); if (config->feature_timer > 0 && ast_tvzero(config->nexteventts)) { - /* nexteventts is not set when the bridge is not scheduled to - * break, so calculate when the bridge should possibly break + /* calculate when the bridge should possibly break * if a partial feature match timed out */ - config->nexteventts = ast_tvadd(ast_tvnow(), ast_samp2tv(config->feature_timer, 1000)); + config->partialfeature_timer = ast_tvadd(ast_tvnow(), ast_samp2tv(config->feature_timer, 1000)); + } else { + memset(&config->partialfeature_timer, 0, sizeof(config->partialfeature_timer)); } for (;;) { @@ -4504,8 +4505,8 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct * to not break, leave the channel bridge when the feature timer * time has elapsed so the DTMF will be sent to the other side. */ - if (!ast_tvzero(config->nexteventts)) { - int diff = ast_tvdiff_ms(config->nexteventts, ast_tvnow()); + if (!ast_tvzero(config->partialfeature_timer)) { + int diff = ast_tvdiff_ms(config->partialfeature_timer, ast_tvnow()); if (diff <= 0) { res = AST_BRIDGE_RETRY; break;