[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