aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_exec.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-05 20:43:16 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-05 20:43:16 +0000
commitfee1fbb9f2d4680d2e033199677eac528420e9d0 (patch)
treebe8a0516fa1af32c8b67f3f38bc60059c786f955 /apps/app_exec.c
parent811ed760ef2d5ebfad3df8f6adbd60aeb1ef5a3b (diff)
move ExecIf from app_while.c to app_exec.c (issue #7094, north)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@25013 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_exec.c')
-rw-r--r--apps/app_exec.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/apps/app_exec.c b/apps/app_exec.c
index 33775ea72..d41bf27b3 100644
--- a/apps/app_exec.c
+++ b/apps/app_exec.c
@@ -83,6 +83,14 @@ static char *tryexec_descrip =
" NOAPP if the application was not found or was not specified\n"
" NOMEMORY if there was not enough memory to execute.\n";
+static char *app_execif = "ExecIf";
+static char *execif_synopsis = "Executes dialplan application, conditionally";
+static char *execif_descrip =
+"Usage: ExecIF (<expr>|<app>|<data>)\n"
+"If <expr> is true, execute and return the result of <app>(<data>).\n"
+"If <expr> is true, but <app> is not found, then the application\n"
+"will return a non-zero value.\n";
+
LOCAL_USER_DECL;
static int exec_exec(struct ast_channel *chan, void *data)
@@ -160,12 +168,54 @@ static int tryexec_exec(struct ast_channel *chan, void *data)
return 0;
}
+static int execif_exec(struct ast_channel *chan, void *data) {
+ int res=0;
+ struct localuser *u;
+ char *myapp = NULL;
+ char *mydata = NULL;
+ char *expr = NULL;
+ struct ast_app *app = NULL;
+
+ LOCAL_USER_ADD(u);
+
+ if (!(expr = ast_strdupa(data))) {
+ LOCAL_USER_REMOVE(u);
+ return -1;
+ }
+
+ if ((myapp = strchr(expr,'|'))) {
+ *myapp = '\0';
+ myapp++;
+ if ((mydata = strchr(myapp,'|'))) {
+ *mydata = '\0';
+ mydata++;
+ } else
+ mydata = "";
+
+ if (pbx_checkcondition(expr)) {
+ if ((app = pbx_findapp(myapp))) {
+ res = pbx_exec(chan, app, mydata);
+ } else {
+ ast_log(LOG_WARNING, "Count not find application! (%s)\n", myapp);
+ res = -1;
+ }
+ }
+ } else {
+ ast_log(LOG_ERROR,"Invalid Syntax.\n");
+ res = -1;
+ }
+
+ LOCAL_USER_REMOVE(u);
+ return res;
+}
+
static int unload_module(void *mod)
{
int res;
res = ast_unregister_application(app_exec);
res |= ast_unregister_application(app_tryexec);
+ res |= ast_unregister_application(app_execif);
STANDARD_HANGUP_LOCALUSERS;
@@ -176,6 +226,7 @@ static int load_module(void *mod)
{
int res = ast_register_application(app_exec, exec_exec, exec_synopsis, exec_descrip);
res |= ast_register_application(app_tryexec, tryexec_exec, tryexec_synopsis, tryexec_descrip);
+ res |= ast_register_application(app_execif, execif_exec, execif_synopsis, execif_descrip);
return res;
}