Author: file
Date: Wed Mar  4 11:35:33 2015
New Revision: 432448

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432448
Log:
Implement resolver registration/unregistration.

Modified:
    team/group/dns/include/asterisk/dns_resolver.h
    team/group/dns/main/dns_core.c

Modified: team/group/dns/include/asterisk/dns_resolver.h
URL: 
http://svnview.digium.com/svn/asterisk/team/group/dns/include/asterisk/dns_resolver.h?view=diff&rev=432448&r1=432447&r2=432448
==============================================================================
--- team/group/dns/include/asterisk/dns_resolver.h (original)
+++ team/group/dns/include/asterisk/dns_resolver.h Wed Mar  4 11:35:33 2015
@@ -38,6 +38,8 @@
     int (*resolve)(struct ast_dns_query *query);
     /*! \brief Cancel resolution of a DNS query */
     int (*cancel)(struct ast_dns_query *query);
+    /*! \brief Linked list information */
+    AST_RWLIST_ENTRY(ast_dns_resolver) next;
 };
 
 /*!
@@ -103,17 +105,14 @@
  * \retval 0 success
  * \retval -1 failure
  */
-int ast_dns_resolver_register(const struct ast_dns_resolver *resolver);
+int ast_dns_resolver_register(struct ast_dns_resolver *resolver);
 
 /*!
  * \brief Unregister a DNS resolver
  *
  * \param resolver A DNS resolver implementation
- *
- * \retval 0 success
- * \retval -1 failure
  */
-int ast_dns_resolver_unregister(const struct ast_dns_resolver *resolver);
+void ast_dns_resolver_unregister(struct ast_dns_resolver *resolver);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }

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=432448&r1=432447&r2=432448
==============================================================================
--- team/group/dns/main/dns_core.c (original)
+++ team/group/dns/main/dns_core.c Wed Mar  4 11:35:33 2015
@@ -31,12 +31,15 @@
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
+#include "asterisk/linkedlists.h"
 #include "asterisk/dns_core.h"
 #include "asterisk/dns_naptr.h"
 #include "asterisk/dns_srv.h"
 #include "asterisk/dns_tlsa.h"
 #include "asterisk/dns_resolver.h"
 
+AST_RWLIST_HEAD_STATIC(resolvers, ast_dns_resolver);
+
 const char *ast_dns_query_get_name(const struct ast_dns_query *query)
 {
        return NULL;
@@ -234,12 +237,54 @@
 {
 }
 
-int ast_dns_resolver_register(const struct ast_dns_resolver *resolver)
-{
-       return -1;
-}
-
-int ast_dns_resolver_unregister(const struct ast_dns_resolver *resolver)
-{
-       return -1;
+int ast_dns_resolver_register(struct ast_dns_resolver *resolver)
+{
+       struct ast_dns_resolver *iter;
+       int inserted = 0;
+
+       AST_RWLIST_WRLOCK(&resolvers);
+
+       AST_LIST_TRAVERSE(&resolvers, iter, next) {
+               if (!strcmp(iter->name, resolver->name)) {
+                       ast_log(LOG_ERROR, "A DNS resolver with the name '%s' 
is already registered\n", resolver->name);
+                       AST_RWLIST_UNLOCK(&resolvers);
+                       return -1;
+               }
+       }
+
+       AST_RWLIST_TRAVERSE_SAFE_BEGIN(&resolvers, iter, next) {
+               if (iter->priority > resolver->priority) {
+                       AST_RWLIST_INSERT_BEFORE_CURRENT(resolver, next);
+                       inserted = 1;
+                       break;
+               }
+       }
+       AST_RWLIST_TRAVERSE_SAFE_END;
+
+       if (!inserted) {
+               AST_RWLIST_INSERT_TAIL(&resolvers, resolver, next);
+       }
+
+       AST_RWLIST_UNLOCK(&resolvers);
+
+       ast_verb(2, "Registered DNS resolver '%s' with priority '%d'\n", 
resolver->name, resolver->priority);
+
+       return 0;
+}
+
+void ast_dns_resolver_unregister(struct ast_dns_resolver *resolver)
+{
+       struct ast_dns_resolver *iter;
+
+       AST_RWLIST_WRLOCK(&resolvers);
+       AST_RWLIST_TRAVERSE_SAFE_BEGIN(&resolvers, iter, next) {
+               if (resolver == iter) {
+                       AST_RWLIST_REMOVE_CURRENT(next);
+                       break;
+               }
+       }
+       AST_RWLIST_TRAVERSE_SAFE_END;
+       AST_RWLIST_UNLOCK(&resolvers);
+
+       ast_verb(2, "Unregistered DNS resolver '%s'\n", resolver->name);
 }


-- 
_____________________________________________________________________
-- 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