diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-01 05:59:35 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-01 05:59:35 +0000 |
| commit | 939a372727b2f27e683a23ac38928b82de550376 (patch) | |
| tree | b339545cb572786d80afe4ea30e892fa6ab3d502 /src/AsyncNameResolver.cc | |
| parent | 3a0f45ec8d7fc9d3ea65033a3a19520e391b11c8 (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.cc | 23 |
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 |
