/* */ #include "NameResolver.h" #include "DlAbortEx.h" #include "message.h" #include "StringFormat.h" #include namespace aria2 { #ifdef ENABLE_ASYNC_DNS #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 { NameResolver* resolverPtr = (NameResolver*)arg; #ifdef HAVE_LIBARES // This block is required since the assertion in ares_strerror fails // if status = ARES_EDESTRUCTION is passed to ares_strerror as 1st argument. // This does not happen in c-ares. if(status == ARES_EDESTRUCTION) { // we simply return in this case. return; } #endif if(status != ARES_SUCCESS) { #ifdef HAVE_LIBCARES resolverPtr->error = ares_strerror(status); #else resolverPtr->error = ares_strerror(status, 0); #endif // HAVE_LIBCARES resolverPtr->status = NameResolver::STATUS_ERROR; return; } memcpy(&resolverPtr->addr, *host->h_addr_list, sizeof(struct in_addr)); resolverPtr->status = NameResolver::STATUS_SUCCESS; } void NameResolver::resolve(const std::string& name) { status = STATUS_QUERYING; ares_gethostbyname(channel, name.c_str(), AF_INET, callback, this); } std::string NameResolver::getAddrString() const { return inet_ntoa(addr); } void NameResolver::setAddr(const std::string& addrString) { inet_aton(addrString.c_str(), &addr); } void NameResolver::reset() { status = STATUS_READY; ares_destroy(channel); // TODO evaluate return value ares_init(&channel); } #else // ENABLE_ASYNC_DNS void NameResolver::resolve(const std::string& hostname) { memset(&_addr, 0, sizeof(in_addr)); struct addrinfo ai; memset((char*)&ai, 0, sizeof(ai)); ai.ai_flags = 0; ai.ai_family = PF_INET; ai.ai_socktype = SOCK_STREAM; ai.ai_protocol = 0; struct addrinfo* res; int ec; if((ec = getaddrinfo(hostname.c_str(), 0, &ai, &res)) != 0) { throw DlAbortEx(StringFormat(EX_RESOLVE_HOSTNAME, hostname.c_str(), gai_strerror(ec)).str()); } _addr = ((struct sockaddr_in*)res->ai_addr)->sin_addr; freeaddrinfo(res); } std::string NameResolver::getAddrString() const { return inet_ntoa(_addr); } void NameResolver::setAddr(const std::string& addrString) { inet_aton(addrString.c_str(), &_addr); } void NameResolver::reset() {} #endif // ENABLE_ASYNC_DNS } // namespace aria2