aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_system.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-09-07 18:52:54 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-09-07 18:52:54 +0000
commit44d51a1455391a0f937e55078edf1953566b671a (patch)
tree37aef607dbcafa0f1df38631b8ca53b6e33023b3 /apps/app_system.c
parent45871165fb444422887d08f8ee314cdea27e8c24 (diff)
add status variable output to System() app (issue #5121)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6529 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_system.c')
-rwxr-xr-xapps/app_system.c43
1 files changed, 34 insertions, 9 deletions
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;
}