Author: file
Date: Wed Mar  4 12:12:24 2015
New Revision: 432450

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432450
Log:
Implement ast_dns_resolve_async and ast_dns_resolve_cancel.

Modified:
    team/group/dns/main/dns_core.c

Modified: team/group/dns/main/dns_core.c
URL: 
http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_core.c?view=diff&rev=432450&r1=432449&r2=432450
==============================================================================
--- team/group/dns/main/dns_core.c (original)
+++ team/group/dns/main/dns_core.c Wed Mar  4 12:12:24 2015
@@ -33,6 +33,7 @@
 
 #include "asterisk/linkedlists.h"
 #include "asterisk/vector.h"
+#include "asterisk/astobj2.h"
 #include "asterisk/dns_core.h"
 #include "asterisk/dns_naptr.h"
 #include "asterisk/dns_srv.h"
@@ -109,27 +110,35 @@
        ast_dns_resolve_callback callback;
        /*! \brief User-specific data */
        void *user_data;
+       /*! \brief The resolver in use for this query */
+       struct ast_dns_resolver *resolver;
        /*! \brief Resolver-specific data */
        void *resolver_data;
        /*! \brief Result of the DNS query */
        struct ast_dns_result *result;
        /*! \brief Timer for recurring resolution */
        int timer;
+       /*! \brief Resource record type */
+       int rr_type;
+       /*! \brief Resource record class */
+       int rr_class;
+       /*! \brief The name of what is being resolved */
+       char name[0];
 };
 
 const char *ast_dns_query_get_name(const struct ast_dns_query *query)
 {
-       return NULL;
+       return query->name;
 }
 
 int ast_dns_query_get_rr_type(const struct ast_dns_query *query)
 {
-       return 0;
+       return query->rr_type;
 }
 
 int ast_dns_query_get_rr_class(const struct ast_dns_query *query)
 {
-       return 0;
+       return query->rr_class;
 }
 
 int ast_dns_query_get_rcode(const struct ast_dns_query *query)
@@ -201,9 +210,47 @@
        return AST_LIST_NEXT(record, list);
 }
 
+/*! \brief Destructor for a DNS query */
+static void dns_query_destroy(void *data)
+{
+       struct ast_dns_query *query = data;
+
+       ao2_cleanup(query->user_data);
+}
+
 struct ast_dns_query *ast_dns_resolve_async(const char *name, int rr_type, int 
rr_class, ast_dns_resolve_callback callback, void *data)
 {
-       return NULL;
+       struct ast_dns_query *query;
+
+       query = ao2_alloc_options(sizeof(*query) + strlen(name) + 1, 
dns_query_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
+       if (!query) {
+               return NULL;
+       }
+
+       query->callback = callback;
+       query->rr_type = rr_type;
+       query->rr_class = rr_class;
+       strcpy(query->name, name); /* SAFE */
+
+       AST_RWLIST_RDLOCK(&resolvers);
+       query->resolver = AST_RWLIST_FIRST(&resolvers);
+       AST_RWLIST_UNLOCK(&resolvers);
+
+       if (!query->resolver) {
+               ast_log(LOG_ERROR, "Attempted to do a DNS query for '%s' of 
class '%d' and type '%d' but no resolver is available\n",
+                       name, rr_class, rr_type);
+               ao2_ref(query, -1);
+               return NULL;
+       }
+
+       if (query->resolver->resolve(query)) {
+               ast_log(LOG_ERROR, "Resolver '%s' returned an error when 
resolving '%s' of class '%d' and type '%d'\n",
+                       query->resolver->name, name, rr_class, rr_type);
+               ao2_ref(query, -1);
+               return NULL;
+       }
+
+       return query;
 }
 
 struct ast_dns_query *ast_dns_resolve_async_recurring(const char *name, int 
rr_type, int rr_class, ast_dns_resolve_callback callback, void *data)
@@ -213,7 +260,7 @@
 
 int ast_dns_resolve_cancel(struct ast_dns_query *query)
 {
-       return 0;
+       return query->resolver->cancel(query);
 }
 
 int ast_dns_resolve(const char *name, int rr_type, int rr_class, struct 
ast_dns_result **result)


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to