aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_macro.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-07 15:35:44 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-07 15:35:44 +0000
commitfe7f5ebc0f7a0425c16f9a637e3f920ef0a86682 (patch)
tree2165d6474d6877ba4794a4c1c2720f1710516ab2 /apps/app_macro.c
parentb4e125b4561e761bd15d839a74d11937308e0767 (diff)
Merged revisions 53355 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r53355 | tilghman | 2007-02-07 09:33:51 -0600 (Wed, 07 Feb 2007) | 10 lines Merged revisions 53354 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r53354 | tilghman | 2007-02-07 09:30:02 -0600 (Wed, 07 Feb 2007) | 2 lines Issue 7440 - Macro called from Macro from the h extension exits prematurely ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@53356 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_macro.c')
-rw-r--r--apps/app_macro.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/apps/app_macro.c b/apps/app_macro.c
index c35208f73..f34b4df64 100644
--- a/apps/app_macro.c
+++ b/apps/app_macro.c
@@ -117,9 +117,10 @@ static int _macro_exec(struct ast_channel *chan, void *data, int exclusive)
int oldpriority;
char pc[80], depthc[12];
char oldcontext[AST_MAX_CONTEXT] = "";
+ const char *inhangupc;
int offset, depth = 0, maxdepth = 7;
int setmacrocontext=0;
- int autoloopflag, dead = 0;
+ int autoloopflag, dead = 0, inhangup = 0;
char *save_macro_exten;
char *save_macro_context;
@@ -143,6 +144,13 @@ static int _macro_exec(struct ast_channel *chan, void *data, int exclusive)
s = pbx_builtin_getvar_helper(chan, "MACRO_DEPTH");
if (s)
sscanf(s, "%d", &depth);
+ /* Used for detecting whether to return when a Macro is called from another Macro after hangup */
+ if (strcmp(chan->exten, "h") == 0)
+ pbx_builtin_setvar_helper(chan, "MACRO_IN_HANGUP", "1");
+ inhangupc = pbx_builtin_getvar_helper(chan, "MACRO_IN_HANGUP");
+ if (!ast_strlen_zero(inhangupc))
+ sscanf(inhangupc, "%d", &inhangup);
+
if (depth >= maxdepth) {
ast_log(LOG_ERROR, "Macro(): possible infinite loop detected. Returning early.\n");
ast_module_user_remove(u);
@@ -267,7 +275,7 @@ static int _macro_exec(struct ast_channel *chan, void *data, int exclusive)
break;
}
/* don't stop executing extensions when we're in "h" */
- if (chan->_softhangup && strcasecmp(oldexten,"h") && strcasecmp(chan->macroexten,"h")) {
+ if (chan->_softhangup && !inhangup) {
if (option_debug)
ast_log(LOG_DEBUG, "Extension %s, macroexten %s, priority %d returned normally even though call was hung up\n",
chan->exten, chan->macroexten, chan->priority);