[Asterisk-cvs] asterisk/apps app_system.c,1.10,1.11
markster at lists.digium.com
markster at lists.digium.com
Sat Sep 18 10:10:16 CDT 2004
Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv13227/apps
Modified Files:
app_system.c
Log Message:
Add "TrySystem" variation to System (bug #768)
Index: app_system.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_system.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- app_system.c 22 Jun 2004 19:32:52 -0000 1.10
+++ app_system.c 18 Sep 2004 14:14:15 -0000 1.11
@@ -3,9 +3,9 @@
*
* Execute arbitrary system commands
*
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999-2004, Digium, Inc.
*
- * Mark Spencer <markster at linux-support.net>
+ * Mark Spencer <markster at digium.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
@@ -28,8 +28,12 @@
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 @@
"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 @@
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);
}
More information about the svn-commits
mailing list