Index: apps/app_system.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_system.c,v retrieving revision 1.15 diff -u -r1.15 app_system.c --- apps/app_system.c 6 Jun 2005 22:39:32 -0000 1.15 +++ apps/app_system.c 5 Sep 2005 12:39:01 -0000 @@ -28,6 +28,7 @@ #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 *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 @@ 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)) + if (option_priority_jumping && res && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) { chan->priority+=100; + } + 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; }