diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-09-18 14:14:15 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-09-18 14:14:15 +0000 |
commit | f9060dedd7433f672fd10398dc325c2be151f8fc (patch) | |
tree | 1d22ef10ac238bad24b6495261536fcffe6f58b5 /apps/app_system.c | |
parent | 4001f3d4198cde7f8a87f8de3089c835b3754a0f (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/app_system.c')
-rwxr-xr-x | apps/app_system.c | 35 |
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); } |