summaryrefslogtreecommitdiff
path: root/src/AsyncNameResolverMan.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-03-31 00:57:33 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-03-31 18:02:45 +0900
commitf4a098754429019c356f6480238ff5cf941ed391 (patch)
tree7fa5afe019475d3c2c1e4fe09ffaee9ff36ce6b4 /src/AsyncNameResolverMan.cc
parent56fac58b4d05e1fc97ac37195c7a8cbacb08fb07 (diff)
Check non-loopback (and non-linklocak for IPv6) address is configured
Issue A record query only when non-loopback IPv4 address is configured. Likewise, issue AAA record query only when non-loopback and non-linklocak IPv6 address is configured.
Diffstat (limited to 'src/AsyncNameResolverMan.cc')
-rw-r--r--src/AsyncNameResolverMan.cc22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/AsyncNameResolverMan.cc b/src/AsyncNameResolverMan.cc
index 53f5daac..4e66cce1 100644
--- a/src/AsyncNameResolverMan.cc
+++ b/src/AsyncNameResolverMan.cc
@@ -69,14 +69,16 @@ void AsyncNameResolverMan::startAsync(const std::string& hostname,
Command* command)
{
numResolver_ = 0;
- if(ipv4_) {
- startAsyncFamily(hostname, AF_INET, e, command);
- ++numResolver_;
- }
+ // Set IPv6 resolver first, so that we can push IPv6 address in
+ // front of IPv6 address in getResolvedAddress().
if(ipv6_) {
startAsyncFamily(hostname, AF_INET6, e, command);
++numResolver_;
}
+ if(ipv4_) {
+ startAsyncFamily(hostname, AF_INET, e, command);
+ ++numResolver_;
+ }
A2_LOG_INFO(fmt(MSG_RESOLVING_HOSTNAME, command->getCuid(),
hostname.c_str()));
}
@@ -150,11 +152,13 @@ void AsyncNameResolverMan::disableNameResolverCheck(size_t index,
int AsyncNameResolverMan::getStatus() const
{
+ size_t success = 0;
size_t error = 0;
for(size_t i = 0; i < numResolver_; ++i) {
switch(asyncNameResolver_[i]->getStatus()) {
case AsyncNameResolver::STATUS_SUCCESS:
- return 1;
+ ++success;
+ break;
case AsyncNameResolver::STATUS_ERROR:
++error;
break;
@@ -162,7 +166,13 @@ int AsyncNameResolverMan::getStatus() const
break;
}
}
- return error == numResolver_ ? -1 : 0;
+ if(success == numResolver_) {
+ return 1;
+ } else if(error == numResolver_) {
+ return -1;
+ } else {
+ return 0;
+ }
}
const std::string& AsyncNameResolverMan::getLastError() const