From 786deaee8a69db38a1158082d7438a17040758e8 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Wed, 7 Feb 2007 15:35:44 +0000 Subject: [PATCH] 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: https://origsvn.digium.com/svn/asterisk/trunk@53356 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_macro.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/app_macro.c b/apps/app_macro.c index c35208f736..f34b4df646 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);