|
|
@ -64,8 +64,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|
|
|
#define T_TXT 16
|
|
|
|
#define T_TXT 16
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/* The IETF Enum standard root, managed by the ITU */
|
|
|
|
#define TOPLEV "e164.arpa." /*!< The IETF Enum standard root, managed by the ITU */
|
|
|
|
#define TOPLEV "e164.arpa."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Linked list from config file */
|
|
|
|
/* Linked list from config file */
|
|
|
|
static struct enum_search {
|
|
|
|
static struct enum_search {
|
|
|
@ -416,8 +415,8 @@ int ast_get_enum(struct ast_channel *chan, const char *number, char *dst, int ds
|
|
|
|
context.naptr_rrs = NULL;
|
|
|
|
context.naptr_rrs = NULL;
|
|
|
|
context.naptr_rrs_count = 0;
|
|
|
|
context.naptr_rrs_count = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (options != NULL){
|
|
|
|
if (options != NULL) {
|
|
|
|
if (*options == 'c'){
|
|
|
|
if (*options == 'c') {
|
|
|
|
context.options = ENUMLOOKUP_OPTIONS_COUNT;
|
|
|
|
context.options = ENUMLOOKUP_OPTIONS_COUNT;
|
|
|
|
context.position = 0;
|
|
|
|
context.position = 0;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -495,43 +494,42 @@ int ast_get_enum(struct ast_channel *chan, const char *number, char *dst, int ds
|
|
|
|
ret = 0;
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (context.naptr_rrs_count >= context.position && ! (context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
|
|
|
|
if (context.naptr_rrs_count >= context.position && ! (context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
|
|
|
|
/* sort array by NAPTR order/preference */
|
|
|
|
/* sort array by NAPTR order/preference */
|
|
|
|
for (k=0; k<context.naptr_rrs_count; k++) {
|
|
|
|
for (k=0; k<context.naptr_rrs_count; k++) {
|
|
|
|
for (i=0; i<context.naptr_rrs_count; i++) {
|
|
|
|
for (i=0; i<context.naptr_rrs_count; i++) {
|
|
|
|
/* use order first and then preference to compare */
|
|
|
|
/* use order first and then preference to compare */
|
|
|
|
if ((ntohs(context.naptr_rrs[k].naptr.order) < ntohs(context.naptr_rrs[i].naptr.order)
|
|
|
|
if ((ntohs(context.naptr_rrs[k].naptr.order) < ntohs(context.naptr_rrs[i].naptr.order)
|
|
|
|
&& context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
|
|
|
|
&& context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
|
|
|
|
|| (ntohs(context.naptr_rrs[k].naptr.order) > ntohs(context.naptr_rrs[i].naptr.order)
|
|
|
|
|| (ntohs(context.naptr_rrs[k].naptr.order) > ntohs(context.naptr_rrs[i].naptr.order)
|
|
|
|
&& context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
|
|
|
|
&& context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
|
|
|
|
z = context.naptr_rrs[k].sort_pos;
|
|
|
|
z = context.naptr_rrs[k].sort_pos;
|
|
|
|
context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
|
|
|
|
context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
|
|
|
|
context.naptr_rrs[i].sort_pos = z;
|
|
|
|
context.naptr_rrs[i].sort_pos = z;
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ntohs(context.naptr_rrs[k].naptr.order) == ntohs(context.naptr_rrs[i].naptr.order)) {
|
|
|
|
if (ntohs(context.naptr_rrs[k].naptr.order) == ntohs(context.naptr_rrs[i].naptr.order)) {
|
|
|
|
if ((ntohs(context.naptr_rrs[k].naptr.pref) < ntohs(context.naptr_rrs[i].naptr.pref)
|
|
|
|
if ((ntohs(context.naptr_rrs[k].naptr.pref) < ntohs(context.naptr_rrs[i].naptr.pref)
|
|
|
|
&& context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
|
|
|
|
&& context.naptr_rrs[k].sort_pos > context.naptr_rrs[i].sort_pos)
|
|
|
|
|| (ntohs(context.naptr_rrs[k].naptr.pref) > ntohs(context.naptr_rrs[i].naptr.pref)
|
|
|
|
|| (ntohs(context.naptr_rrs[k].naptr.pref) > ntohs(context.naptr_rrs[i].naptr.pref)
|
|
|
|
&& context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
|
|
|
|
&& context.naptr_rrs[k].sort_pos < context.naptr_rrs[i].sort_pos)){
|
|
|
|
z = context.naptr_rrs[k].sort_pos;
|
|
|
|
z = context.naptr_rrs[k].sort_pos;
|
|
|
|
context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
|
|
|
|
context.naptr_rrs[k].sort_pos = context.naptr_rrs[i].sort_pos;
|
|
|
|
context.naptr_rrs[i].sort_pos = z;
|
|
|
|
context.naptr_rrs[i].sort_pos = z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (k=0; k<context.naptr_rrs_count; k++) {
|
|
|
|
for (k=0; k<context.naptr_rrs_count; k++) {
|
|
|
|
if (context.naptr_rrs[k].sort_pos == context.position-1) {
|
|
|
|
if (context.naptr_rrs[k].sort_pos == context.position-1) {
|
|
|
|
ast_copy_string(context.dst, context.naptr_rrs[k].result, dstlen);
|
|
|
|
ast_copy_string(context.dst, context.naptr_rrs[k].result, dstlen);
|
|
|
|
ast_copy_string(context.tech, context.naptr_rrs[k].tech, techlen);
|
|
|
|
ast_copy_string(context.tech, context.naptr_rrs[k].tech, techlen);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (!(context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
|
|
|
|
} else if (!(context.options & ENUMLOOKUP_OPTIONS_COUNT)) {
|
|
|
|
context.dst[0] = 0;
|
|
|
|
context.dst[0] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (chan)
|
|
|
|
if (chan)
|
|
|
|
ret |= ast_autoservice_stop(chan);
|
|
|
|
ret |= ast_autoservice_stop(chan);
|
|
|
|
|
|
|
|
|
|
|
@ -600,7 +598,8 @@ int ast_get_txt(struct ast_channel *chan, const char *number, char *dst, int dst
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ret < 0) {
|
|
|
|
if (ret < 0) {
|
|
|
|
ast_log(LOG_DEBUG, "No such number found: %s (%s)\n", tmp, strerror(errno));
|
|
|
|
if (option_debug > 1)
|
|
|
|
|
|
|
|
ast_log(LOG_DEBUG, "No such number found in ENUM: %s (%s)\n", tmp, strerror(errno));
|
|
|
|
ret = 0;
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (chan)
|
|
|
|
if (chan)
|
|
|
@ -608,7 +607,7 @@ int ast_get_txt(struct ast_channel *chan, const char *number, char *dst, int dst
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*! \brief Add enum tree to linked list ---*/
|
|
|
|
/*! \brief Add enum tree to linked list */
|
|
|
|
static struct enum_search *enum_newtoplev(char *s)
|
|
|
|
static struct enum_search *enum_newtoplev(char *s)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct enum_search *tmp;
|
|
|
|
struct enum_search *tmp;
|
|
|
|