aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_stack.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-20 13:00:45 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-20 13:00:45 +0000
commit2ba8d2aa3b24cba89982048f69c6fead1a0f6c1a (patch)
treed6ab4197dd563f24afaee8d6e4e51f0bf9449fe3 /apps/app_stack.c
parent202f059c3ced4a339c1251e03d877935814472fd (diff)
Oops, shouldn't have taken that last shortcut (also add some checks)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@70291 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_stack.c')
-rw-r--r--apps/app_stack.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/apps/app_stack.c b/apps/app_stack.c
index 9dc30a64c..d54dd2a59 100644
--- a/apps/app_stack.c
+++ b/apps/app_stack.c
@@ -72,7 +72,6 @@ static const char *pop_descrip =
static void gosub_free(void *data);
-static int local_write(struct ast_channel *chan, const char *cmd, char *var, const char *value);
static struct ast_datastore_info stack_info = {
.type = "GOSUB",
@@ -89,6 +88,37 @@ struct gosub_stack_frame {
char extension[0];
};
+static int frame_set_var(struct ast_channel *chan, struct gosub_stack_frame *frame, const char *var, const char *value)
+{
+ struct ast_var_t *variables;
+ int found = 0;
+
+ /* Does this variable already exist? */
+ AST_LIST_TRAVERSE(&frame->varshead, variables, entries) {
+ if (!strcmp(var, ast_var_name(variables))) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (!ast_strlen_zero(value)) {
+ if (!found) {
+ variables = ast_var_assign(var, "");
+ AST_LIST_INSERT_HEAD(&frame->varshead, variables, entries);
+ pbx_builtin_pushvar_helper(chan, var, value);
+ } else
+ pbx_builtin_setvar_helper(chan, var, value);
+
+ manager_event(EVENT_FLAG_CALL, "VarSet",
+ "Channel: %s\r\n"
+ "Variable: LOCAL(%s)\r\n"
+ "Value: %s\r\n"
+ "Uniqueid: %s\r\n",
+ chan->name, var, value, chan->uniqueid);
+ }
+ return 0;
+}
+
static void gosub_release_frame(struct ast_channel *chan, struct gosub_stack_frame *frame)
{
unsigned char i;
@@ -258,6 +288,9 @@ static int gosub_exec(struct ast_channel *chan, void *data)
/* 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);
+ if (!newframe)
+ return -1;
+
if (ast_parseable_goto(chan, label)) {
ast_log(LOG_ERROR, "Gosub address is invalid: '%s'\n", (char *)data);
ast_free(newframe);
@@ -268,7 +301,7 @@ 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++) {
snprintf(argname, sizeof(argname), "ARG%d", i + 1);
- local_write(chan, "LOCAL", argname, args2.argval[i]);
+ frame_set_var(chan, newframe, argname, args2.argval[i]);
ast_debug(1, "Setting '%s' to '%s'\n", argname, args2.argval[i]);
}
@@ -354,8 +387,6 @@ static int local_write(struct ast_channel *chan, const char *cmd, char *var, con
struct ast_datastore *stack_store = ast_channel_datastore_find(chan, &stack_info, NULL);
AST_LIST_HEAD(, gosub_stack_frame) *oldlist;
struct gosub_stack_frame *frame;
- struct ast_var_t *variables;
- int found = 0;
if (!stack_store) {
ast_log(LOG_ERROR, "Tried to set LOCAL(%s), but we aren't within a Gosub routine\n", var);
@@ -366,29 +397,8 @@ static int local_write(struct ast_channel *chan, const char *cmd, char *var, con
AST_LIST_LOCK(oldlist);
frame = AST_LIST_FIRST(oldlist);
- /* Does this variable already exist? */
- AST_LIST_TRAVERSE(&frame->varshead, variables, entries) {
- if (!strcmp(var, ast_var_name(variables))) {
- found = 1;
- break;
- }
- }
-
- if (!ast_strlen_zero(value)) {
- if (!found) {
- variables = ast_var_assign(var, "");
- AST_LIST_INSERT_HEAD(&frame->varshead, variables, entries);
- pbx_builtin_pushvar_helper(chan, var, value);
- } else
- pbx_builtin_setvar_helper(chan, var, value);
-
- manager_event(EVENT_FLAG_CALL, "VarSet",
- "Channel: %s\r\n"
- "Variable: LOCAL(%s)\r\n"
- "Value: %s\r\n"
- "Uniqueid: %s\r\n",
- chan->name, var, value, chan->uniqueid);
- }
+ if (frame)
+ frame_set_var(chan, frame, var, value);
AST_LIST_UNLOCK(oldlist);