res_agi: Evaluate dialplan functions and variables in agi exec if enabled

Agi commnad exec can now evaluate dialplan functions and
variables if variable AGIEXECFULL is set to yes. this can
be useful when executing Playback or Read from agi.

ASTERISK-30058 #close

Change-Id: I669991f540496e7bddd096fec82b52c083036832
16.27
Shloime Rosenblum 3 years ago committed by Kevin Harwell
parent 4f2bd069a4
commit e8616a2701

@ -0,0 +1,5 @@
Subject: res_agi
Agi command 'exec' can now be enabled
to evaluate dialplan functions and variables
by setting the variable AGIEXECFULL to yes.

@ -296,6 +296,9 @@
<replaceable>options</replaceable>.</para>
<para>Returns whatever the <replaceable>application</replaceable> returns, or
<literal>-2</literal> on failure to find <replaceable>application</replaceable>.</para>
<note>
<para>exec does not evaluate dialplan functions and variables unless it is explicitly enabled by setting the <variable>AGIEXECFULL</variable> variable to <literal>yes</literal>.</para>
</note>
</description>
<see-also>
<ref type="application">AGI</ref>
@ -3121,6 +3124,9 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, const char
{
int res, workaround;
struct ast_app *app_to_exec;
const char *agi_exec_full_str;
int agi_exec_full;
struct ast_str *data_with_var = NULL;
if (argc < 2)
return RESULT_SHOWUSAGE;
@ -3132,8 +3138,21 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, const char
if (!(workaround = ast_test_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS))) {
ast_set_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS);
}
agi_exec_full_str = pbx_builtin_getvar_helper(chan, "AGIEXECFULL");
agi_exec_full = ast_true(agi_exec_full_str);
ast_channel_unlock(chan);
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
if (agi_exec_full) {
if ((data_with_var = ast_str_create(16))) {
ast_str_substitute_variables(&data_with_var, 0, chan, argv[2]);
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : ast_str_buffer(data_with_var));
ast_free(data_with_var);
} else {
res = -2;
}
} else {
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
}
if (!workaround) {
ast_channel_clear_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS);
}

Loading…
Cancel
Save