summaryrefslogtreecommitdiff
path: root/src/AsyncNameResolver.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-05-16 23:02:55 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-05-16 23:05:09 +0900
commit92c518a2ba214fe605b213830fc2ec3fd5d0fe14 (patch)
treed4ce67892c3cfd2c92c3078e3d003787213b3726 /src/AsyncNameResolver.cc
parent36051cca5e03c6268c62a5eca1f756b14435a29d (diff)
Moved parseAsyncDNSServers() to AsyncNameResolver.cc and refactored.
The parseAsyncDNSServers() now uses net::getBinAddr() internally, which makes the function simpler. Also added unit test.
Diffstat (limited to 'src/AsyncNameResolver.cc')
-rw-r--r--src/AsyncNameResolver.cc33
1 files changed, 33 insertions, 0 deletions
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<std::string> 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<std::string>::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