]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 237406 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Mon, 4 Jan 2010 18:30:44 +0000 (18:30 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Mon, 4 Jan 2010 18:30:44 +0000 (18:30 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r237406 | tilghman | 2010-01-04 12:28:28 -0600 (Mon, 04 Jan 2010) | 23 lines

  Merged revisions 237405 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r237405 | tilghman | 2010-01-04 12:19:00 -0600 (Mon, 04 Jan 2010) | 16 lines

    Add a flag to disable the Background behavior, for AGI users.
    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.6.1@237408 65c4cc65-6c06-0410-ace0-fbb531ad65f3

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

index 03955b187804fb74b05da72834522ff729b3584c..246349036c0882d1810a8c33d902043df26af76e 100644 (file)
@@ -564,6 +564,10 @@ enum {
        AST_FLAG_BRIDGE_HANGUP_DONT = (1 << 18),
        /*! 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 5e16d6319f55fba978acf664cdb3505681fe48c8..4062d8f994a0332c7aca94e9e7783400c2c0c169 100644 (file)
@@ -8304,8 +8304,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 025e9cf9c9569c979284438937ee2b8d57b0591c..01e44c8e0b14a8a6edf79569e40fe6e4827e7cd6 100644 (file)
@@ -1459,21 +1459,24 @@ 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_to_exec;
 
        if (argc < 2)
                return RESULT_SHOWUSAGE;
 
-       ast_verb(3, "AGI Script Executing Application: (%s) Options: (%s)\n", argv[1], argv[2]);
+       ast_verb(3, "AGI Script Executing Application: (%s) Options: (%s)\n", argv[1], argc >= 3 ? argv[2] : "");
 
        if ((app_to_exec = pbx_findapp(argv[1]))) {
                if(!strcasecmp(argv[1], PARK_APP_NAME)) {
                        ast_masq_park_call(chan, NULL, 0, NULL);
                }
-               if (ast_compat_res_agi && !ast_strlen_zero(argv[2])) {
+               if (!(workaround = ast_test_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS))) {
+                       ast_set_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS);
+               }
+               if (ast_compat_res_agi && argc >= 3 && !ast_strlen_zero(argv[2])) {
                        char *compat = alloca(strlen(argv[2]) * 2 + 1), *cptr, *vptr;
-                       for (cptr = compat, vptr = (argc == 2) ? "" : argv[2]; *vptr; vptr++) {
+                       for (cptr = compat, vptr = argv[2]; *vptr; vptr++) {
                                if (*vptr == ',') {
                                        *cptr++ = '\\';
                                        *cptr++ = ',';
@@ -1488,6 +1491,9 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, char **argv
                } else {
                        res = pbx_exec(chan, app_to_exec, 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;