summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/AsyncNameResolverMan.cc34
-rw-r--r--src/AsyncNameResolverMan.h3
-rw-r--r--src/OptionHandlerFactory.cc10
-rw-r--r--src/SocketCore.cc2
-rw-r--r--src/prefs.cc2
-rw-r--r--src/prefs.h2
-rw-r--r--src/usage_text.h7
7 files changed, 50 insertions, 10 deletions
diff --git a/src/AsyncNameResolverMan.cc b/src/AsyncNameResolverMan.cc
index be073561..d20296da 100644
--- a/src/AsyncNameResolverMan.cc
+++ b/src/AsyncNameResolverMan.cc
@@ -49,7 +49,11 @@
namespace aria2 {
AsyncNameResolverMan::AsyncNameResolverMan()
- : numResolver_(0), resolverCheck_(0), ipv4_(true), ipv6_(true)
+ : numResolver_(0),
+ resolverCheck_(0),
+ ipv4_(true),
+ ipv6_(true),
+ allowIpv6Only_(false)
{
}
@@ -167,15 +171,25 @@ int AsyncNameResolverMan::getStatus() const
break;
}
}
- // If we got a IPv4 lookup response, we don't wait for a IPv6 lookup
- // response. This is because DNS servers may drop AAAA queries and we
- // have to wait for a long time before timeout. We don't do the
- // inverse, because, based on today's deployment of DNS servers,
- // almost all of them can respond to A queries just fine.
- if ((success && ipv4Success) || success == numResolver_) {
- return 1;
+ if (allowIpv6Only_ == true) {
+ // The waiting process of IPv4 and IPv6 lookup will eventually timeout
+ // the resolution of IPv6-only domains, so just report success regardless of
+ // which address family the result belongs to in such case.
+ if (success > 0) {
+ return 1;
+ }
+ }
+ else {
+ // If we got a IPv4 lookup response, we don't wait for a IPv6 lookup
+ // response. This is because DNS servers may drop AAAA queries and we
+ // have to wait for a long time before timeout. We don't do the
+ // inverse, because, based on today's deployment of DNS servers,
+ // almost all of them can respond to A queries just fine.
+ if ((success && ipv4Success) || success == numResolver_) {
+ return 1;
+ }
}
- else if (error == numResolver_) {
+ if (error == numResolver_) {
return -1;
}
else {
@@ -222,6 +236,8 @@ void configureAsyncNameResolverMan(AsyncNameResolverMan* asyncNameResolverMan,
if (!net::getIPv6AddrConfigured() || option->getAsBool(PREF_DISABLE_IPV6)) {
asyncNameResolverMan->setIPv6(false);
}
+ asyncNameResolverMan->setAllowIpv6Only(
+ option->getAsBool(PERF_ASYNC_DNS_ALLOW_IPV6ONLY));
}
} // namespace aria2
diff --git a/src/AsyncNameResolverMan.h b/src/AsyncNameResolverMan.h
index 617474ec..1acd3cc6 100644
--- a/src/AsyncNameResolverMan.h
+++ b/src/AsyncNameResolverMan.h
@@ -58,6 +58,8 @@ public:
void setIPv4(bool ipv4) { ipv4_ = ipv4; }
// Enable IPv6 address lookup. default: true
void setIPv6(bool ipv6) { ipv6_ = ipv6; }
+ // Allow resolver returning only ipv6 address. default: false
+ void setAllowIpv6Only(bool allow) { allowIpv6Only_ = allow; }
// Returns true if asynchronous name resolution has been started.
bool started() const;
// Starts asynchronous name resolution.
@@ -92,6 +94,7 @@ private:
int resolverCheck_;
bool ipv4_;
bool ipv6_;
+ bool allowIpv6Only_;
};
void configureAsyncNameResolverMan(AsyncNameResolverMan* asyncNameResolverMan,
diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc
index 6bff4caa..d478888e 100644
--- a/src/OptionHandlerFactory.cc
+++ b/src/OptionHandlerFactory.cc
@@ -255,6 +255,16 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
+ {
+ OptionHandler* op(new BooleanOptionHandler(
+ PERF_ASYNC_DNS_ALLOW_IPV6ONLY, TEXT_ASYNC_DNS_ALLOW_IPV6ONLY,
+ A2_V_FALSE, OptionHandler::OPT_ARG));
+ op->addTag(TAG_ADVANCED);
+ op->setInitialOption(true);
+ op->setChangeGlobalOption(true);
+ op->setChangeOptionForReserved(true);
+ handlers.push_back(op);
+ }
#endif // ENABLE_ASYNC_DNS
{
OptionHandler* op(new BooleanOptionHandler(PREF_ENABLE_COLOR,
diff --git a/src/SocketCore.cc b/src/SocketCore.cc
index 8907eb4f..b82ba0b3 100644
--- a/src/SocketCore.cc
+++ b/src/SocketCore.cc
@@ -1699,7 +1699,7 @@ void checkAddrconfig()
found = true;
if (!hasGlobalIpv6Addr &&
inetNtop(AF_INET6, &ad.in6.sin6_addr, globalIpv6Addr,
- sizeof(globalIpv6Addr) == 0)) {
+ sizeof(globalIpv6Addr)) == 0) {
hasGlobalIpv6Addr = true;
}
}
diff --git a/src/prefs.cc b/src/prefs.cc
index fe982685..d6db87d2 100644
--- a/src/prefs.cc
+++ b/src/prefs.cc
@@ -322,6 +322,8 @@ PrefPtr PREF_CONDITIONAL_GET = makePref("conditional-get");
PrefPtr PREF_SELECT_LEAST_USED_HOST = makePref("select-least-used-host");
// value: true | false
PrefPtr PREF_ENABLE_ASYNC_DNS6 = makePref("enable-async-dns6");
+// values: true | false
+PrefPtr PERF_ASYNC_DNS_ALLOW_IPV6ONLY = makePref("async-dns-allow-ipv6only");
// value: 1*digit
PrefPtr PREF_MAX_DOWNLOAD_RESULT = makePref("max-download-result");
// value: 1*digit
diff --git a/src/prefs.h b/src/prefs.h
index 9719b3be..0761c10d 100644
--- a/src/prefs.h
+++ b/src/prefs.h
@@ -275,6 +275,8 @@ extern PrefPtr PREF_CONDITIONAL_GET;
extern PrefPtr PREF_SELECT_LEAST_USED_HOST;
// value: true | false
extern PrefPtr PREF_ENABLE_ASYNC_DNS6;
+// values: true | false
+extern PrefPtr PERF_ASYNC_DNS_ALLOW_IPV6ONLY;
// value: 1*digit
extern PrefPtr PREF_MAX_DOWNLOAD_RESULT;
// value: 1*digit
diff --git a/src/usage_text.h b/src/usage_text.h
index ebf67e3d..7374d734 100644
--- a/src/usage_text.h
+++ b/src/usage_text.h
@@ -764,6 +764,13 @@
_(" --enable-async-dns6[=true|false] Enable IPv6 name resolution in asynchronous\n" \
" DNS resolver. This option will be ignored when\n" \
" --async-dns=false.")
+#define TEXT_ASYNC_DNS_ALLOW_IPV6ONLY \
+ _(" --async-dns-allow-ipv6only[=true|false]\n" \
+ " When using asynchronous DNS resolver, aria2 will\n" \
+ " wait until at least one IPv4 resolution succeeds\n" \
+ " by default, which will result in the timeout of\n" \
+ " the resolution of IPv6-only domains. Turn this on\n" \
+ " to avoid such problem.")
#define TEXT_ENABLE_DHT6 \
_(" --enable-dht6[=true|false] Enable IPv6 DHT functionality.\n" \
" Use --dht-listen-port option to specify port\n" \