Merged revisions 42452 via svnmerge from
authorJoshua Colp <jcolp@digium.com>
Fri, 8 Sep 2006 18:53:41 +0000 (18:53 +0000)
committerJoshua Colp <jcolp@digium.com>
Fri, 8 Sep 2006 18:53:41 +0000 (18:53 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r42452 | file | 2006-09-08 14:50:43 -0400 (Fri, 08 Sep 2006) | 2 lines

Swap spies during masquerading

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@42453 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/channel.c

index 8448524..908e8c0 100644 (file)
@@ -3154,6 +3154,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 = NULL;
+       struct ast_channel_spy *spy = NULL;
        int rformat = original->readformat;
        int wformat = original->writeformat;
        char newn[100];
@@ -3232,6 +3234,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... */
        x = 0;