/* */ #include "AsyncNameResolver.h" #include "util.h" #include "A2STR.h" #include namespace aria2 { #ifdef HAVE_LIBCARES1_5 void callback(void* arg, int status, int timeouts, struct hostent* host) #else void callback(void* arg, int status, struct hostent* host) #endif // HAVE_LIBCARES1_5 { AsyncNameResolver* resolverPtr = reinterpret_cast(arg); if(status != ARES_SUCCESS) { #ifdef HAVE_LIBCARES resolverPtr->error = ares_strerror(status); #else resolverPtr->error = ares_strerror(status, 0); #endif // HAVE_LIBCARES resolverPtr->status = AsyncNameResolver::STATUS_ERROR; 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)); } resolverPtr->status = AsyncNameResolver::STATUS_SUCCESS; } AsyncNameResolver::AsyncNameResolver(): status(STATUS_READY) { // TODO evaluate return value ares_init(&channel); } AsyncNameResolver::~AsyncNameResolver() { ares_destroy(channel); } void AsyncNameResolver::resolve(const std::string& name) { _hostname = name; status = STATUS_QUERYING; ares_gethostbyname(channel, name.c_str(), AF_INET, callback, this); } int AsyncNameResolver::getFds(fd_set* rfdsPtr, fd_set* wfdsPtr) const { return ares_fds(channel, rfdsPtr, wfdsPtr); } void AsyncNameResolver::process(fd_set* rfdsPtr, fd_set* wfdsPtr) { ares_process(channel, rfdsPtr, wfdsPtr); } #ifdef HAVE_LIBCARES int AsyncNameResolver::getsock(sock_t* sockets) const { // TODO cast to int* might cause problem with Windows SOCKET? return ares_getsock(channel, reinterpret_cast(sockets), ARES_GETSOCK_MAXNUM); } void AsyncNameResolver::process(ares_socket_t readfd, ares_socket_t writefd) { ares_process_fd(channel, readfd, writefd); } #endif // HAVE_LIBCARES bool AsyncNameResolver::operator==(const AsyncNameResolver& resolver) const { return this == &resolver; } void AsyncNameResolver::reset() { _hostname = A2STR::NIL; _resolvedAddresses.clear(); status = STATUS_READY; ares_destroy(channel); // TODO evaluate return value ares_init(&channel); } } // namespace aria2