Skip to content
Snippets Groups Projects
Commit d7fb7e9e authored by Mark Spencer's avatar Mark Spencer
Browse files

Add "TrySystem" variation to System (bug #768)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3806 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 528cf897
No related branches found
No related tags found
No related merge requests found
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
* *
* Execute arbitrary system commands * 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 * This program is free software, distributed under the terms of
* the GNU General Public License * the GNU General Public License
...@@ -28,8 +28,12 @@ static char *tdesc = "Generic System() application"; ...@@ -28,8 +28,12 @@ static char *tdesc = "Generic System() application";
static char *app = "System"; static char *app = "System";
static char *app2 = "TrySystem";
static char *synopsis = "Execute a system command"; static char *synopsis = "Execute a system command";
static char *synopsis2 = "Try executing a system command";
static char *descrip = static char *descrip =
" System(command): Executes a command by using system(). Returns -1 on\n" " System(command): Executes a command by using system(). Returns -1 on\n"
"failure to execute the specified command. If the command itself executes\n" "failure to execute the specified command. If the command itself executes\n"
...@@ -37,27 +41,34 @@ static char *descrip = ...@@ -37,27 +41,34 @@ static char *descrip =
"priority of the current instance, then the channel will be setup to\n" "priority of the current instance, then the channel will be setup to\n"
"continue at that priority level. Otherwise, System returns 0.\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; STANDARD_LOCAL_USER;
LOCAL_USER_DECL; 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; int res=0;
struct localuser *u; struct localuser *u;
if (!data) { if (!data) {
ast_log(LOG_WARNING, "System requires an argument(command)\n"); ast_log(LOG_WARNING, "System requires an argument(command)\n");
return -1; return failmode;
} }
LOCAL_USER_ADD(u); LOCAL_USER_ADD(u);
/* Do our thing here */ /* Do our thing here */
res = ast_safe_system((char *)data); res = ast_safe_system((char *)data);
if ((res < 0) && (errno != ECHILD)) { if ((res < 0) && (errno != ECHILD)) {
ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data); ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data);
res = -1; res = failmode;
} else if (res == 127) { } else if (res == 127) {
ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data); ast_log(LOG_WARNING, "Unable to execute '%s'\n", (char *)data);
res = -1; res = failmode;
} else { } else {
if (res < 0) if (res < 0)
res = 0; res = 0;
...@@ -69,14 +80,26 @@ static int system_exec(struct ast_channel *chan, void *data) ...@@ -69,14 +80,26 @@ static int system_exec(struct ast_channel *chan, void *data)
return res; 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) int unload_module(void)
{ {
STANDARD_HANGUP_LOCALUSERS; STANDARD_HANGUP_LOCALUSERS;
ast_unregister_application(app2);
return ast_unregister_application(app); return ast_unregister_application(app);
} }
int load_module(void) int load_module(void)
{ {
ast_register_application(app2, trysystem_exec, synopsis2, descrip2);
return ast_register_application(app, system_exec, synopsis, descrip); return ast_register_application(app, system_exec, synopsis, descrip);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment