From a833f4699ae2ff4c4fc44be93a846764907f6d3a Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Wed, 7 Sep 2005 18:52:54 +0000 Subject: 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 --- apps/app_system.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'apps/app_system.c') diff --git a/apps/app_system.c b/apps/app_system.c index d1ec12082..03e31b4a0 100755 --- a/apps/app_system.c +++ b/apps/app_system.c @@ -28,6 +28,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/pbx.h" #include "asterisk/module.h" #include "asterisk/app.h" +#include "asterisk/options.h" 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 *chanvar = "SYSTEMSTATUS"; + static char *descrip = " System(command): Executes a command by using system(). Returns -1 on\n" -"failure to execute the specified command. If the command itself executes\n" -"but is in error, and if there exists a priority n + 101, where 'n' is the\n" -"priority of the current instance, then the channel will be setup to\n" -"continue at that priority level. Otherwise, System returns 0.\n"; +"failure to execute the specified command. \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" +"\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 = " 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" "instance, then the channel will be setup to continue at that\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; if (!data) { ast_log(LOG_WARNING, "System requires an argument(command)\n"); + pbx_builtin_setvar_helper(chan, chanvar, "FAILURE"); return failmode; } LOCAL_USER_ADD(u); + /* Do our thing here */ res = ast_safe_system((char *)data); if ((res < 0) && (errno != ECHILD)) { ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data); + pbx_builtin_setvar_helper(chan, chanvar, "FAILURE"); res = failmode; } else if (res == 127) { ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data); + pbx_builtin_setvar_helper(chan, chanvar, "FAILURE"); res = failmode; } else { - if (res < 0) + if (res < 0) res = 0; - if (res && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) - chan->priority+=100; + if (option_priority_jumping && res) + 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; - } + } + LOCAL_USER_REMOVE(u); return res; } -- cgit v1.2.3