add EVAL function, deprecate Eval application (bug #4277)
[asterisk/asterisk.git] / apps / app_eval.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Eval application
5  *
6  * Copyright (c) 2004 - 2005, Tilghman Lesher.  All rights reserved.
7  *
8  * Tilghman Lesher <app_eval__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 = "Reevaluates strings";
31
32 static char *app_eval = "Eval";
33
34 static char *eval_synopsis = "Evaluates a string";
35
36 static char *eval_descrip =
37 "Usage: Eval(newvar=somestring)\n"
38 "  Normally Asterisk evaluates variables inline.  But what if you want to\n"
39 "store variable offsets in a database, to be evaluated later?  Eval is\n"
40 "the answer, by allowing a string to be evaluated twice in the dialplan,\n"
41 "the first time as part of the normal dialplan, and the second using Eval.\n";
42
43 STANDARD_LOCAL_USER;
44
45 LOCAL_USER_DECL;
46
47 static int eval_exec(struct ast_channel *chan, void *data)
48 {
49         int res=0;
50         struct localuser *u;
51         char *s, *newvar=NULL, tmp[MAXRESULT];
52         static int dep_warning = 0;
53
54         if (!dep_warning) {
55                 ast_log(LOG_WARNING, "This application has been deprecated in favor of the dialplan function, EVAL\n");
56                 dep_warning = 1;
57         }
58
59         LOCAL_USER_ADD(u);
60
61         /* Check and parse arguments */
62         if (data) {
63                 s = ast_strdupa((char *)data);
64                 if (s) {
65                         newvar = strsep(&s, "=");
66                         if (newvar && (newvar[0] != '\0')) {
67                                 memset(tmp, 0, MAXRESULT);
68                                 pbx_substitute_variables_helper(chan, s, tmp, MAXRESULT - 1);
69                                 pbx_builtin_setvar_helper(chan, newvar, tmp);
70                         }
71                 } else {
72                         ast_log(LOG_ERROR, "Out of memory\n");
73                         res = -1;
74                 }
75         }
76
77         LOCAL_USER_REMOVE(u);
78         return res;
79 }
80
81 int unload_module(void)
82 {
83         STANDARD_HANGUP_LOCALUSERS;
84         return ast_unregister_application(app_eval);
85 }
86
87 int load_module(void)
88 {
89         return ast_register_application(app_eval, eval_exec, eval_synopsis, eval_descrip);
90 }
91
92 char *description(void)
93 {
94         return tdesc;
95 }
96
97 int usecount(void)
98 {
99         int res;
100         STANDARD_USECOUNT(res);
101         return res;
102 }
103
104 char *key()
105 {
106         return ASTERISK_GPL_KEY;
107 }