aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-01-04 18:30:53 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-01-04 18:30:53 +0000
commit921618f045d1c97dcf48dc6f29e3fd19ecfa8fff (patch)
tree969f91cd16917ecf49d5340e0cb86b33d55a090f
parent739aac8ba868103875b01c611911761c4326237d (diff)
Merged revisions 237406 via svnmerge from
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: http://svn.digium.com/svn/asterisk/branches/1.6.2@237409 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--include/asterisk/channel.h4
-rw-r--r--main/pbx.c7
-rw-r--r--res/res_agi.c14
3 files changed, 20 insertions, 5 deletions
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 2744b7e37..3d58c83f6 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -565,6 +565,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 */
diff --git a/main/pbx.c b/main/pbx.c
index 186bad365..3785092ad 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -8876,8 +8876,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);
diff --git a/res/res_agi.c b/res/res_agi.c
index 410357aef..cccd580e1 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -1716,21 +1716,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++ = ',';
@@ -1745,6 +1748,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;