Remove pthread.h from source. We should be using asterisk/lock.h everywhere instead...
[asterisk/asterisk.git] / apps / app_read.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Trivial application to read a variable
5  * 
6  * Copyright (C) 2003, Digium
7  *
8  * Mark Spencer <markster@digium.com>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13  
14 #include <asterisk/lock.h>
15 #include <asterisk/file.h>
16 #include <asterisk/logger.h>
17 #include <asterisk/channel.h>
18 #include <asterisk/pbx.h>
19 #include <asterisk/app.h>
20 #include <asterisk/module.h>
21 #include <asterisk/translate.h>
22 #include <asterisk/options.h>
23 #include <asterisk/utils.h>
24 #include <string.h>
25 #include <stdlib.h>
26
27 static char *tdesc = "Read Variable Application";
28
29 static char *app = "Read";
30
31 static char *synopsis = "Read a variable";
32
33 static char *descrip = 
34 "  Read(variable[|filename][|maxdigits]):  Reads a #-terminated string of digits from\n"
35 "the user, optionally playing a given filename first.  Returns -1 on hangup or\n"
36 "error and 0 otherwise.\n"
37 "  maxdigits   -- maximum acceptable number of digits. Stops reading after maxdigits\n"
38 "                 have been entered (without requiring the user press the '#' key).\n"
39 "                 Defaults to 0 - no limit - wait for the user press the '#' key.\n"
40 "                 Any value below 0 means the same. Max accepted value is 255.\n";      
41
42 STANDARD_LOCAL_USER;
43
44 LOCAL_USER_DECL;
45
46 static int read_exec(struct ast_channel *chan, void *data)
47 {
48         int res = 0;
49         struct localuser *u;
50         char tmp[256];
51         char *varname;
52         char *filename;
53         char *stringp;
54         char *maxdigitstr;
55         int maxdigits=255;
56         if (!data || ast_strlen_zero((char *)data)) {
57                 ast_log(LOG_WARNING, "Read requires an argument (variable)\n");
58                 return -1;
59         }
60         strncpy(tmp, (char *)data, sizeof(tmp)-1);
61         stringp=(char *)calloc(1,strlen(tmp)+1);
62         snprintf(stringp,strlen(tmp)+1,"%s",tmp);
63         varname = strsep(&stringp, "|");
64         filename = strsep(&stringp, "|");
65         maxdigitstr = strsep(&stringp,"|");
66         if (!(filename) || ast_strlen_zero(filename)) 
67                 filename = NULL;
68         if (maxdigitstr) {
69             maxdigits = atoi(maxdigitstr);
70             if ((maxdigits<1) || (maxdigits>255)) {
71                 maxdigits = 255;
72             } else
73                 ast_verbose(VERBOSE_PREFIX_3 "Accepting a maximum of %i digits.\n", maxdigits);
74         }       
75         if (!(varname) || ast_strlen_zero(varname)) {
76                 ast_log(LOG_WARNING, "Read requires an variable name\n");
77                 return -1;
78         }
79         LOCAL_USER_ADD(u);
80         if (chan->_state != AST_STATE_UP) {
81                 /* Answer if the line isn't up. */
82                 res = ast_answer(chan);
83         }
84         strncpy(tmp, (char *)varname, sizeof(tmp)-1);
85         if (!res) {
86                 ast_stopstream(chan);
87                 res = ast_app_getdata(chan, filename, tmp, maxdigits, 0);
88                 if (res > -1)
89                         pbx_builtin_setvar_helper(chan, varname, tmp);
90                 ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp);
91         }
92         LOCAL_USER_REMOVE(u);
93         return res;
94 }
95
96 int unload_module(void)
97 {
98         STANDARD_HANGUP_LOCALUSERS;
99         return ast_unregister_application(app);
100 }
101
102 int load_module(void)
103 {
104         return ast_register_application(app, read_exec, synopsis, descrip);
105 }
106
107 char *description(void)
108 {
109         return tdesc;
110 }
111
112 int usecount(void)
113 {
114         int res;
115         STANDARD_USECOUNT(res);
116         return res;
117 }
118
119 char *key()
120 {
121         return ASTERISK_GPL_KEY;
122 }