Allow ENUM query functions to report lookup errors
authorKinsey Moore <kmoore@digium.com>
Tue, 9 Aug 2011 17:08:33 +0000 (17:08 +0000)
committerKinsey Moore <kmoore@digium.com>
Tue, 9 Aug 2011 17:08:33 +0000 (17:08 +0000)
The ENUM dialplan functions do not report DNS query errors properly. It is
useful to differentiate between failed query (e.g. non-existent domain) vs. no
data records of the appropriate type. This is required to make overlapped
dialing work.

(closes issue ASTERISK-13769)
Review: https://reviewboard.asterisk.org/r/1355/
Patch-by: Timo Teras

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@331201 65c4cc65-6c06-0410-ace0-fbb531ad65f3

UPGRADE.txt
funcs/func_enum.c
main/enum.c

index 2a56216..bd6a63e 100644 (file)
 
 From 10 to 12:
 
-* No significant changes as of yet.
+func_enum:
+ - ENUM query functions now return a count of -1 on lookup error to
+   differentiate between a failed query and a successful query with 0 results
+   matching the specified type.
 
 From 1.8 to 10:
 
index cc4d47a..4b5fb9f 100644 (file)
@@ -82,7 +82,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                                <para>The number of the result that you want to retrieve.</para>
                                <para>Results start at <literal>1</literal>. If this argument is specified
                                as <literal>getnum</literal>, then it will return the total number of results 
-                               that are available.</para>
+                               that are available or -1 on error.</para>
                        </parameter>
                </syntax>
                <description>
@@ -105,7 +105,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                                        <option name="c">
                                                <para>Returns an integer count of the number of NAPTRs of a certain RR type.</para>
                                                <para>Combination of <literal>c</literal> and Method-type of <literal>ALL</literal> will
-                                               return a count of all NAPTRs for the record.</para>
+                                               return a count of all NAPTRs for the record or -1 on error.</para>
                                        </option>
                                        <option name="u">
                                                <para>Returns the full URI and does not strip off the URI-scheme.</para>
@@ -363,7 +363,7 @@ static int enum_result_read(struct ast_channel *chan, const char *cmd, char *dat
        erds = datastore->data;
 
        if (!strcasecmp(args.resultnum, "getnum")) {
-               snprintf(buf, len, "%u", erds->context->naptr_rrs_count);
+               snprintf(buf, len, "%d", erds->context->naptr_rrs_count);
                res = 0;
                goto finish;
        }
index 92f185c..aace1fc 100644 (file)
@@ -856,6 +856,7 @@ int ast_get_enum(struct ast_channel *chan, const char *number, char *dst, int ds
 
        if (ret < 0) {
                ast_debug(1, "No such number found: %s (%s)\n", tmp, strerror(errno));
+               context->naptr_rrs_count = -1;
                strcpy(dst, "0");
                ret = 0;
        }
@@ -896,7 +897,7 @@ int ast_get_enum(struct ast_channel *chan, const char *number, char *dst, int ds
        } else if (!(context->options & ENUMLOOKUP_OPTIONS_COUNT)) {
                context->dst[0] = 0;
        } else if ((context->options & ENUMLOOKUP_OPTIONS_COUNT)) {
-               snprintf(context->dst, context->dstlen, "%d", context->count);
+               snprintf(context->dst, context->dstlen, "%d", context->naptr_rrs_count + context->count);
        }
 
        if (chan) {