mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-19 11:42:27 +00:00
bridge.c: Obey BRIDGE_NOANSWER variable to skip answering channel.
If the BRIDGE_NOANSWER variable is set on a channel, it is not supposed to answer when another channel bridges to it using Bridge(), and this is checked when ast_bridge_call* is called. However, another path exists (bridge_exec -> ast_bridge_add_channel) where this variable was not checked and channels would be answered. We now check the variable there. Resolves: #401 Resolves: #1364
This commit is contained in:
@@ -2578,6 +2578,8 @@ int ast_bridge_add_channel(struct ast_bridge *bridge, struct ast_channel *chan,
|
|||||||
ast_bridge_unlock(chan_bridge);
|
ast_bridge_unlock(chan_bridge);
|
||||||
ast_bridge_unlock(bridge);
|
ast_bridge_unlock(bridge);
|
||||||
} else {
|
} else {
|
||||||
|
int noanswer;
|
||||||
|
const char *value;
|
||||||
/* Slightly less easy case. We need to yank channel A from
|
/* Slightly less easy case. We need to yank channel A from
|
||||||
* where he currently is and impart him into our bridge.
|
* where he currently is and impart him into our bridge.
|
||||||
*/
|
*/
|
||||||
@@ -2587,9 +2589,17 @@ int ast_bridge_add_channel(struct ast_bridge *bridge, struct ast_channel *chan,
|
|||||||
ast_bridge_features_destroy(features);
|
ast_bridge_features_destroy(features);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (ast_channel_state(yanked_chan) != AST_STATE_UP) {
|
|
||||||
|
ast_channel_lock(chan);
|
||||||
|
value = pbx_builtin_getvar_helper(chan, "BRIDGE_NOANSWER");
|
||||||
|
noanswer = !ast_strlen_zero(value) ? 1 : 0;
|
||||||
|
ast_channel_unlock(chan);
|
||||||
|
if (noanswer) {
|
||||||
|
ast_debug(3, "Skipping answer on bridge target channel %s\n", ast_channel_name(chan));
|
||||||
|
} else if (ast_channel_state(yanked_chan) != AST_STATE_UP) {
|
||||||
ast_answer(yanked_chan);
|
ast_answer(yanked_chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_channel_ref(yanked_chan);
|
ast_channel_ref(yanked_chan);
|
||||||
if (ast_bridge_impart(bridge, yanked_chan, NULL, features,
|
if (ast_bridge_impart(bridge, yanked_chan, NULL, features,
|
||||||
AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
|
AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
|
||||||
|
@@ -172,6 +172,9 @@
|
|||||||
<para>Additionally, to prevent a bridged channel (the target of the Bridge application)
|
<para>Additionally, to prevent a bridged channel (the target of the Bridge application)
|
||||||
from answering, the <literal>BRIDGE_NOANSWER</literal> variable can be set to inhibit
|
from answering, the <literal>BRIDGE_NOANSWER</literal> variable can be set to inhibit
|
||||||
answering.</para>
|
answering.</para>
|
||||||
|
<warning><para>Do not set the <literal>BRIDGE_NOANSWER</literal> variable globally,
|
||||||
|
as it will break normal bridging behavior in many cases. Only use this variable on
|
||||||
|
a per-channel basis when you really know what you are doing!</para></warning>
|
||||||
</option>
|
</option>
|
||||||
<option name="S(x)">
|
<option name="S(x)">
|
||||||
<para>Hang up the call after <replaceable>x</replaceable> seconds *after* the called party has answered the call.</para>
|
<para>Hang up the call after <replaceable>x</replaceable> seconds *after* the called party has answered the call.</para>
|
||||||
|
Reference in New Issue
Block a user