51d96e85a33f4a2d9a590b06010aea094be5538d
[asterisk/asterisk.git] / funcs / func_enum.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2005
5  *
6  * Oleksiy Krivoshey <oleksiyk@gmail.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*
20  *
21  * Enum Functions
22  *
23  */
24
25 #include <stdlib.h>
26
27 #include "asterisk.h"
28
29 #ifndef BUILTIN_FUNC
30 #include "asterisk/module.h"
31 #endif /* BUILTIN_FUNC */
32 #include "asterisk/channel.h"
33 #include "asterisk/pbx.h"
34 #include "asterisk/utils.h"
35
36 #include "asterisk/lock.h"
37 #include "asterisk/file.h"
38 #include "asterisk/logger.h"
39
40 #include "asterisk/pbx.h"
41 #include "asterisk/options.h"
42
43 #include "asterisk/enum.h"
44
45 static char* synopsis = "Syntax: ENUMLOOKUP(number[,Method-type[,options|record#[,zone-suffix]]])\n";
46
47 STANDARD_LOCAL_USER;
48
49 LOCAL_USER_DECL;
50
51 static char *function_enum(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
52 {
53        int res=0;
54        char tech[80];
55        char dest[80] = "";
56        char *zone;
57        char *options;
58        struct localuser *u;
59        char *params[4];
60        char *p = data;
61        char *s;
62        int i = 0;
63
64
65        if (!data || ast_strlen_zero(data)) {
66                ast_log(LOG_WARNING, synopsis);
67                return "";
68        }
69
70        do {
71                if(i>3){
72                        ast_log(LOG_WARNING, synopsis);
73                        return "";
74                }
75                params[i++] = p;
76                p = strchr(p, '|');
77                if(p){
78                        *p = '\0';
79                        p++;
80                }
81        } while(p);
82
83        if(i < 1){
84                ast_log(LOG_WARNING, synopsis);
85                return "";
86        }
87
88        if( (i > 1 && strlen(params[1]) == 0) || i < 2){
89                ast_copy_string(tech, "sip", sizeof(tech));
90        } else {
91                ast_copy_string(tech, params[1], sizeof(tech));
92        }
93
94        if( (i > 3 && strlen(params[3]) == 0) || i<4){
95                zone = "e164.arpa";
96        } else {
97                zone = params[3];
98        }
99
100        if( (i > 2 && strlen(params[2]) == 0) || i<3){
101                options = "1";
102        } else {
103                options = params[2];
104        }
105
106        /* strip any '-' signs from number */
107        p = params[0];
108        /*
109        while(*p == '+'){
110                p++;
111        }
112        */
113        s = p;
114        i = 0;
115        while(*p && *s){
116                if(*s == '-'){
117                        s++;
118                } else {
119                        p[i++] = *s++;
120                }
121        }
122        p[i] = 0;
123
124        LOCAL_USER_ACF_ADD(u);
125
126        res = ast_get_enum(chan, p, dest, sizeof(dest), tech, sizeof(tech), zone, options);
127
128        LOCAL_USER_REMOVE(u);
129
130        p = strchr(dest, ':');
131        if(p && strncasecmp(tech, "ALL", sizeof(tech))) {
132                ast_copy_string(buf, p+1, sizeof(dest));
133        } else {
134                ast_copy_string(buf, dest, sizeof(dest));
135        }
136
137        return buf;
138 }
139
140
141 #ifndef BUILTIN_FUNC
142 static
143 #endif
144 struct ast_custom_function enum_function = {
145        .name = "ENUMLOOKUP",
146        .synopsis = "ENUMLOOKUP allows for general or specific querying of NAPTR records"
147        " or counts of NAPTR types for ENUM or ENUM-like DNS pointers",
148        .syntax = "ENUMLOOKUP(number[,Method-type[,options|record#[,zone-suffix]]])",
149        .desc = "Option 'c' returns an integer count of the number of NAPTRs of a certain RR type.\n"
150        "Combination of 'c' and Method-type of 'ALL' will return a count of all NAPTRs for the record.\n"
151        "Defaults are: Method-type=sip, no options, record=1, zone-suffix=e164.arpa\n\n"
152        "For more information, see README.enum",
153        .read = function_enum,
154 };
155
156 #ifndef BUILTIN_FUNC
157
158 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";
159
160 int unload_module(void)
161 {
162        return ast_custom_function_unregister(&enum_function);
163 }
164
165 int load_module(void)
166 {
167        return ast_custom_function_register(&enum_function);
168 }
169
170 char *description(void)
171 {
172        return tdesc;
173 }
174
175 int usecount(void)
176 {
177        return 0;
178 }
179
180 char *key()
181 {
182        return ASTERISK_GPL_KEY;
183 }
184 #endif /* BUILTIN_FUNC */
185