|
|
|
|
@ -65,6 +65,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
char oldcontext[256] = "";
|
|
|
|
|
char *offsets;
|
|
|
|
|
int offset;
|
|
|
|
|
int setmacrocontext=0;
|
|
|
|
|
|
|
|
|
|
char *save_macro_exten;
|
|
|
|
|
char *save_macro_context;
|
|
|
|
|
@ -94,6 +95,10 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
oldpriority = chan->priority;
|
|
|
|
|
strncpy(oldexten, chan->exten, sizeof(oldexten) - 1);
|
|
|
|
|
strncpy(oldcontext, chan->context, sizeof(oldcontext) - 1);
|
|
|
|
|
if (!strlen(chan->macrocontext)) {
|
|
|
|
|
strncpy(chan->macrocontext, chan->context, sizeof(chan->macrocontext) - 1);
|
|
|
|
|
setmacrocontext=1;
|
|
|
|
|
}
|
|
|
|
|
argc = 1;
|
|
|
|
|
/* Save old macro variables */
|
|
|
|
|
save_macro_exten = pbx_builtin_getvar_helper(chan, "MACRO_EXTEN");
|
|
|
|
|
@ -115,10 +120,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
|
|
|
|
|
/* Setup environment for new run */
|
|
|
|
|
strcpy(chan->exten, "s");
|
|
|
|
|
#if 0
|
|
|
|
|
/* Don't overwrite it because sometimes we have to know the real context */
|
|
|
|
|
strncpy(chan->context, fullmacro, sizeof(chan->context));
|
|
|
|
|
#endif
|
|
|
|
|
chan->priority = 1;
|
|
|
|
|
|
|
|
|
|
while((cur = strsep(&rest, "|")) && (argc < MAX_ARGS)) {
|
|
|
|
|
@ -131,8 +133,8 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
pbx_builtin_setvar_helper(chan, varname, cur);
|
|
|
|
|
argc++;
|
|
|
|
|
}
|
|
|
|
|
while(ast_exists_extension(chan, fullmacro, chan->exten, chan->priority, chan->callerid)) {
|
|
|
|
|
if ((res = ast_spawn_extension(chan, fullmacro, chan->exten, chan->priority, chan->callerid))) {
|
|
|
|
|
while(ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid)) {
|
|
|
|
|
if ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid))) {
|
|
|
|
|
/* Something bad happened, or a hangup has been requested. */
|
|
|
|
|
if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) {
|
|
|
|
|
/* Just return result as to the previous application as if it had been dialed */
|
|
|
|
|
@ -155,7 +157,7 @@ static int macro_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (strcmp(chan->context, oldcontext) || strcmp(chan->exten, "s")) {
|
|
|
|
|
if (strcasecmp(chan->context, fullmacro)) {
|
|
|
|
|
if (option_verbose > 1)
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_2 "Channel '%s' jumping out of macro '%s'\n", chan->name, macro);
|
|
|
|
|
break;
|
|
|
|
|
@ -186,6 +188,8 @@ out:
|
|
|
|
|
if (save_macro_context) free(save_macro_context);
|
|
|
|
|
pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority);
|
|
|
|
|
if (save_macro_priority) free(save_macro_priority);
|
|
|
|
|
if (setmacrocontext)
|
|
|
|
|
strcpy(chan->macrocontext, "");
|
|
|
|
|
|
|
|
|
|
if (!strcasecmp(chan->context, fullmacro)) {
|
|
|
|
|
/* If we're leaving the macro normally, restore original information */
|
|
|
|
|
|