]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 53354 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Wed, 7 Feb 2007 15:33:51 +0000 (15:33 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Wed, 7 Feb 2007 15:33:51 +0000 (15:33 +0000)
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/branches/1.4@53355 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_macro.c

index 5eeecff114aa376abeb04bb1ca35cec91a9b0d8e..64becf02948ad1c39eedcde4c2044c8376fdd52d 100644 (file)
@@ -115,9 +115,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;
@@ -141,6 +142,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);
@@ -263,7 +271,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) {
                        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);
                        goto out;