add status variable output to System() app (issue #5121)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6529 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Kevin P. Fleming 20 years ago
parent 7d37750831
commit a833f4699a

@ -28,6 +28,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/pbx.h" #include "asterisk/pbx.h"
#include "asterisk/module.h" #include "asterisk/module.h"
#include "asterisk/app.h" #include "asterisk/app.h"
#include "asterisk/options.h"
static char *tdesc = "Generic System() application"; static char *tdesc = "Generic System() application";
@ -39,16 +40,30 @@ static char *synopsis = "Execute a system command";
static char *synopsis2 = "Try executing a system command"; static char *synopsis2 = "Try executing a system command";
static char *chanvar = "SYSTEMSTATUS";
static char *descrip = static char *descrip =
" System(command): Executes a command by using system(). Returns -1 on\n" " System(command): Executes a command by using system(). Returns -1 on\n"
"failure to execute the specified command. If the command itself executes\n" "failure to execute the specified command. \n"
"but is in error, and if there exists a priority n + 101, where 'n' is the\n" "Result of execution is returned in the SYSTEMSTATUS channel variable:\n"
"priority of the current instance, then the channel will be setup to\n" " FAILURE Could not execute the specified command\n"
"continue at that priority level. Otherwise, System returns 0.\n"; " SUCCESS Specified command successfully executed\n"
"\n"
"Old behaviour:\n"
"If the command itself executes but is in error, and if there exists\n"
"a priority n + 101, where 'n' is the priority of the current instance,\n"
"then the channel will be setup to continue at that priority level.\n"
" Otherwise, System returns 0.\n";
static char *descrip2 = static char *descrip2 =
" TrySystem(command): Executes a command by using system(). Returns 0\n" " TrySystem(command): Executes a command by using system(). Returns 0\n"
"on any situation. If the command itself executes but is in error, and if\n" "on any situation.\n"
"Result of execution is returned in the SYSTEMSTATUS channel variable:\n"
" FAILURE Could not execute the specified command\n"
" SUCCESS Specified command successfully executed\n"
" APPERROR Specified command successfully executed, but returned error code\n"
"\n"
"Old behaviour:\nIf the command itself executes but is in error, and if\n"
"there exists a priority n + 101, where 'n' is the priority of the current\n" "there exists a priority n + 101, where 'n' is the priority of the current\n"
"instance, then the channel will be setup to continue at that\n" "instance, then the channel will be setup to continue at that\n"
"priority level. Otherwise, System returns 0.\n"; "priority level. Otherwise, System returns 0.\n";
@ -63,24 +78,34 @@ static int system_exec_helper(struct ast_channel *chan, void *data, int failmode
struct localuser *u; struct localuser *u;
if (!data) { if (!data) {
ast_log(LOG_WARNING, "System requires an argument(command)\n"); ast_log(LOG_WARNING, "System requires an argument(command)\n");
pbx_builtin_setvar_helper(chan, chanvar, "FAILURE");
return failmode; return failmode;
} }
LOCAL_USER_ADD(u); LOCAL_USER_ADD(u);
/* Do our thing here */ /* Do our thing here */
res = ast_safe_system((char *)data); res = ast_safe_system((char *)data);
if ((res < 0) && (errno != ECHILD)) { if ((res < 0) && (errno != ECHILD)) {
ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data); ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data);
pbx_builtin_setvar_helper(chan, chanvar, "FAILURE");
res = failmode; res = failmode;
} else if (res == 127) { } else if (res == 127) {
ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data); ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data);
pbx_builtin_setvar_helper(chan, chanvar, "FAILURE");
res = failmode; res = failmode;
} else { } else {
if (res < 0) if (res < 0)
res = 0; res = 0;
if (res && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) if (option_priority_jumping && res)
chan->priority+=100; ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
if (res != 0)
pbx_builtin_setvar_helper(chan, chanvar, "APPERROR");
else
pbx_builtin_setvar_helper(chan, chanvar, "SUCCESS");
res = 0; res = 0;
} }
LOCAL_USER_REMOVE(u); LOCAL_USER_REMOVE(u);
return res; return res;
} }

Loading…
Cancel
Save