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