diff options
author | Kevin Harwell <kharwell@digium.com> | 2017-10-31 15:08:38 -0500 |
---|---|---|
committer | Kevin Harwell <kharwell@digium.com> | 2017-10-31 15:08:38 -0500 |
commit | a7c00707a596d1254eab56e7f4162f78a176b42a (patch) | |
tree | 45c6177cd7695ec0a54272d15359d24d1d777414 | |
parent | ae2687494a3bbb0ca7ccd8dbe1c68d35f22b81f0 (diff) |
features: Bridge application's BRIDGERESULT not appropriately set
The dialplan application "Bridge" was not setting the BRIDGERESULT to failure
when a failure did occur. Even worse if it did fail to join the bridge it would
still report success.
This patch now sets the BRIDGERESULT variable to an appropriate value for a
given condition state. Also, removed the value INCOMPATIBLE as a valid result
type since it is no longer used.
ASTERISK-27369 #close
Change-Id: I22588e7125a765edf35cff28c98ca143e9927554
-rw-r--r-- | main/features.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/main/features.c b/main/features.c index a4d406811..2ca56bcd3 100644 --- a/main/features.c +++ b/main/features.c @@ -198,7 +198,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <value name="FAILURE" /> <value name="LOOP" /> <value name="NONEXISTENT" /> - <value name="INCOMPATIBLE" /> </variable> </variablelist> </description> @@ -1009,6 +1008,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data) const char *extension; int priority; int bridge_add_failed; + int res = -1; struct ast_bridge_features chan_features; struct ast_bridge_features *peer_features; struct ast_bridge *bridge; @@ -1035,6 +1035,7 @@ static int bridge_exec(struct ast_channel *chan, const char *data) if (!current_dest_chan) { ast_log(LOG_WARNING, "Bridge failed because channel %s does not exist\n", args.dest_chan); + pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "NONEXISTENT"); return 0; } @@ -1042,13 +1043,13 @@ static int bridge_exec(struct ast_channel *chan, const char *data) if (chan == current_dest_chan) { ast_channel_unref(current_dest_chan); ast_log(LOG_WARNING, "Unable to bridge channel %s with itself\n", ast_channel_name(chan)); + pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "LOOP"); return 0; } if (ast_test_flag(&opts, OPT_DURATION_LIMIT) && !ast_strlen_zero(opt_args[OPT_ARG_DURATION_LIMIT]) && ast_bridge_timelimit(chan, &bconfig, opt_args[OPT_ARG_DURATION_LIMIT], &calldurationlimit)) { - pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "FAILURE"); goto done; } @@ -1127,14 +1128,18 @@ static int bridge_exec(struct ast_channel *chan, const char *data) /* Don't keep the channel ref in case it was not already in a bridge. */ current_dest_chan = ast_channel_unref(current_dest_chan); - ast_bridge_join(bridge, chan, NULL, &chan_features, NULL, + res = ast_bridge_join(bridge, chan, NULL, &chan_features, NULL, AST_BRIDGE_JOIN_PASS_REFERENCE); ast_bridge_features_cleanup(&chan_features); - /* The bridge has ended, set BRIDGERESULT to SUCCESS. */ - pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "SUCCESS"); done: + if (res == -1) { + pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "FAILURE"); + } else { + pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "SUCCESS"); + } + ast_free((char *) bconfig.warning_sound); ast_free((char *) bconfig.end_sound); ast_free((char *) bconfig.start_sound); |