ENUM Functions. More...
#include "asterisk.h"#include "asterisk/module.h"#include "asterisk/channel.h"#include "asterisk/pbx.h"#include "asterisk/utils.h"#include "asterisk/lock.h"#include "asterisk/file.h"#include "asterisk/enum.h"#include "asterisk/app.h"
Go to the source code of this file.
Data Structures | |
| struct | enum_result_datastore |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | enum_query_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | enum_result_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static void | erds_destroy (struct enum_result_datastore *data) |
| static void | erds_destroy_cb (void *data) |
| static int | function_enum (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | function_txtcidname (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| static int | load_module (void) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "ENUM related dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| unsigned int | enum_datastore_id |
| static struct ast_custom_function | enum_function |
| static struct ast_custom_function | enum_query_function |
| struct ast_datastore_info | enum_result_datastore_info |
| static struct ast_custom_function | enum_result_function |
| static char * | synopsis = "Syntax: ENUMLOOKUP(number[,Method-type[,options[,record#[,zone-suffix]]]])\n" |
| static struct ast_custom_function | txtcidname_function |
| static void __reg_module | ( | void | ) | [static] |
Definition at line 475 of file func_enum.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 475 of file func_enum.c.
| static int enum_query_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 251 of file func_enum.c.
References AST_APP_ARG, ast_atomic_fetchadd_int(), ast_calloc, ast_channel_datastore_add(), ast_channel_lock, ast_channel_unlock, ast_copy_string(), ast_datastore_alloc(), AST_DECLARE_APP_ARGS, ast_free, ast_get_enum(), ast_log(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), enum_result_datastore::context, ast_datastore::data, enum_result_datastore::id, LOG_ERROR, LOG_WARNING, parse(), and ast_channel::zone.
{
struct enum_result_datastore *erds;
struct ast_datastore *datastore;
char *parse, tech[128], dest[128];
int res = -1;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(number);
AST_APP_ARG(tech);
AST_APP_ARG(zone);
);
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "ENUMQUERY requires at least a number as an argument...\n");
goto finish;
}
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
if (!chan) {
ast_log(LOG_ERROR, "ENUMQUERY cannot be used without a channel!\n");
goto finish;
}
if (!args.zone)
args.zone = "e164.zone";
ast_copy_string(tech, args.tech ? args.tech : "sip", sizeof(tech));
if (!(erds = ast_calloc(1, sizeof(*erds))))
goto finish;
if (!(erds->context = ast_calloc(1, sizeof(*erds->context)))) {
ast_free(erds);
goto finish;
}
erds->id = ast_atomic_fetchadd_int((int *) &enum_datastore_id, 1);
snprintf(buf, len, "%u", erds->id);
if (!(datastore = ast_datastore_alloc(&enum_result_datastore_info, buf))) {
ast_free(erds->context);
ast_free(erds);
goto finish;
}
ast_get_enum(chan, args.number, dest, sizeof(dest), tech, sizeof(tech), args.zone, "", 1, &erds->context);
datastore->data = erds;
ast_channel_lock(chan);
ast_channel_datastore_add(chan, datastore);
ast_channel_unlock(chan);
res = 0;
finish:
return res;
}
| static int enum_result_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 316 of file func_enum.c.
References AST_APP_ARG, ast_channel_datastore_find(), ast_channel_lock, ast_channel_unlock, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), enum_result_datastore::context, ast_datastore::data, LOG_ERROR, LOG_WARNING, enum_context::naptr_rrs, enum_context::naptr_rrs_count, num, parse(), enum_naptr_rr::result, enum_naptr_rr::sort_pos, and enum_naptr_rr::tech.
{
struct enum_result_datastore *erds;
struct ast_datastore *datastore;
char *parse, *p;
unsigned int num;
int res = -1, k;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(id);
AST_APP_ARG(resultnum);
);
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "ENUMRESULT requires two arguments (id and resultnum)\n");
goto finish;
}
if (!chan) {
ast_log(LOG_ERROR, "ENUMRESULT can not be used without a channel!\n");
goto finish;
}
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
if (ast_strlen_zero(args.id)) {
ast_log(LOG_ERROR, "A result ID must be provided to ENUMRESULT\n");
goto finish;
}
if (ast_strlen_zero(args.resultnum)) {
ast_log(LOG_ERROR, "A result number must be given to ENUMRESULT!\n");
goto finish;
}
ast_channel_lock(chan);
datastore = ast_channel_datastore_find(chan, &enum_result_datastore_info, args.id);
ast_channel_unlock(chan);
if (!datastore) {
ast_log(LOG_WARNING, "No ENUM results found for query id!\n");
goto finish;
}
erds = datastore->data;
if (!strcasecmp(args.resultnum, "getnum")) {
snprintf(buf, len, "%u", erds->context->naptr_rrs_count);
res = 0;
goto finish;
}
if (sscanf(args.resultnum, "%30u", &num) != 1) {
ast_log(LOG_ERROR, "Invalid value '%s' for resultnum to ENUMRESULT!\n", args.resultnum);
goto finish;
}
if (!num || num > erds->context->naptr_rrs_count) {
ast_log(LOG_WARNING, "Result number %u is not valid for ENUM query results for ID %s!\n", num, args.id);
goto finish;
}
for (k = 0; k < erds->context->naptr_rrs_count; k++) {
if (num - 1 != erds->context->naptr_rrs[k].sort_pos)
continue;
p = strchr(erds->context->naptr_rrs[k].result, ':');
if (p && strcasecmp(erds->context->naptr_rrs[k].tech, "ALL"))
ast_copy_string(buf, p + 1, len);
else
ast_copy_string(buf, erds->context->naptr_rrs[k].result, len);
break;
}
res = 0;
finish:
return res;
}
| static void erds_destroy | ( | struct enum_result_datastore * | data | ) | [static] |
Definition at line 226 of file func_enum.c.
References ast_free, enum_result_datastore::context, enum_context::naptr_rrs, enum_context::naptr_rrs_count, enum_naptr_rr::result, and enum_naptr_rr::tech.
Referenced by erds_destroy_cb().
| static void erds_destroy_cb | ( | void * | data | ) | [static] |
Definition at line 240 of file func_enum.c.
References erds_destroy().
{
struct enum_result_datastore *erds = data;
erds_destroy(erds);
}
| static int function_enum | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 154 of file func_enum.c.
References AST_APP_ARG, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_get_enum(), ast_log(), AST_MAX_EXTENSION, AST_STANDARD_APP_ARGS, ast_strlen_zero(), LOG_WARNING, num, s, and ast_channel::zone.
{
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(number);
AST_APP_ARG(tech);
AST_APP_ARG(options);
AST_APP_ARG(record);
AST_APP_ARG(zone);
);
int res = 0;
char tech[80];
char dest[256] = "", tmp[2] = "", num[AST_MAX_EXTENSION] = "";
char *s, *p;
unsigned int record = 1;
buf[0] = '\0';
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "%s", synopsis);
return -1;
}
AST_STANDARD_APP_ARGS(args, data);
if (args.argc < 1) {
ast_log(LOG_WARNING, "%s", synopsis);
return -1;
}
if (args.tech && !ast_strlen_zero(args.tech)) {
ast_copy_string(tech,args.tech, sizeof(tech));
} else {
ast_copy_string(tech,"sip",sizeof(tech));
}
if (!args.zone) {
args.zone = "e164.arpa";
}
if (!args.options) {
args.options = "";
}
if (args.record) {
record = atoi(args.record) ? atoi(args.record) : record;
}
/* strip any '-' signs from number */
for (s = p = args.number; *s; s++) {
if (*s != '-') {
snprintf(tmp, sizeof(tmp), "%c", *s);
strncat(num, tmp, sizeof(num) - strlen(num) - 1);
}
}
res = ast_get_enum(chan, num, dest, sizeof(dest), tech, sizeof(tech), args.zone, args.options, record, NULL);
p = strchr(dest, ':');
if (p && strcasecmp(tech, "ALL") && !strchr(args.options, 'u')) {
ast_copy_string(buf, p + 1, len);
} else {
ast_copy_string(buf, dest, len);
}
return 0;
}
| static int function_txtcidname | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
Definition at line 414 of file func_enum.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_get_txt(), ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), LOG_WARNING, and ast_channel::zone.
{
int res;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(number);
AST_APP_ARG(zone);
);
buf[0] = '\0';
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "Syntax: TXTCIDNAME(number[,zone-suffix])\n");
return -1;
}
AST_STANDARD_APP_ARGS(args, data);
if (args.argc < 1) {
ast_log(LOG_WARNING, "Syntax: TXTCIDNAME(number[,zone-suffix])\n");
return -1;
}
if (!args.zone) {
args.zone = "e164.arpa";
}
res = ast_get_txt(chan, args.number, buf, len, args.zone);
return 0;
}
| static int load_module | ( | void | ) | [static] |
Definition at line 463 of file func_enum.c.
References ast_custom_function_register.
{
int res = 0;
res |= ast_custom_function_register(&enum_result_function);
res |= ast_custom_function_register(&enum_query_function);
res |= ast_custom_function_register(&enum_function);
res |= ast_custom_function_register(&txtcidname_function);
return res;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 451 of file func_enum.c.
References ast_custom_function_unregister().
{
int res = 0;
res |= ast_custom_function_unregister(&enum_result_function);
res |= ast_custom_function_unregister(&enum_query_function);
res |= ast_custom_function_unregister(&enum_function);
res |= ast_custom_function_unregister(&txtcidname_function);
return res;
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "ENUM related dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 475 of file func_enum.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 475 of file func_enum.c.
| unsigned int enum_datastore_id |
Definition at line 219 of file func_enum.c.
struct ast_custom_function enum_function [static] |
{
.name = "ENUMLOOKUP",
.read = function_enum,
}
Definition at line 409 of file func_enum.c.
struct ast_custom_function enum_query_function [static] |
{
.name = "ENUMQUERY",
.read = enum_query_read,
}
Definition at line 399 of file func_enum.c.
{
.type = "ENUMQUERY",
.destroy = erds_destroy_cb,
}
Definition at line 246 of file func_enum.c.
struct ast_custom_function enum_result_function [static] |
{
.name = "ENUMRESULT",
.read = enum_result_read,
}
Definition at line 404 of file func_enum.c.
char* synopsis = "Syntax: ENUMLOOKUP(number[,Method-type[,options[,record#[,zone-suffix]]]])\n" [static] |
Definition at line 152 of file func_enum.c.
struct ast_custom_function txtcidname_function [static] |
{
.name = "TXTCIDNAME",
.read = function_txtcidname,
}
Definition at line 446 of file func_enum.c.