aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-09-18 14:14:15 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-09-18 14:14:15 +0000
commitf9060dedd7433f672fd10398dc325c2be151f8fc (patch)
tree1d22ef10ac238bad24b6495261536fcffe6f58b5 /apps
parent4001f3d4198cde7f8a87f8de3089c835b3754a0f (diff)
Add "TrySystem" variation to System (bug #768)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3806 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rwxr-xr-xapps/app_system.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/apps/app_system.c b/apps/app_system.c
index 4dfed7350..89bddc3e3 100755
--- a/apps/app_system.c
+++ b/apps/app_system.c
@@ -3,9 +3,9 @@
*
* Execute arbitrary system commands
*
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999-2004, Digium, Inc.
*
- * Mark Spencer <markster@linux-support.net>
+ * Mark Spencer <markster@digium.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
@@ -28,8 +28,12 @@ static char *tdesc = "Generic System() application";
static char *app = "System";
+static char *app2 = "TrySystem";
+
static char *synopsis = "Execute a system command";
+static char *synopsis2 = "Try executing a system command";
+
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"
@@ -37,27 +41,34 @@ static char *descrip =
"priority of the current instance, then the channel will be setup to\n"
"continue at that priority level. 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"
+"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";
+
STANDARD_LOCAL_USER;
LOCAL_USER_DECL;
-static int system_exec(struct ast_channel *chan, void *data)
+static int system_exec_helper(struct ast_channel *chan, void *data, int failmode)
{
int res=0;
struct localuser *u;
if (!data) {
ast_log(LOG_WARNING, "System requires an argument(command)\n");
- return -1;
+ 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);
- res = -1;
+ res = failmode;
} else if (res == 127) {
ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data);
- res = -1;
+ res = failmode;
} else {
if (res < 0)
res = 0;
@@ -69,14 +80,26 @@ static int system_exec(struct ast_channel *chan, void *data)
return res;
}
+static int system_exec(struct ast_channel *chan, void *data)
+{
+ return system_exec_helper(chan, data, -1);
+}
+
+static int trysystem_exec(struct ast_channel *chan, void *data)
+{
+ return system_exec_helper(chan, data, 0);
+}
+
int unload_module(void)
{
STANDARD_HANGUP_LOCALUSERS;
+ ast_unregister_application(app2);
return ast_unregister_application(app);
}
int load_module(void)
{
+ ast_register_application(app2, trysystem_exec, synopsis2, descrip2);
return ast_register_application(app, system_exec, synopsis, descrip);
}