mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-18 07:48:14 +00:00
Merged revisions 315644 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ................ r315644 | twilson | 2011-04-26 14:39:01 -0700 (Tue, 26 Apr 2011) | 32 lines Merged revisions 315643 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r315643 | twilson | 2011-04-26 14:27:44 -0700 (Tue, 26 Apr 2011) | 25 lines Merged revisions 315596 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r315596 | twilson | 2011-04-26 14:16:10 -0700 (Tue, 26 Apr 2011) | 18 lines Allow transfer loops without allowing forwarding loops We try to avoid the situation where two phones may be forwarded to each other causing an infinite loop by storing each dialed interface in a channel datastore and checking the list before dialing out. This works, but currently breaks situations like A calls B, A transfers B to C, B transfers C to A, and A transfers C to B. Since human interaction is happening here and not an automated forwarding loop, it should be allowed. This patch removes the dialed_interfaces datastore when a call is bridged (a suggestion from the brilliant mmichelson). If a call is being bridged, it should be safe to assume that we aren't stuck in a loop. Since we are now handling this is the bridge code, the previous attempts at handling it in app_dial and app_queue are removed. Review: https://reviewboard.asterisk.org/r/1195/ ........ ................ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@315670 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -3416,6 +3416,22 @@ static void add_features_datastores(struct ast_channel *caller, struct ast_chann
|
||||
return;
|
||||
}
|
||||
|
||||
static void clear_dialed_interfaces(struct ast_channel *chan)
|
||||
{
|
||||
struct ast_datastore *di_datastore;
|
||||
|
||||
ast_channel_lock(chan);
|
||||
if ((di_datastore = ast_channel_datastore_find(chan, &dialed_interface_info, NULL))) {
|
||||
if (option_debug) {
|
||||
ast_log(LOG_DEBUG, "Removing dialed interfaces datastore on %s since we're bridging\n", chan->name);
|
||||
}
|
||||
if (!ast_channel_datastore_remove(chan, di_datastore)) {
|
||||
ast_datastore_free(di_datastore);
|
||||
}
|
||||
}
|
||||
ast_channel_unlock(chan);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief bridge the call and set CDR
|
||||
* \param chan,peer,config
|
||||
@@ -3601,6 +3617,13 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
|
||||
ast_clear_flag(bridge_cdr, AST_CDR_FLAG_DIALED);
|
||||
}
|
||||
ast_cel_report_event(chan, AST_CEL_BRIDGE_START, NULL, NULL, NULL);
|
||||
|
||||
/* If we are bridging a call, stop worrying about forwarding loops. We presume that if
|
||||
* a call is being bridged, that the humans in charge know what they're doing. If they
|
||||
* don't, well, what can we do about that? */
|
||||
clear_dialed_interfaces(chan);
|
||||
clear_dialed_interfaces(peer);
|
||||
|
||||
for (;;) {
|
||||
struct ast_channel *other; /* used later */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user