From 92c518a2ba214fe605b213830fc2ec3fd5d0fe14 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 16 May 2012 23:02:55 +0900 Subject: Moved parseAsyncDNSServers() to AsyncNameResolver.cc and refactored. The parseAsyncDNSServers() now uses net::getBinAddr() internally, which makes the function simpler. Also added unit test. --- src/AsyncNameResolver.cc | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/AsyncNameResolver.cc') diff --git a/src/AsyncNameResolver.cc b/src/AsyncNameResolver.cc index 4cba7a25..59021509 100644 --- a/src/AsyncNameResolver.cc +++ b/src/AsyncNameResolver.cc @@ -39,6 +39,7 @@ #include "A2STR.h" #include "LogFactory.h" #include "SocketCore.h" +#include "util.h" namespace aria2 { @@ -137,4 +138,36 @@ void AsyncNameResolver::reset() ares_init(&channel_); } +#ifdef HAVE_ARES_ADDR_NODE + +ares_addr_node* parseAsyncDNSServers(const std::string& serversOpt) +{ + std::vector servers; + util::split(serversOpt.begin(), serversOpt.end(), + std::back_inserter(servers), + ',', + true /* doStrip */); + ares_addr_node root; + root.next = 0; + ares_addr_node* tail = &root; + ares_addr_node* node = 0; + for(std::vector::const_iterator i = servers.begin(), + eoi = servers.end(); i != eoi; ++i) { + if(node == 0) { + node = new ares_addr_node(); + } + size_t len = net::getBinAddr(&node->addr, (*i).c_str()); + if(len != 0) { + node->next = 0; + node->family = (len == 4 ? AF_INET : AF_INET6); + tail->next = node; + tail = node; + node = 0; + } + } + return root.next; +} + +#endif // HAVE_ARES_ADDR_NODE + } // namespace aria2 -- cgit