Merged revisions 84274 via svnmerge from
authorDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Mon, 1 Oct 2007 21:31:16 +0000 (21:31 +0000)
committerDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Mon, 1 Oct 2007 21:31:16 +0000 (21:31 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r84274 | dhubbard | 2007-10-01 16:25:37 -0500 (Mon, 01 Oct 2007) | 1 line

moved get_base_channel() code from action_redirect to ast_channel_masquerade() for issue 7706 and BE-160
........

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

channels/chan_agent.c
main/channel.c
main/manager.c

index 438134f..f3fdd19 100644 (file)
@@ -702,17 +702,20 @@ static void set_agentbycallerid(const char *callerid, const char *agent)
        pbx_builtin_setvar_helper(NULL, buf, agent);
 }
 
+/*! \brief return the channel or base channel if one exists.  This function assumes the channel it is called on is already locked */
 struct ast_channel* agent_get_base_channel(struct ast_channel *chan)
 {
        struct agent_pvt *p = NULL;
-       struct ast_channel *base = NULL;
-       
+       struct ast_channel *base = chan;
+
+       /* chan is locked by the calling function */
        if (!chan || !chan->tech_pvt) {
                ast_log(LOG_ERROR, "whoa, you need a channel (0x%ld) with a tech_pvt (0x%ld) to get a base channel.\n", (long)chan, (chan)?(long)chan->tech_pvt:(long)NULL);
-       } else {
-               p = chan->tech_pvt;
-               base = p->chan;
+               return NULL;
        }
+       p = chan->tech_pvt;
+       if (p->chan) 
+               base = p->chan;
        return base;
 }
 
index e11afe9..1976e11 100644 (file)
@@ -3333,7 +3333,7 @@ int ast_channel_make_compatible(struct ast_channel *chan, struct ast_channel *pe
 int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clone)
 {
        int res = -1;
-       struct ast_channel *final_orig, *final_clone;
+       struct ast_channel *final_orig, *final_clone, *base;
 
 retrymasq:
        final_orig = original;
@@ -3353,6 +3353,10 @@ retrymasq:
 
        if (clone->_bridge && (clone->_bridge != ast_bridged_channel(clone)) && (clone->_bridge->_bridge != clone))
                final_clone = clone->_bridge;
+       
+       if (final_clone->tech->get_base_channel && (base = final_clone->tech->get_base_channel(final_clone))) {
+               final_clone = base;
+       }
 
        if ((final_orig != original) || (final_clone != clone)) {
                /* Lots and lots of deadlock avoidance.  The main one we're competing with
index ff62824..83e9c82 100644 (file)
@@ -1787,7 +1787,7 @@ static int action_redirect(struct mansession *s, const struct message *m)
        const char *exten = astman_get_header(m, "Exten");
        const char *context = astman_get_header(m, "Context");
        const char *priority = astman_get_header(m, "Priority");
-       struct ast_channel *base, *chan, *chan2 = NULL;
+       struct ast_channel *chan, *chan2 = NULL;
        int pi = 0;
        int res;
 
@@ -1809,14 +1809,6 @@ static int action_redirect(struct mansession *s, const struct message *m)
                astman_send_error(s, m, buf);
                return 0;
        }
-       if (chan->tech->get_base_channel) {
-               base = chan->tech->get_base_channel(chan);
-               if (base) {
-                       ast_mutex_unlock(&chan->lock);
-                       chan = base;
-                       ast_mutex_lock(&chan->lock);
-               }
-       }
        if (ast_check_hangup(chan)) {
                astman_send_error(s, m, "Redirect failed, channel not up.\n");
                ast_channel_unlock(chan);
@@ -1830,14 +1822,6 @@ static int action_redirect(struct mansession *s, const struct message *m)
                ast_channel_unlock(chan2);
                return 0;
        }
-       if (chan2 && chan2->tech->get_base_channel) {
-               base = chan2->tech->get_base_channel(chan2);
-               if (base) {
-                       ast_mutex_unlock(&chan2->lock);
-                       chan2 = base;
-                       ast_mutex_lock(&chan2->lock);
-               }
-       }
        res = ast_async_goto(chan, context, exten, pi);
        if (!res) {
                if (!ast_strlen_zero(name2)) {