diff options
Diffstat (limited to 'main/manager.c')
-rw-r--r-- | main/manager.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/main/manager.c b/main/manager.c index a4ad0563d..05ef9a4d2 100644 --- a/main/manager.c +++ b/main/manager.c @@ -4545,6 +4545,8 @@ static int action_redirect(struct mansession *s, const struct message *m) int pi = 0; int pi2 = 0; int res; + int chan1_wait = 0; + int chan2_wait = 0; if (ast_strlen_zero(name)) { astman_send_error(s, m, "Channel not specified"); @@ -4629,16 +4631,20 @@ static int action_redirect(struct mansession *s, const struct message *m) } /* Dual channel redirect in progress. */ - if (ast_channel_pbx(chan)) { - ast_channel_lock(chan); + ast_channel_lock(chan); + if (ast_channel_is_bridged(chan)) { ast_set_flag(ast_channel_flags(chan), AST_FLAG_BRIDGE_DUAL_REDIRECT_WAIT); - ast_channel_unlock(chan); + chan1_wait = 1; } - if (ast_channel_pbx(chan2)) { - ast_channel_lock(chan2); + ast_channel_unlock(chan); + + ast_channel_lock(chan2); + if (ast_channel_is_bridged(chan2)) { ast_set_flag(ast_channel_flags(chan2), AST_FLAG_BRIDGE_DUAL_REDIRECT_WAIT); - ast_channel_unlock(chan2); + chan2_wait = 1; } + ast_channel_unlock(chan2); + res = ast_async_goto(chan, context, exten, pi); if (!res) { if (!ast_strlen_zero(context2)) { @@ -4656,12 +4662,12 @@ static int action_redirect(struct mansession *s, const struct message *m) } /* Release the bridge wait. */ - if (ast_channel_pbx(chan)) { + if (chan1_wait) { ast_channel_lock(chan); ast_clear_flag(ast_channel_flags(chan), AST_FLAG_BRIDGE_DUAL_REDIRECT_WAIT); ast_channel_unlock(chan); } - if (ast_channel_pbx(chan2)) { + if (chan2_wait) { ast_channel_lock(chan2); ast_clear_flag(ast_channel_flags(chan2), AST_FLAG_BRIDGE_DUAL_REDIRECT_WAIT); ast_channel_unlock(chan2); |