From: Joshua Colp Date: Fri, 8 Sep 2006 18:50:43 +0000 (+0000) Subject: Swap spies during masquerading X-Git-Tag: 1.2.12~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25c493ffdc5781ad01495eaec2bbe0e5b123579d;p=thirdparty%2Fasterisk.git Swap spies during masquerading git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@42452 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channel.c b/channel.c index 3273343908..f53f3d48f8 100644 --- a/channel.c +++ b/channel.c @@ -2948,6 +2948,8 @@ int ast_do_masquerade(struct ast_channel *original) void *t_pvt; struct ast_callerid tmpcid; struct ast_channel *clone = original->masq; + struct ast_channel_spy_list *spy_list; + struct ast_channel_spy *spy = NULL; int rformat = original->readformat; int wformat = original->writeformat; char newn[100]; @@ -3025,6 +3027,27 @@ int ast_do_masquerade(struct ast_channel *original) original->rawwriteformat = clone->rawwriteformat; clone->rawwriteformat = x; + /* Swap the spies */ + spy_list = original->spies; + original->spies = clone->spies; + clone->spies = spy_list; + + /* Update channel on respective spy lists if present */ + if (original->spies) { + AST_LIST_TRAVERSE(&original->spies->list, spy, list) { + ast_mutex_lock(&spy->lock); + spy->chan = original; + ast_mutex_unlock(&spy->lock); + } + } + if (clone->spies) { + AST_LIST_TRAVERSE(&clone->spies->list, spy, list) { + ast_mutex_lock(&spy->lock); + spy->chan = clone; + ast_mutex_unlock(&spy->lock); + } + } + /* Save any pending frames on both sides. Start by counting * how many we're going to need... */ prev = NULL;