diff --git a/res/res_agi.c b/res/res_agi.c index 623aedba6..914eb8c95 100755 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -967,7 +967,8 @@ static int handle_setvariable(struct ast_channel *chan, AGI *agi, int argc, char static int handle_getvariable(struct ast_channel *chan, AGI *agi, int argc, char **argv) { char *tempstr; - + if (argc != 3) + return RESULT_SHOWUSAGE; if ((tempstr = pbx_builtin_getvar_helper(chan, argv[2]))) fdprintf(agi->fd, "200 result=1 (%s)\n", tempstr); else @@ -976,6 +977,33 @@ static int handle_getvariable(struct ast_channel *chan, AGI *agi, int argc, char return RESULT_SUCCESS; } +static int handle_getvariablefull(struct ast_channel *chan, AGI *agi, int argc, char **argv) +{ + char tmp[4096]; + struct ast_channel *chan2=NULL; + if ((argc != 4) && (argc != 5)) + return RESULT_SHOWUSAGE; + if (argc == 5) { + while((chan2 = ast_channel_walk_locked(chan2))) { + if (!strcmp(chan2->name, argv[4])) + break; + ast_mutex_unlock(&chan2->lock); + chan2 = ast_channel_walk_locked(chan2); + } + } else { + chan2 = chan; + } + if (chan) { + pbx_substitute_variables_helper(chan2, argv[3], tmp, sizeof(tmp) - 1); + fdprintf(agi->fd, "200 result=1 (%s)\n", tmp); + } else { + fdprintf(agi->fd, "200 result=0\n"); + } + if (chan2 && (chan2 != chan)) + ast_mutex_unlock(&chan2->lock); + return RESULT_SUCCESS; +} + static int handle_verbose(struct ast_channel *chan, AGI *agi, int argc, char **argv) { int level = 0; @@ -1168,6 +1196,13 @@ static char usage_getvariable[] = " is set and returns the variable in parenthesis\n" " example return code: 200 result=1 (testvariable)\n"; +static char usage_getvariablefull[] = +" Usage: GET FULL VARIABLE []\n" +" Returns 0 if is not set or channel does not exist. Returns 1\n" +"if is set and returns the variable in parenthesis. Understands\n" +"complex variable names and builtin variables, unlike GET VARIABLE.\n" +" example return code: 200 result=1 (testvariable)\n"; + static char usage_setvariable[] = " Usage: SET VARIABLE \n"; @@ -1347,6 +1382,7 @@ static agi_command commands[MAX_COMMANDS] = { { { "channel", "status", NULL }, handle_channelstatus, "Returns status of the connected channel", usage_channelstatus }, { { "set", "variable", NULL }, handle_setvariable, "Sets a channel variable", usage_setvariable }, { { "get", "variable", NULL }, handle_getvariable, "Gets a channel variable", usage_getvariable }, + { { "get", "full", "variable", NULL }, handle_getvariablefull, "Evaluates a channel expression", usage_getvariablefull }, { { "verbose", NULL }, handle_verbose, "Logs a message to the asterisk verbose log", usage_verbose }, { { "database", "get", NULL }, handle_dbget, "Gets database value", usage_dbget }, { { "database", "put", NULL }, handle_dbput, "Adds/updates database value", usage_dbput },