add status variable output to System() app (issue #5121)
authorKevin P. Fleming <kpfleming@digium.com>
Wed, 7 Sep 2005 18:52:54 +0000 (18:52 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Wed, 7 Sep 2005 18:52:54 +0000 (18:52 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6529 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_system.c

index d1ec120..03e31b4 100755 (executable)
@@ -28,6 +28,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
 #include "asterisk/app.h"
 #include "asterisk/pbx.h"
 #include "asterisk/module.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 =
 "  System(command): Executes a command  by  using  system(). Returns -1 on\n"
 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"
 
 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";
 "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");
        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);
                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);
        /* 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);
                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 {
                res = failmode;
        } 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)) 
-                       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;
                res = 0;
-       }
+       } 
+
        LOCAL_USER_REMOVE(u);
        return res;
 }
        LOCAL_USER_REMOVE(u);
        return res;
 }