aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-02-02 20:32:29 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-02-02 20:32:29 +0000
commit308551bc34211cd068f4c0e16df4d009cdd09d47 (patch)
tree8eb7064b171a4f617d3ace3f0d6841b0d9330578
parent533721dbc3f6c9fd3dfbd60cc2d9db946a95e94b (diff)
Properly respect GOSUB_RESULT as to what to do with the master channel.
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: http://svn.digium.com/svn/asterisk/trunk@244393 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--CHANGES2
-rw-r--r--apps/app_dial.c16
2 files changed, 13 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index 4f56c41bf..bda1cf1fc 100644
--- 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
------------------
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 95c0b359e..2ca2c4a95 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -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);