make app_queue 1.2 jump compliant (issue #5580)
[asterisk/asterisk.git] / funcs / func_enum.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005
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  * \arg See also AstENUM
25  */
26
27 #include <stdlib.h>
28 #include <stdio.h>
29
30 #include "asterisk.h"
31
32 #ifndef BUILTIN_FUNC
33 #include "asterisk/module.h"
34 #endif /* BUILTIN_FUNC */
35 #include "asterisk/channel.h"
36 #include "asterisk/pbx.h"
37 #include "asterisk/utils.h"
38
39 #include "asterisk/lock.h"
40 #include "asterisk/file.h"
41 #include "asterisk/logger.h"
42
43 #include "asterisk/pbx.h"
44 #include "asterisk/options.h"
45
46 #include "asterisk/enum.h"
47
48 static char* synopsis = "Syntax: ENUMLOOKUP(number[,Method-type[,options|record#[,zone-suffix]]])\n";
49
50 STANDARD_LOCAL_USER;
51
52 LOCAL_USER_DECL;
53
54 static char *function_enum(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
55 {
56        int res=0;
57        char tech[80];
58        char dest[80] = "";
59        char *zone;
60        char *options;
61        struct localuser *u;
62        char *params[4];
63        char *p = data;
64        char *s;
65        int i = 0;
66
67
68        if (ast_strlen_zero(data)) {
69                ast_log(LOG_WARNING, synopsis);
70                return "";
71        }
72
73        do {
74                if(i>3){
75                        ast_log(LOG_WARNING, synopsis);
76                        return "";
77                }
78                params[i++] = p;
79                p = strchr(p, '|');
80                if(p){
81                        *p = '\0';
82                        p++;
83                }
84        } while(p);
85
86        if(i < 1){
87                ast_log(LOG_WARNING, synopsis);
88                return "";
89        }
90
91        if( (i > 1 && strlen(params[1]) == 0) || i < 2){
92                ast_copy_string(tech, "sip", sizeof(tech));
93        } else {
94                ast_copy_string(tech, params[1], sizeof(tech));
95        }
96
97        if( (i > 3 && strlen(params[3]) == 0) || i<4){
98                zone = "e164.arpa";
99        } else {
100                zone = params[3];
101        }
102
103        if( (i > 2 && strlen(params[2]) == 0) || i<3){
104                options = "1";
105        } else {
106                options = params[2];
107        }
108
109        /* strip any '-' signs from number */
110        p = params[0];
111        /*
112        while(*p == '+'){
113                p++;
114        }
115        */
116        s = p;
117        i = 0;
118        while(*p && *s){
119                if(*s == '-'){
120                        s++;
121                } else {
122                        p[i++] = *s++;
123                }
124        }
125        p[i] = 0;
126
127        LOCAL_USER_ACF_ADD(u);
128
129        res = ast_get_enum(chan, p, dest, sizeof(dest), tech, sizeof(tech), zone, options);
130
131        LOCAL_USER_REMOVE(u);
132
133        p = strchr(dest, ':');
134        if(p && strncasecmp(tech, "ALL", sizeof(tech))) {
135                ast_copy_string(buf, p+1, sizeof(dest));
136        } else {
137                ast_copy_string(buf, dest, sizeof(dest));
138        }
139
140        return buf;
141 }
142
143 #ifndef BUILTIN_FUNC
144 static
145 #endif
146 struct ast_custom_function enum_function = {
147        .name = "ENUMLOOKUP",
148        .synopsis = "ENUMLOOKUP allows for general or specific querying of NAPTR records"
149        " or counts of NAPTR types for ENUM or ENUM-like DNS pointers",
150        .syntax = "ENUMLOOKUP(number[,Method-type[,options|record#[,zone-suffix]]])",
151        .desc = "Option 'c' returns an integer count of the number of NAPTRs of a certain RR type.\n"
152        "Combination of 'c' and Method-type of 'ALL' will return a count of all NAPTRs for the record.\n"
153        "Defaults are: Method-type=sip, no options, record=1, zone-suffix=e164.arpa\n\n"
154        "For more information, see README.enum",
155        .read = function_enum,
156 };
157
158 static char *function_txtcidname(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
159 {
160         int res;
161         char tech[80];
162         char txt[256] = "";
163         char dest[80];
164         struct localuser *u;
165
166         LOCAL_USER_ACF_ADD(u);
167
168         buf[0] = '\0';
169
170         if (ast_strlen_zero(data)) {
171                 ast_log(LOG_WARNING, "TXTCIDNAME requires an argument (number)\n");
172                 LOCAL_USER_REMOVE(u);
173                 return buf;     
174         }
175
176         res = ast_get_txt(chan, data, dest, sizeof(dest), tech, sizeof(tech), txt, sizeof(txt));
177         
178         if (!ast_strlen_zero(txt))
179                 ast_copy_string(buf, txt, len);
180         
181         LOCAL_USER_REMOVE(u);
182
183         return buf;
184 }
185
186 #ifndef BUILTIN_FUNC
187 static
188 #endif
189 struct ast_custom_function txtcidname_function = {
190        .name = "TXTCIDNAME",
191        .synopsis = "TXTCIDNAME looks up a caller name via DNS",
192        .syntax = "TXTCIDNAME(<number>)",
193        .desc = "This function looks up the given phone number in DNS to retrieve\n"
194         "the caller id name.  The result will either be blank or be the value\n"
195         "found in the TXT record in DNS.\n",
196        .read = function_txtcidname,
197 };
198
199 #ifndef BUILTIN_FUNC
200
201 static char *tdesc = "ENUMLOOKUP allows for general or specific querying of NAPTR records or counts of NAPTR types for ENUM or ENUM-like DNS pointers";
202
203 int unload_module(void)
204 {
205         ast_custom_function_unregister(&enum_function);
206         ast_custom_function_unregister(&txtcidname_function);
207
208         STANDARD_HANGUP_LOCALUSERS;
209         
210         return 0;
211 }
212
213 int load_module(void)
214 {
215         int res;
216         
217         res = ast_custom_function_register(&enum_function);
218         if (!res)
219                 ast_custom_function_register(&txtcidname_function);
220
221         return res;
222 }
223
224 char *description(void)
225 {
226        return tdesc;
227 }
228
229 int usecount(void)
230 {
231         int res;
232         
233         STANDARD_USECOUNT(res);
234
235         return res;
236 }
237
238 char *key()
239 {
240        return ASTERISK_GPL_KEY;
241 }
242 #endif /* BUILTIN_FUNC */
243