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_DEFAULT , .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, } |
| 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 __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .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, } [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.