diff --git a/apps/app_disa.c b/apps/app_disa.c index cceb5541dd..44cccc7a6a 100644 --- a/apps/app_disa.c +++ b/apps/app_disa.c @@ -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); diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h index d531b440dc..95332eab17 100644 --- a/include/asterisk/pbx.h +++ b/include/asterisk/pbx.h @@ -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 * diff --git a/main/bridge_channel.c b/main/bridge_channel.c index 1b0f1dddae..a0334b808f 100644 --- a/main/bridge_channel.c +++ b/main/bridge_channel.c @@ -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; } diff --git a/main/dial.c b/main/dial.c index c40b7fbb6d..944207c074 100644 --- a/main/dial.c +++ b/main/dial.c @@ -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); diff --git a/main/features.c b/main/features.c index b67bf387c0..db584b590d 100644 --- a/main/features.c +++ b/main/features.c @@ -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); } } diff --git a/main/pbx_app.c b/main/pbx_app.c index 0cbb04a8b8..5879d73078 100644 --- a/main/pbx_app.c +++ b/main/pbx_app.c @@ -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"), diff --git a/main/pbx_builtins.c b/main/pbx_builtins.c index 078a307238..7ef4d031a9 100644 --- a/main/pbx_builtins.c +++ b/main/pbx_builtins.c @@ -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