mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +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(bridge); | ||||
| 	} else { | ||||
| 		int noanswer; | ||||
| 		const char *value; | ||||
| 		/* Slightly less easy case. We need to yank channel A from | ||||
| 		 * 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); | ||||
| 			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_channel_ref(yanked_chan); | ||||
| 		if (ast_bridge_impart(bridge, yanked_chan, NULL, features, | ||||
| 			AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) { | ||||
|   | ||||
| @@ -172,6 +172,9 @@ | ||||
| 						<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 | ||||
| 						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 name="S(x)"> | ||||
| 						<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