49ce3e41d47a39e902ab2fd540d23166981d78b7
[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
21 #include "asterisk.h"
22
23 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
24
25 #include "asterisk/file.h"
26 #include "asterisk/logger.h"
27 #include "asterisk/options.h"
28 #include "asterisk/channel.h"
29 #include "asterisk/pbx.h"
30 #include "asterisk/module.h"
31
32 /* Maximum length of any variable */
33 #define MAXRESULT       1024
34
35 static char *tdesc = "Executes applications";
36
37 static char *app_exec = "Exec";
38
39 static char *exec_synopsis = "Executes internal application";
40
41 static char *exec_descrip =
42 "Usage: Exec(appname(arguments))\n"
43 "  Allows an arbitrary application to be invoked even when not\n"
44 "hardcoded into the dialplan. To invoke external applications\n"
45 "see the application System. Returns whatever value the\n"
46 "app returns or a non-zero value if the app cannot be found.\n";
47
48 STANDARD_LOCAL_USER;
49
50 LOCAL_USER_DECL;
51
52 static int exec_exec(struct ast_channel *chan, void *data)
53 {
54         int res=0;
55         struct localuser *u;
56         char *s, *appname, *endargs, args[MAXRESULT];
57         struct ast_app *app;
58
59         LOCAL_USER_ADD(u);
60
61         memset(args, 0, MAXRESULT);
62
63         /* Check and parse arguments */
64         if (data) {
65                 s = ast_strdupa((char *)data);
66                 if (s) {
67                         appname = strsep(&s, "(");
68                         if (s) {
69                                 endargs = strrchr(s, ')');
70                                 if (endargs)
71                                         *endargs = '\0';
72                                 pbx_substitute_variables_helper(chan, s, args, MAXRESULT - 1);
73                         }
74                         if (appname) {
75                                 app = pbx_findapp(appname);
76                                 if (app) {
77                                         res = pbx_exec(chan, app, args, 1);
78                                 } else {
79                                         ast_log(LOG_WARNING, "Could not find application (%s)\n", appname);
80                                         res = -1;
81                                 }
82                         }
83                 } else {
84                         ast_log(LOG_ERROR, "Out of memory\n");
85                         res = -1;
86                 }
87         }
88
89         LOCAL_USER_REMOVE(u);
90         return res;
91 }
92
93 int unload_module(void)
94 {
95         STANDARD_HANGUP_LOCALUSERS;
96         return ast_unregister_application(app_exec);
97 }
98
99 int load_module(void)
100 {
101         return ast_register_application(app_exec, exec_exec, exec_synopsis, exec_descrip);
102 }
103
104 char *description(void)
105 {
106         return tdesc;
107 }
108
109 int usecount(void)
110 {
111         int res;
112         STANDARD_USECOUNT(res);
113         return res;
114 }
115
116 char *key()
117 {
118         return ASTERISK_GPL_KEY;
119 }