Merge "astobj2: Create function to copy weak proxied objects from container."
[asterisk/asterisk.git] / apps / app_exec.c
index b4a6696..79c1b75 100644 (file)
  * \ingroup applications
  */
 
+/*** MODULEINFO
+       <support_level>core</support_level>
+ ***/
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/file.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
@@ -49,7 +50,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                </syntax>
                <description>
                        <para>Allows an arbitrary application to be invoked even when not
-                       hardcoded into the dialplan.  If the underlying application
+                       hard coded into the dialplan.  If the underlying application
                        terminates the dialplan, or if the application cannot be found,
                        Exec will terminate the dialplan.</para>
                        <para>To invoke external applications, see the application System.
@@ -67,7 +68,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                </syntax>
                <description>
                        <para>Allows an arbitrary application to be invoked even when not
-                       hardcoded into the dialplan. To invoke external applications
+                       hard coded into the dialplan. To invoke external applications
                        see the application System.  Always returns to the dialplan.
                        The channel variable TRYSTATUS will be set to one of:
                        </para>
@@ -125,63 +126,68 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
  * affecting the dialplan.
  */
 
-static char *app_exec = "Exec";
-static char *app_tryexec = "TryExec";
-static char *app_execif = "ExecIf";
+static const char app_exec[] = "Exec";
+static const char app_tryexec[] = "TryExec";
+static const char app_execif[] = "ExecIf";
 
-static int exec_exec(struct ast_channel *chan, void *data)
+static int exec_exec(struct ast_channel *chan, const char *data)
 {
        int res = 0;
-       char *s, *appname, *endargs, args[MAXRESULT];
+       char *s, *appname, *endargs;
        struct ast_app *app;
+       struct ast_str *args = NULL;
 
        if (ast_strlen_zero(data))
                return 0;
 
        s = ast_strdupa(data);
-       args[0] = 0;
        appname = strsep(&s, "(");
        if (s) {
                endargs = strrchr(s, ')');
                if (endargs)
                        *endargs = '\0';
-               pbx_substitute_variables_helper(chan, s, args, MAXRESULT - 1);
+               if ((args = ast_str_create(16))) {
+                       ast_str_substitute_variables(&args, 0, chan, s);
+               }
        }
        if (appname) {
                app = pbx_findapp(appname);
                if (app) {
-                       res = pbx_exec(chan, app, args);
+                       res = pbx_exec(chan, app, args ? ast_str_buffer(args) : NULL);
                } else {
                        ast_log(LOG_WARNING, "Could not find application (%s)\n", appname);
                        res = -1;
                }
        }
 
+       ast_free(args);
        return res;
 }
 
-static int tryexec_exec(struct ast_channel *chan, void *data)
+static int tryexec_exec(struct ast_channel *chan, const char *data)
 {
        int res = 0;
-       char *s, *appname, *endargs, args[MAXRESULT];
+       char *s, *appname, *endargs;
        struct ast_app *app;
+       struct ast_str *args = NULL;
 
        if (ast_strlen_zero(data))
                return 0;
 
        s = ast_strdupa(data);
-       args[0] = 0;
        appname = strsep(&s, "(");
        if (s) {
                endargs = strrchr(s, ')');
                if (endargs)
                        *endargs = '\0';
-               pbx_substitute_variables_helper(chan, s, args, MAXRESULT - 1);
+               if ((args = ast_str_create(16))) {
+                       ast_str_substitute_variables(&args, 0, chan, s);
+               }
        }
        if (appname) {
                app = pbx_findapp(appname);
                if (app) {
-                       res = pbx_exec(chan, app, args);
+                       res = pbx_exec(chan, app, args ? ast_str_buffer(args) : NULL);
                        pbx_builtin_setvar_helper(chan, "TRYSTATUS", res ? "FAILED" : "SUCCESS");
                } else {
                        ast_log(LOG_WARNING, "Could not find application (%s)\n", appname);
@@ -189,10 +195,11 @@ static int tryexec_exec(struct ast_channel *chan, void *data)
                }
        }
 
+       ast_free(args);
        return 0;
 }
 
-static int execif_exec(struct ast_channel *chan, void *data)
+static int execif_exec(struct ast_channel *chan, const char *data)
 {
        int res = 0;
        char *truedata = NULL, *falsedata = NULL, *end, *firstcomma, *firstquestion;
@@ -229,13 +236,13 @@ static int execif_exec(struct ast_channel *chan, void *data)
        } else {
                /* Preferred syntax */
 
-               AST_NONSTANDARD_APP_ARGS(expr, parse, '?');
+               AST_NONSTANDARD_RAW_ARGS(expr, parse, '?');
                if (ast_strlen_zero(expr.remainder)) {
                        ast_log(LOG_ERROR, "Usage: ExecIf(<expr>?<appiftrue>(<args>)[:<appiffalse>(<args)])\n");
                        return -1;
                }
 
-               AST_NONSTANDARD_APP_ARGS(apps, expr.remainder, ':');
+               AST_NONSTANDARD_RAW_ARGS(apps, expr.remainder, ':');
 
                if (apps.t && (truedata = strchr(apps.t, '('))) {
                        *truedata++ = '\0';