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 | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "ENUM related dialplan functions" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static unsigned int | enum_datastore_id |
| static struct ast_custom_function | enum_function |
| static struct ast_custom_function | enum_query_function |
| static 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 477 of file func_enum.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 477 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 254 of file func_enum.c.
References args, 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, and parse().
{
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 319 of file func_enum.c.
References args, 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, 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 229 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 243 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 158 of file func_enum.c.
References args, 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(), and LOG_WARNING.
{
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);
);
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);
}
}
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 417 of file func_enum.c.
References args, AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_get_txt(), ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), and LOG_WARNING.
{
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";
}
ast_get_txt(chan, args.number, buf, len, args.zone);
return 0;
}
| static int load_module | ( | void | ) | [static] |
Definition at line 465 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 453 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 __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "ENUM related dialplan functions" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static] |
Definition at line 477 of file func_enum.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 477 of file func_enum.c.
unsigned int enum_datastore_id [static] |
Definition at line 222 of file func_enum.c.
struct ast_custom_function enum_function [static] |
{
.name = "ENUMLOOKUP",
.read = function_enum,
}
Definition at line 412 of file func_enum.c.
struct ast_custom_function enum_query_function [static] |
{
.name = "ENUMQUERY",
.read = enum_query_read,
}
Definition at line 402 of file func_enum.c.
struct ast_datastore_info enum_result_datastore_info [static] |
{
.type = "ENUMQUERY",
.destroy = erds_destroy_cb,
}
Definition at line 249 of file func_enum.c.
struct ast_custom_function enum_result_function [static] |
{
.name = "ENUMRESULT",
.read = enum_result_read,
}
Definition at line 407 of file func_enum.c.
char* synopsis = "Syntax: ENUMLOOKUP(number[,Method-type[,options[,record#[,zone-suffix]]]])\n" [static] |
Definition at line 156 of file func_enum.c.
struct ast_custom_function txtcidname_function [static] |
{
.name = "TXTCIDNAME",
.read = function_txtcidname,
}
Definition at line 448 of file func_enum.c.