|
|
|
|
@ -228,9 +228,9 @@ static int gosub_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
{
|
|
|
|
|
struct ast_datastore *stack_store = ast_channel_datastore_find(chan, &stack_info, NULL);
|
|
|
|
|
AST_LIST_HEAD(, gosub_stack_frame) *oldlist;
|
|
|
|
|
struct gosub_stack_frame *newframe;
|
|
|
|
|
struct gosub_stack_frame *newframe, *lastframe;
|
|
|
|
|
char argname[15], *tmp = ast_strdupa(data), *label, *endparen;
|
|
|
|
|
int i;
|
|
|
|
|
int i, max_argc = 0;
|
|
|
|
|
AST_DECLARE_APP_ARGS(args2,
|
|
|
|
|
AST_APP_ARG(argval)[100];
|
|
|
|
|
);
|
|
|
|
|
@ -258,6 +258,12 @@ static int gosub_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
stack_store->data = oldlist;
|
|
|
|
|
AST_LIST_HEAD_INIT(oldlist);
|
|
|
|
|
ast_channel_datastore_add(chan, stack_store);
|
|
|
|
|
} else {
|
|
|
|
|
oldlist = stack_store->data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((lastframe = AST_LIST_FIRST(oldlist))) {
|
|
|
|
|
max_argc = lastframe->arguments;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Separate the arguments from the label */
|
|
|
|
|
@ -273,8 +279,13 @@ static int gosub_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
} else
|
|
|
|
|
args2.argc = 0;
|
|
|
|
|
|
|
|
|
|
/* Mask out previous arguments in this invocation */
|
|
|
|
|
if (args2.argc > max_argc) {
|
|
|
|
|
max_argc = args2.argc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Create the return address, but don't save it until we know that the Gosub destination exists */
|
|
|
|
|
newframe = gosub_allocate_frame(chan->context, chan->exten, chan->priority + 1, args2.argc);
|
|
|
|
|
newframe = gosub_allocate_frame(chan->context, chan->exten, chan->priority + 1, max_argc);
|
|
|
|
|
|
|
|
|
|
if (!newframe) {
|
|
|
|
|
return -1;
|
|
|
|
|
@ -297,10 +308,10 @@ static int gosub_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Now that we know for certain that we're going to a new location, set our arguments */
|
|
|
|
|
for (i = 0; i < args2.argc; i++) {
|
|
|
|
|
for (i = 0; i < max_argc; i++) {
|
|
|
|
|
snprintf(argname, sizeof(argname), "ARG%d", i + 1);
|
|
|
|
|
frame_set_var(chan, newframe, argname, args2.argval[i]);
|
|
|
|
|
ast_debug(1, "Setting '%s' to '%s'\n", argname, args2.argval[i]);
|
|
|
|
|
frame_set_var(chan, newframe, argname, i < args2.argc ? args2.argval[i] : "");
|
|
|
|
|
ast_debug(1, "Setting '%s' to '%s'\n", argname, i < args2.argc ? args2.argval[i] : "");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* And finally, save our return address */
|
|
|
|
|
|