00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "asterisk.h"
00033
00034 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 153337 $")
00035
00036 #include <stdlib.h>
00037 #include <stdio.h>
00038
00039 #include "asterisk/module.h"
00040 #include "asterisk/channel.h"
00041 #include "asterisk/pbx.h"
00042 #include "asterisk/utils.h"
00043 #include "asterisk/lock.h"
00044 #include "asterisk/file.h"
00045 #include "asterisk/logger.h"
00046 #include "asterisk/pbx.h"
00047 #include "asterisk/options.h"
00048 #include "asterisk/enum.h"
00049 #include "asterisk/app.h"
00050
00051 static char *synopsis = "Syntax: ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])\n";
00052
00053 static int function_enum(struct ast_channel *chan, char *cmd, char *data,
00054 char *buf, size_t len)
00055 {
00056 AST_DECLARE_APP_ARGS(args,
00057 AST_APP_ARG(number);
00058 AST_APP_ARG(tech);
00059 AST_APP_ARG(options);
00060 AST_APP_ARG(record);
00061 AST_APP_ARG(zone);
00062 );
00063 int res = 0;
00064 char tech[80];
00065 char dest[256] = "", tmp[2] = "", num[AST_MAX_EXTENSION] = "";
00066 struct ast_module_user *u;
00067 char *s, *p;
00068 unsigned int record = 1;
00069
00070 buf[0] = '\0';
00071
00072 if (ast_strlen_zero(data)) {
00073 ast_log(LOG_WARNING, "%s", synopsis);
00074 return -1;
00075 }
00076
00077 AST_STANDARD_APP_ARGS(args, data);
00078
00079 if (args.argc < 1) {
00080 ast_log(LOG_WARNING, "%s", synopsis);
00081 return -1;
00082 }
00083
00084 u = ast_module_user_add(chan);
00085
00086 ast_copy_string(tech, args.tech ? args.tech : "sip", sizeof(tech));
00087
00088 if (!args.zone)
00089 args.zone = "e164.arpa";
00090
00091 if (!args.options)
00092 args.options = "";
00093
00094 if (args.record)
00095 record = atoi(args.record);
00096
00097
00098 for (s = p = args.number; *s; s++) {
00099 if (*s != '-') {
00100 snprintf(tmp, sizeof(tmp), "%c", *s);
00101 strncat(num, tmp, sizeof(num) - strlen(num) - 1);
00102 }
00103
00104 }
00105
00106 res = ast_get_enum(chan, num, dest, sizeof(dest), tech, sizeof(tech), args.zone,
00107 args.options, record);
00108
00109 p = strchr(dest, ':');
00110 if (p && strcasecmp(tech, "ALL"))
00111 ast_copy_string(buf, p + 1, len);
00112 else
00113 ast_copy_string(buf, dest, len);
00114
00115 ast_module_user_remove(u);
00116
00117 return 0;
00118 }
00119
00120 static struct ast_custom_function enum_function = {
00121 .name = "ENUMLOOKUP",
00122 .synopsis =
00123 "ENUMLOOKUP allows for general or specific querying of NAPTR records"
00124 " or counts of NAPTR types for ENUM or ENUM-like DNS pointers",
00125 .syntax =
00126 "ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])",
00127 .desc =
00128 "Option 'c' returns an integer count of the number of NAPTRs of a certain RR type.\n"
00129 "Combination of 'c' and Method-type of 'ALL' will return a count of all NAPTRs for the record.\n"
00130 "Defaults are: Method-type=sip, no options, record=1, zone-suffix=e164.arpa\n\n"
00131 "For more information, see doc/enum.txt",
00132 .read = function_enum,
00133 };
00134
00135 static int function_txtcidname(struct ast_channel *chan, char *cmd,
00136 char *data, char *buf, size_t len)
00137 {
00138 int res;
00139 char tech[80];
00140 char txt[256] = "";
00141 char dest[80];
00142 struct ast_module_user *u;
00143
00144 buf[0] = '\0';
00145
00146
00147 if (ast_strlen_zero(data)) {
00148 ast_log(LOG_WARNING, "TXTCIDNAME requires an argument (number)\n");
00149 return -1;
00150 }
00151
00152 u = ast_module_user_add(chan);
00153
00154 res = ast_get_txt(chan, data, dest, sizeof(dest), tech, sizeof(tech), txt,
00155 sizeof(txt));
00156
00157 if (!ast_strlen_zero(txt))
00158 ast_copy_string(buf, txt, len);
00159
00160 ast_module_user_remove(u);
00161
00162 return 0;
00163 }
00164
00165 static struct ast_custom_function txtcidname_function = {
00166 .name = "TXTCIDNAME",
00167 .synopsis = "TXTCIDNAME looks up a caller name via DNS",
00168 .syntax = "TXTCIDNAME(<number>)",
00169 .desc =
00170 "This function looks up the given phone number in DNS to retrieve\n"
00171 "the caller id name. The result will either be blank or be the value\n"
00172 "found in the TXT record in DNS.\n",
00173 .read = function_txtcidname,
00174 };
00175
00176 static int unload_module(void)
00177 {
00178 int res = 0;
00179
00180 res |= ast_custom_function_unregister(&enum_function);
00181 res |= ast_custom_function_unregister(&txtcidname_function);
00182
00183 ast_module_user_hangup_all();
00184
00185 return res;
00186 }
00187
00188 static int load_module(void)
00189 {
00190 int res = 0;
00191
00192 res |= ast_custom_function_register(&enum_function);
00193 res |= ast_custom_function_register(&txtcidname_function);
00194
00195 return res;
00196 }
00197
00198 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "ENUM related dialplan functions");