summaryrefslogtreecommitdiff
path: root/src/AsyncNameResolver.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-01 05:59:35 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-01 05:59:35 +0000
commit939a372727b2f27e683a23ac38928b82de550376 (patch)
treeb339545cb572786d80afe4ea30e892fa6ab3d502 /src/AsyncNameResolver.cc
parent3a0f45ec8d7fc9d3ea65033a3a19520e391b11c8 (diff)
2010-08-01 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added --enable-async-dns6 option. This option enables IPv6 name resolution in asynchronous DNS resolver. This option will be ignored when --async-dns=false. * doc/aria2c.1.txt * src/AbstractCommand.cc * src/AsyncNameResolver.cc * src/AsyncNameResolver.h * src/DHTEntryPointNameResolveCommand.cc * src/OptionHandlerFactory.cc * src/download_helper.cc * src/prefs.cc * src/prefs.h * src/usage_text.h
Diffstat (limited to 'src/AsyncNameResolver.cc')
-rw-r--r--src/AsyncNameResolver.cc23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/AsyncNameResolver.cc b/src/AsyncNameResolver.cc
index ae904e7b..bf6a34d1 100644
--- a/src/AsyncNameResolver.cc
+++ b/src/AsyncNameResolver.cc
@@ -53,15 +53,24 @@ void callback(void* arg, int status, int timeouts, struct hostent* host)
return;
}
for(char** ap = host->h_addr_list; *ap; ++ap) {
- struct in_addr addr;
- memcpy(&addr, *ap, sizeof(in_addr));
- resolverPtr->resolvedAddresses_.push_back(inet_ntoa(addr));
+ char addrstring[INET6_ADDRSTRLEN];
+ const char* dst =
+ inet_ntop(host->h_addrtype, *ap, addrstring, sizeof(addrstring));
+ if(dst) {
+ resolverPtr->resolvedAddresses_.push_back(dst);
+ }
+ }
+ if(resolverPtr->resolvedAddresses_.empty()) {
+ resolverPtr->error_ = "inet_ntop failed";
+ resolverPtr->status_ = AsyncNameResolver::STATUS_ERROR;
+ } else {
+ resolverPtr->status_ = AsyncNameResolver::STATUS_SUCCESS;
}
- resolverPtr->status_ = AsyncNameResolver::STATUS_SUCCESS;
}
-AsyncNameResolver::AsyncNameResolver():
- status_(STATUS_READY)
+AsyncNameResolver::AsyncNameResolver(int family):
+ status_(STATUS_READY),
+ family_(family)
{
// TODO evaluate return value
ares_init(&channel_);
@@ -76,7 +85,7 @@ void AsyncNameResolver::resolve(const std::string& name)
{
hostname_ = name;
status_ = STATUS_QUERYING;
- ares_gethostbyname(channel_, name.c_str(), AF_INET, callback, this);
+ ares_gethostbyname(channel_, name.c_str(), family_, callback, this);
}
int AsyncNameResolver::getFds(fd_set* rfdsPtr, fd_set* wfdsPtr) const