check input for errors. Bug #435
[asterisk/asterisk.git] / apps / app_senddtmf.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * App to send DTMF digits
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
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/module.h>
20 #include <asterisk/translate.h>
21 #include <asterisk/options.h>
22 #include <string.h>
23 #include <stdlib.h>
24 #include <pthread.h>
25
26 static char *tdesc = "Send DTMF digits Application";
27
28 static char *app = "SendDTMF";
29
30 static char *synopsis = "Sends arbitrary DTMF digits";
31
32 static char *descrip = 
33 "  SendDTMF(digits): Sends DTMF digits on a channel. \n"
34 "  Accepted digits: 0-9, *#abcd\n"
35 " Returns 0 on success or -1 on a hangup.\n";
36
37 STANDARD_LOCAL_USER;
38
39 LOCAL_USER_DECL;
40
41 static int senddtmf_exec(struct ast_channel *chan, void *data)
42 {
43         int res = 0;
44         struct localuser *u;
45         char *digits = data;
46         struct ast_frame f;
47         int x;
48         if (!digits || !strlen(digits)) {
49                 ast_log(LOG_WARNING, "SendDTMF requires an argument (digits or *#abcd)\n");
50                 return -1;
51         }
52         LOCAL_USER_ADD(u);
53         for (x=0;x<strlen(digits);x++) {
54                 memset(&f, 0, sizeof(f));
55                 f.frametype = AST_FRAME_DTMF;
56                 f.subclass = digits[x];
57                 f.src = "app_senddtmf";
58                 res = ast_write(chan, &f);
59                  if (strchr("0123456789*#abcd",digits[x])==NULL) {
60                        ast_log(LOG_WARNING, "Illegal DTMF character in string. (0-9*#abcd allowed)\n");
61                } else {
62                   res = ast_write(chan, &f);
63                   if (res)
64                         break;
65                   /* Wait 250ms */
66                   res = ast_safe_sleep(chan, 250);
67                   if (res)
68                         break;
69                }
70         }
71         if (!res)
72                 if (option_verbose > 2)
73                         ast_verbose(VERBOSE_PREFIX_3 "Sent digit string '%s' on %s\n", digits, chan->name);
74                         
75         LOCAL_USER_REMOVE(u);
76         return res;
77 }
78
79 int unload_module(void)
80 {
81         STANDARD_HANGUP_LOCALUSERS;
82         return ast_unregister_application(app);
83 }
84
85 int load_module(void)
86 {
87         return ast_register_application(app, senddtmf_exec, synopsis, descrip);
88 }
89
90 char *description(void)
91 {
92         return tdesc;
93 }
94
95 int usecount(void)
96 {
97         int res;
98         STANDARD_USECOUNT(res);
99         return res;
100 }
101
102 char *key()
103 {
104         return ASTERISK_GPL_KEY;
105 }