]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pbx: Add helper function to execute applications.
authorNaveen Albert <asterisk@phreaknet.org>
Sun, 15 May 2022 12:41:06 +0000 (12:41 +0000)
committerKevin Harwell <kharwell@digium.com>
Thu, 30 Jun 2022 20:20:34 +0000 (15:20 -0500)
Finding an application and executing it if found is
a common task throughout Asterisk. This adds a helper
function around pbx_exec to do this, to eliminate
redundant code and make it easier for modules to
substitute variables and execute applications by name.

ASTERISK-30061 #close

Change-Id: Ifee4d2825df7545fb515d763d393065675140c84

apps/app_disa.c
include/asterisk/pbx.h
main/bridge_channel.c
main/dial.c
main/features.c
main/pbx_app.c
main/pbx_builtins.c
res/res_stasis_snoop.c

index cceb5541dda83356f366c1e3141844e3d54c8481..44cccc7a6aa2682bc702f8558a87db71558698c5 100644 (file)
@@ -361,7 +361,6 @@ static int disa_exec(struct ast_channel *chan, const char *data)
 
        if (k == 3) {
                int recheck = 0;
-               struct ast_app *app_reset_cdr;
 
                if (!ast_exists_extension(chan, args.context, exten, 1,
                        S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL))) {
@@ -386,10 +385,7 @@ static int disa_exec(struct ast_channel *chan, const char *data)
                                ast_channel_unlock(chan);
                        }
 
-                       app_reset_cdr = pbx_findapp("ResetCDR");
-                       if (app_reset_cdr) {
-                               pbx_exec(chan, app_reset_cdr, special_noanswer ? "" : "e");
-                       } else {
+                       if (ast_pbx_exec_application(chan, "ResetCDR", special_noanswer ? "" : "e")) {
                                ast_log(AST_LOG_NOTICE, "ResetCDR application not found; CDR will not be reset\n");
                        }
                        ast_explicit_goto(chan, args.context, exten, 1);
index d531b440dceaeb20fa5d67dcc39edfd93094b686..95332eab172fcae2d9053ffcc7f02308afe5e358 100644 (file)
@@ -268,6 +268,23 @@ struct ast_app *pbx_findapp(const char *app);
  */
 int pbx_exec(struct ast_channel *c, struct ast_app *app, const char *data);
 
+/*!
+ * \brief Execute an application
+ *
+ * \param c channel to execute on
+ * \param app name of app to execute
+ * \param data the data passed into the app
+ *
+ * This application executes an application by name on a given channel.
+ * It is a wrapper around pbx_exec that will perform variable substitution
+ * and then execute the application if it exists.
+ * If the application is not found, a warning is logged.
+ *
+ * \retval 0 success
+ * \retval -1 failure (including application not found)
+ */
+int ast_pbx_exec_application(struct ast_channel *chan, const char *app_name, const char *app_args);
+
 /*!
  * \brief Register a new context or find an existing one
  *
index 1b0f1dddae30a91eb151b904f1277615f16ebf8b..a0334b808fa3552f0f9a6bf3ca0f5611b79e4b16 100644 (file)
@@ -1178,23 +1178,7 @@ static int run_app_helper(struct ast_channel *chan, const char *app_name, const
        } else if (!strcasecmp("Macro", app_name)) {
                ast_app_exec_macro(NULL, chan, app_args);
        } else {
-               struct ast_app *app;
-
-               app = pbx_findapp(app_name);
-               if (!app) {
-                       ast_log(LOG_WARNING, "Could not find application (%s)\n", app_name);
-               } else {
-                       struct ast_str *substituted_args = ast_str_create(16);
-
-                       if (substituted_args) {
-                               ast_str_substitute_variables(&substituted_args, 0, chan, app_args);
-                               res = pbx_exec(chan, app, ast_str_buffer(substituted_args));
-                               ast_free(substituted_args);
-                       } else {
-                               ast_log(LOG_WARNING, "Could not substitute application argument variables for %s\n", app_name);
-                               res = pbx_exec(chan, app, app_args);
-                       }
-               }
+               res = ast_pbx_exec_application(chan, app_name, app_args);
        }
        return res;
 }
index c40b7fbb6d37883f19e3d5420c166d9ecf147cd7..944207c07475ad359fa5d22772cade32fbb937b9 100644 (file)
@@ -166,14 +166,12 @@ static int predial_disable(void *data)
 static void answer_exec_run(struct ast_dial *dial, struct ast_dial_channel *dial_channel, char *app, char *args)
 {
        struct ast_channel *chan = dial_channel->owner;
-       struct ast_app *ast_app = pbx_findapp(app);
 
-       /* If the application was not found, return immediately */
-       if (!ast_app)
+       /* Execute the application, if available */
+       if (ast_pbx_exec_application(chan, app, args)) {
+               /* If the application was not found, return immediately */
                return;
-
-       /* All is well... execute the application */
-       pbx_exec(chan, ast_app, args);
+       }
 
        /* If another thread is not taking over hang up the channel */
        ast_mutex_lock(&dial->lock);
index b67bf387c00521285ffd29ab4cd860de170f5bd7..db584b590d8d52a315b26eb2046567082f15cccf 100644 (file)
@@ -504,12 +504,7 @@ static void bridge_check_monitor(struct ast_channel *chan, struct ast_channel *p
                ast_channel_unlock(peer);
        }
        if (monitor_chan) {
-               struct ast_app *monitor_app;
-
-               monitor_app = pbx_findapp("Monitor");
-               if (monitor_app) {
-                       pbx_exec(monitor_chan, monitor_app, monitor_args);
-               }
+               ast_pbx_exec_application(monitor_chan, "Monitor", monitor_args);
        }
 }
 
index 0cbb04a8b888e69255083bcfff773c8c07bb2ae0..5879d73078e6b1e2bb612387864ad730f4ad9803 100644 (file)
@@ -498,6 +498,31 @@ int pbx_exec(struct ast_channel *c,        /*!< Channel */
        return res;
 }
 
+int ast_pbx_exec_application(struct ast_channel *chan, const char *app_name, const char *app_args)
+{
+       int res = -1;
+       struct ast_app *app;
+
+       app = pbx_findapp(app_name);
+       if (!app) {
+               ast_log(LOG_WARNING, "Could not find application (%s)\n", app_name);
+       } else {
+               struct ast_str *substituted_args = NULL;
+
+               if (!ast_strlen_zero(app_args) && (substituted_args = ast_str_create(16))) {
+                       ast_str_substitute_variables(&substituted_args, 0, chan, app_args);
+                       res = pbx_exec(chan, app, ast_str_buffer(substituted_args));
+                       ast_free(substituted_args);
+               } else {
+                       if (!ast_strlen_zero(app_args)) {
+                               ast_log(LOG_WARNING, "Could not substitute application argument variables for %s\n", app_name);
+                       }
+                       res = pbx_exec(chan, app, app_args);
+               }
+       }
+       return res;
+}
+
 static struct ast_cli_entry app_cli[] = {
        AST_CLI_DEFINE(handle_show_applications, "Shows registered dialplan applications"),
        AST_CLI_DEFINE(handle_show_application, "Describe a specific dialplan application"),
index 078a307238885ec72490891fbe82890dbe8b3a60..7ef4d031a98659f89d0988b9ee700137936abe20 100644 (file)
@@ -1000,7 +1000,6 @@ static int pbx_builtin_execiftime(struct ast_channel *chan, const char *data)
 {
        char *s, *appname;
        struct ast_timing timing;
-       struct ast_app *app;
        static const char * const usage = "ExecIfTime requires an argument:\n  <time range>,<days of week>,<days of month>,<months>[,<timezone>]?<appname>[(<appargs>)]";
 
        if (ast_strlen_zero(data)) {
@@ -1038,13 +1037,7 @@ static int pbx_builtin_execiftime(struct ast_channel *chan, const char *data)
                        ast_log(LOG_WARNING, "Failed to find closing parenthesis\n");
        }
 
-
-       if ((app = pbx_findapp(appname))) {
-               return pbx_exec(chan, app, S_OR(s, ""));
-       } else {
-               ast_log(LOG_WARNING, "Cannot locate application %s\n", appname);
-               return -1;
-       }
+       return ast_pbx_exec_application(chan, appname, S_OR(s, ""));
 }
 
 /*!
index 190ee06023030b1fe6d6a3626075301673d69923..8d0c6ebc36ad3e93fe05e97b7127d8b08d5fa304 100644 (file)
@@ -263,14 +263,8 @@ static struct ast_channel_tech snoop_tech = {
 static void *snoop_stasis_thread(void *obj)
 {
        RAII_VAR(struct stasis_app_snoop *, snoop, obj, ao2_cleanup);
-       struct ast_app *stasis = pbx_findapp("Stasis");
 
-       if (!stasis) {
-               ast_hangup(snoop->chan);
-               return NULL;
-       }
-
-       pbx_exec(snoop->chan, stasis, ast_str_buffer(snoop->app));
+       ast_pbx_exec_application(snoop->chan, "Stasis", ast_str_buffer(snoop->app));
 
        ast_hangup(snoop->chan);