help text cleanups (bug #4072, with mods)
[asterisk/asterisk.git] / apps / app_exec.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Exec application
5  *
6  * Copyright (c) 2004 - 2005, Tilghman Lesher.  All rights reserved.
7  *
8  * Tilghman Lesher <app_exec__v001@the-tilghman.com>
9  *
10  * $Id$
11  *
12  * This code is released by the author with no restrictions on usage.
13  *
14  */
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <unistd.h>
19 #include <string.h>
20 #include "asterisk/file.h"
21 #include "asterisk/logger.h"
22 #include "asterisk/options.h"
23 #include "asterisk/channel.h"
24 #include "asterisk/pbx.h"
25 #include "asterisk/module.h"
26
27 /* Maximum length of any variable */
28 #define MAXRESULT       1024
29
30 static char *tdesc = "Executes applications";
31
32 static char *app_exec = "Exec";
33
34 static char *exec_synopsis = "Executes internal application";
35
36 static char *exec_descrip =
37 "Usage: Exec(appname(arguments))\n"
38 "  Allows an arbitrary application to be invoked even when not\n"
39 "hardcoded into the dialplan. To invoke external applications\n"
40 "see the application System. Returns whatever value the\n"
41 "app returns or a non-zero value if the app cannot be found.\n";
42
43 STANDARD_LOCAL_USER;
44
45 LOCAL_USER_DECL;
46
47 static int exec_exec(struct ast_channel *chan, void *data)
48 {
49         int res=0;
50         struct localuser *u;
51         char *s, *appname, *endargs, args[MAXRESULT];
52         struct ast_app *app;
53
54         LOCAL_USER_ADD(u);
55
56         memset(args, 0, MAXRESULT);
57
58         /* Check and parse arguments */
59         if (data) {
60                 s = ast_strdupa((char *)data);
61                 if (s) {
62                         appname = strsep(&s, "(");
63                         if (s) {
64                                 endargs = strrchr(s, ')');
65                                 if (endargs)
66                                         *endargs = '\0';
67                                 pbx_substitute_variables_helper(chan, s, args, MAXRESULT - 1);
68                         }
69                         if (appname) {
70                                 app = pbx_findapp(appname);
71                                 if (app) {
72                                         res = pbx_exec(chan, app, args, 1);
73                                 } else {
74                                         ast_log(LOG_WARNING, "Could not find application (%s)\n", appname);
75                                         res = -1;
76                                 }
77                         }
78                 } else {
79                         ast_log(LOG_ERROR, "Out of memory\n");
80                         res = -1;
81                 }
82         }
83
84         LOCAL_USER_REMOVE(u);
85         return res;
86 }
87
88 int unload_module(void)
89 {
90         STANDARD_HANGUP_LOCALUSERS;
91         return ast_unregister_application(app_exec);
92 }
93
94 int load_module(void)
95 {
96         return ast_register_application(app_exec, exec_exec, exec_synopsis, exec_descrip);
97 }
98
99 char *description(void)
100 {
101         return tdesc;
102 }
103
104 int usecount(void)
105 {
106         int res;
107         STANDARD_USECOUNT(res);
108         return res;
109 }
110
111 char *key()
112 {
113         return ASTERISK_GPL_KEY;
114 }