don't force a default zone for ENUM() lookups, use the configuration file (issue...
[asterisk/asterisk.git] / funcs / func_enum.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2006
5  *
6  * Mark Spencer <markster@digium.com>
7  * Oleksiy Krivoshey <oleksiyk@gmail.com>
8  * Russell Bryant <russelb@clemson.edu>
9  *
10  * See http://www.asterisk.org for more information about
11  * the Asterisk project. Please do not directly contact
12  * any of the maintainers of this project for assistance;
13  * the project provides a web site, mailing lists and IRC
14  * channels for your use.
15  *
16  * This program is free software, distributed under the terms of
17  * the GNU General Public License Version 2. See the LICENSE file
18  * at the top of the source tree.
19  */
20
21 /*! \file
22  *
23  * \brief ENUM Functions
24  *
25  * \author Mark Spencer <markster@digium.com>
26  * \author Oleksiy Krivoshey <oleksiyk@gmail.com>
27  * \author Russell Bryant <russelb@clemson.edu>
28  *
29  * \arg See also AstENUM
30  */
31
32 #include <stdlib.h>
33 #include <stdio.h>
34
35 #include "asterisk.h"
36
37 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
38
39 #include "asterisk/module.h"
40 #include "asterisk/channel.h"
41 #include "asterisk/pbx.h"
42 #include "asterisk/utils.h"
43 #include "asterisk/lock.h"
44 #include "asterisk/file.h"
45 #include "asterisk/logger.h"
46 #include "asterisk/pbx.h"
47 #include "asterisk/options.h"
48 #include "asterisk/enum.h"
49 #include "asterisk/app.h"
50
51  static char *synopsis = "Syntax: ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])\n";
52
53 STANDARD_LOCAL_USER;
54
55 LOCAL_USER_DECL;
56
57 static int function_enum(struct ast_channel *chan, char *cmd, char *data,
58                          char *buf, size_t len)
59 {
60         AST_DECLARE_APP_ARGS(args,
61                 AST_APP_ARG(number);
62                 AST_APP_ARG(tech);
63                 AST_APP_ARG(options);
64                 AST_APP_ARG(record);
65                 AST_APP_ARG(zone);
66         );
67         int res = 0;
68         char tech[80];
69         char dest[80] = "";
70         struct localuser *u;
71         char *s, *p;
72
73         buf[0] = '\0';
74
75         if (ast_strlen_zero(data)) {
76                 ast_log(LOG_WARNING, synopsis);
77                 return -1;
78         }
79
80         AST_STANDARD_APP_ARGS(args, data);
81
82         if (args.argc < 1) {
83                 ast_log(LOG_WARNING, synopsis);
84                 return -1;
85         }
86
87         ast_copy_string(tech, args.tech ? args.tech : "sip", sizeof(tech));
88
89         if (!args.options)
90                 args.options = "1";
91
92         /* strip any '-' signs from number */
93         for (p = args.number, s = p; *s; *s++) {
94                 if (*s != '-')
95                         *p++ = *s;
96         }
97         *p = '\0';
98
99         LOCAL_USER_ADD(u);
100
101         res = ast_get_enum(chan, p, dest, sizeof(dest), tech, sizeof(tech), args.zone,
102                            args.options);
103
104         LOCAL_USER_REMOVE(u);
105
106         p = strchr(dest, ':');
107         if (p && strcasecmp(tech, "ALL"))
108                 ast_copy_string(buf, p + 1, len);
109         else
110                 ast_copy_string(buf, dest, len);
111
112         return 0;
113 }
114
115 static struct ast_custom_function enum_function = {
116         .name = "ENUMLOOKUP",
117         .synopsis =
118                 "ENUMLOOKUP allows for general or specific querying of NAPTR records"
119                 " or counts of NAPTR types for ENUM or ENUM-like DNS pointers",
120         .syntax =
121                 "ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])",
122         .desc =
123                 "Option 'c' returns an integer count of the number of NAPTRs of a certain RR type.\n"
124                 "Combination of 'c' and Method-type of 'ALL' will return a count of all NAPTRs for the record.\n"
125                 "Defaults are: Method-type=sip, no options, record=1, zone-suffix=e164.arpa\n\n"
126                 "For more information, see README.enum",
127         .read = function_enum,
128 };
129
130 static int function_txtcidname(struct ast_channel *chan, char *cmd,
131                                char *data, char *buf, size_t len)
132 {
133         int res;
134         char tech[80];
135         char txt[256] = "";
136         char dest[80];
137         struct localuser *u;
138
139         buf[0] = '\0';
140
141         LOCAL_USER_ADD(u);
142
143         if (ast_strlen_zero(data)) {
144                 ast_log(LOG_WARNING, "TXTCIDNAME requires an argument (number)\n");
145                 LOCAL_USER_REMOVE(u);
146                 return -1;
147         }
148
149         res = ast_get_txt(chan, data, dest, sizeof(dest), tech, sizeof(tech), txt,
150                           sizeof(txt));
151
152         if (!ast_strlen_zero(txt))
153                 ast_copy_string(buf, txt, len);
154
155         LOCAL_USER_REMOVE(u);
156
157         return 0;
158 }
159
160 static struct ast_custom_function txtcidname_function = {
161         .name = "TXTCIDNAME",
162         .synopsis = "TXTCIDNAME looks up a caller name via DNS",
163         .syntax = "TXTCIDNAME(<number>)",
164         .desc =
165                 "This function looks up the given phone number in DNS to retrieve\n"
166                 "the caller id name.  The result will either be blank or be the value\n"
167                 "found in the TXT record in DNS.\n",
168         .read = function_txtcidname,
169 };
170
171 static char *tdesc = "ENUM related dialplan functions";
172
173 int unload_module(void)
174 {
175         int res = 0;
176
177         res |= ast_custom_function_unregister(&enum_function);
178         res |= ast_custom_function_unregister(&txtcidname_function);
179
180         STANDARD_HANGUP_LOCALUSERS;
181
182         return res;
183 }
184
185 int load_module(void)
186 {
187         int res = 0;
188
189         res |= ast_custom_function_register(&enum_function);
190         res |= ast_custom_function_register(&txtcidname_function);
191
192         return res;
193 }
194
195 char *description(void)
196 {
197         return tdesc;
198 }
199
200 int usecount(void)
201 {
202         int res;
203
204         STANDARD_USECOUNT(res);
205
206         return res;
207 }
208
209 char *key()
210 {
211         return ASTERISK_GPL_KEY;
212 }