]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add a flag to disable the Background behavior, for AGI users.
authorTilghman Lesher <tilghman@meg.abyt.es>
Mon, 4 Jan 2010 18:19:00 +0000 (18:19 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Mon, 4 Jan 2010 18:19:00 +0000 (18:19 +0000)
This is in a section of code that relates to two other issues, namely
issue #14011 and issue #14940), one of which was the behavior of
Background when called with a context argument that matched the current
context.  This fix broke FreePBX, however, in a post-Dial situation.
Needless to say, this is an extremely difficult collision of several
different issues.  While the use of an exception flag is ugly, fixing all
of the issues linked is rather difficult (although if someone would like
to propose a better solution, we're happy to entertain that suggestion).
(closes issue #16434)
 Reported by: rickead2000
 Patches:
       20091217__issue16434.diff.txt uploaded by tilghman (license 14)
       20091222__issue16434__1.6.1.diff.txt uploaded by tilghman (license 14)
 Tested by: rickead2000

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

include/asterisk/channel.h
main/pbx.c
res/res_agi.c

index 42e473b7039dcfbcf2088156a260ee269c2d1fc8..e205a83e92e3f30bb16a09d349b6d3b7a9d1b369 100644 (file)
@@ -517,6 +517,10 @@ enum {
        AST_FLAG_BRIDGE_HANGUP_DONT = (1 << 17),
        /*! This flag indicates whether the channel is in the channel list or not. */
        AST_FLAG_IN_CHANNEL_LIST = (1 << 19),
+       /*! Disable certain workarounds.  This reintroduces certain bugs, but allows
+        *  some non-traditional dialplans (like AGI) to continue to function.
+        */
+       AST_FLAG_DISABLE_WORKAROUNDS = (1 << 20),
 };
 
 /*! \brief ast_bridge_config flags */
index 87e608e87586d2403135ab6938040efac2dbb981..8a1297a1ac94f1a5135cde1d1fb0db3d8c8fb51a 100644 (file)
@@ -5775,8 +5775,13 @@ static int pbx_builtin_background(struct ast_channel *chan, void *data)
         * (but a longer extension COULD have matched), it would have previously
         * gone immediately to the "i" extension, but will now need to wait for a
         * timeout.
+        *
+        * Later, we had to add a flag to disable this workaround, because AGI
+        * users can EXEC Background and reasonably expect that the DTMF code will
+        * be returned (see #16434).
         */
-       if ((exten[0] = res) &&
+       if (!ast_test_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS) &&
+                       (exten[0] = res) &&
                        ast_canmatch_extension(chan, args.context, exten, 1, chan->cid.cid_num) &&
                        !ast_matchmore_extension(chan, args.context, exten, 1, chan->cid.cid_num)) {
                snprintf(chan->exten, sizeof(chan->exten), "%c", res);
index f0da5e2fc493659498d7fa3494a02e5aea1ec47d..000575762320f6f673e39c4202a8618c49e8c5f8 100644 (file)
@@ -1125,7 +1125,7 @@ static int handle_hangup(struct ast_channel *chan, AGI *agi, int argc, char **ar
 
 static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, char **argv)
 {
-       int res;
+       int res, workaround;
        struct ast_app *app;
 
        if (argc < 2)
@@ -1140,7 +1140,13 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, char **argv
                if(!strcasecmp(argv[1], PARK_APP_NAME)) {
                        ast_masq_park_call(chan, NULL, 0, NULL);
                }
+               if (!(workaround = ast_test_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS))) {
+                       ast_set_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS);
+               }
                res = pbx_exec(chan, app, argc == 2 ? "" : argv[2]);
+               if (!workaround) {
+                       ast_clear_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS);
+               }
        } else {
                ast_log(LOG_WARNING, "Could not find application (%s)\n", argv[1]);
                res = -2;