]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Properly respect GOSUB_RESULT as to what to do with the master channel.
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 2 Feb 2010 20:32:29 +0000 (20:32 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 2 Feb 2010 20:32:29 +0000 (20:32 +0000)
Previously, we would parse GOSUB_RESULT, but not actually do anything with it.
Also, allow GOSUB_RETVAL to be inherited back across a peer/master channel.

(closes issue #16687)
 Reported by: bklang
 Patches:
       app_dial-preserve-gosub_retval.patch uploaded by bklang (license 919)
       (with modifications)

(closes issue #16686)
 Reported by: bklang
 Patches:
       app_dial-respect-gosub_result.patch uploaded by bklang (license 919)
       (with modifications)

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

CHANGES
apps/app_dial.c

diff --git a/CHANGES b/CHANGES
index 4f56c41bf82f83204cbae4e929ee2cbf45efe3a8..bda1cf1fc183a1d28c387982f5ea0a28942aafd7 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -131,6 +131,8 @@ Applications
    argument is provided, the 'f' option works as it always has. If an argument is
    provided, then the connected party information of all outgoing channels created
    during the Dial will be set to the argument passed to the 'f' option.
+ * Dial now inherits the GOSUB_RETVAL from the peer, when the U() option runs a
+   Gosub on the peer.
 
 Dialplan Functions
 ------------------
index 95c0b359eea4e8acc7291d9b78a4c88b3fe4d465..2ca2c4a95507f93aa37b131d37c264a3bbf5f0e2 100644 (file)
@@ -2319,27 +2319,33 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 
                        if (!res9 && (gosub_result = pbx_builtin_getvar_helper(peer, "GOSUB_RESULT"))) {
                                char *gosub_transfer_dest;
+                               const char *gosub_retval = pbx_builtin_getvar_helper(peer, "GOSUB_RETVAL");
+
+                               /* Inherit return value from the peer, so it can be used in the master */
+                               if (gosub_retval) {
+                                       pbx_builtin_setvar_helper(chan, "GOSUB_RETVAL", gosub_retval);
+                               }
 
                                if (!strcasecmp(gosub_result, "BUSY")) {
                                        ast_copy_string(pa.status, gosub_result, sizeof(pa.status));
                                        ast_set_flag64(peerflags, OPT_GO_ON);
-                                       res9 = -1;
+                                       res = -1;
                                } else if (!strcasecmp(gosub_result, "CONGESTION") || !strcasecmp(gosub_result, "CHANUNAVAIL")) {
                                        ast_copy_string(pa.status, gosub_result, sizeof(pa.status));
                                        ast_set_flag64(peerflags, OPT_GO_ON);
-                                       res9 = -1;
+                                       res = -1;
                                } else if (!strcasecmp(gosub_result, "CONTINUE")) {
                                        /* hangup peer and keep chan alive assuming the macro has changed
                                           the context / exten / priority or perhaps
                                           the next priority in the current exten is desired.
                                        */
                                        ast_set_flag64(peerflags, OPT_GO_ON);
-                                       res9 = -1;
+                                       res = -1;
                                } else if (!strcasecmp(gosub_result, "ABORT")) {
                                        /* Hangup both ends unless the caller has the g flag */
-                                       res9 = -1;
+                                       res = -1;
                                } else if (!strncasecmp(gosub_result, "GOTO:", 5) && (gosub_transfer_dest = ast_strdupa(gosub_result + 5))) {
-                                       res9 = -1;
+                                       res = -1;
                                        /* perform a transfer to a new extension */
                                        if (strchr(gosub_transfer_dest, '^')) { /* context^exten^priority*/
                                                replace_macro_delimiter(gosub_transfer_dest);