diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-05-16 23:02:55 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-05-16 23:05:09 +0900 |
| commit | 92c518a2ba214fe605b213830fc2ec3fd5d0fe14 (patch) | |
| tree | d4ce67892c3cfd2c92c3078e3d003787213b3726 /src/AsyncNameResolver.cc | |
| parent | 36051cca5e03c6268c62a5eca1f756b14435a29d (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.cc | 33 |
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 |
