diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-08-11 12:29:55 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-08-11 12:29:55 +0000 |
| commit | f2d4faad083ffb1bdf622090f63283150bd95aeb (patch) | |
| tree | dbcff240417b7879e93958a2fbbf493b83a943bc /src/NameResolver.h | |
| parent | 7ca1b43eddd1aba1c71a38dfb46b5ac5685b43d0 (diff) | |
2006-08-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
To add asynchronous DNS support(libares):
* src/AbstractCommand.h
(setNameResolverCheck): New function.
(disableNameResolverCheck): New function
(resolveHostname): New function.
* src/AbstractCommand.cc
(setNameResolverCheck): New function.
(disableNameResolverCheck): New function
(resolveHostname): New function.
* src/FtpInitiateConnectionCommand.h
(nameResolver): New function.
* src/FtpInitiateConnectionCommand.cc
(Util.h): Included.
(FtpInitiateConnectionCommand): Call disableReadCheckSocket,
disableWriteCheckSocket.
(~FtpInitiateConnectionCommand): Call disableNameResolverCheck.
(executeInternal): Added async DNS support.
* src/HttpInitiateConnectionCommand.h
(nameResolver): New function.
* src/HttpInitiateConnectionCommand.cc
(DlRetryEx.h): Included.
(HttpInitiateConnectionCommand): Call disableReadCheckSocket,
disableWriteCheckSocket.
(~HttpInitiateConnectionCommand): Call disableNameResolverCheck.
(executeInternal): Added async DNS support.
* src/NameResolver.h: New class. Note: #include <ares.h> is
surrounded
by extern "C" declaration.
* src/NameResolver.cc: New class.
* src/Util.h:
(isNumberAndDotsNotation): New function
* src/Util.cc
(isNumberAndDotsNotation): New function.
* src/DownloadEngine.h
(NameResolver.h): Included.
(NameResolverEntry): New class.
(NameResolverEntries): New type definition.
(addNameResolverCheck): New function.
(deleteNameResolverCheck): New function.
* src/DownloadEngine.cc
(run): Initialize cp with 0.
(SetDescriptor::operator()): Added for NameResolverEntry.
(AccumulateActiveUuid::operator()): Added for NameResolverEntry.
(waitData): Check nameResolver entries.
(updateFdSet): Update fds in nameResolver entries.
(addNameResolverCheck): New function.
(deleteNameResolverCheck): new function.
* src/PeerInteractionCommand.cc
(executeInternal): Fixed wrong socket handling.
* src/main.cc
(main): Fixed the initial value of PREF_LOWEST_SPEED_LIMIT
option to 0.
* src/Util.cc
(fileChecksum): Removed the call to ctx.digestReset().
Diffstat (limited to 'src/NameResolver.h')
| -rw-r--r-- | src/NameResolver.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/NameResolver.h b/src/NameResolver.h new file mode 100644 index 00000000..42bb5414 --- /dev/null +++ b/src/NameResolver.h @@ -0,0 +1,102 @@ +/* <!-- copyright */ +/* + * aria2 - a simple utility for downloading files faster + * + * Copyright (C) 2006 Tatsuhiro Tsujikawa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* copyright --> */ +#ifndef _D_NAME_RESOLVER_H_ +#define _D_NAME_RESOLVER_H_ + +#include "common.h" +#include "SharedHandle.h" +#include <netdb.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#ifdef __cplusplus +extern "C" { +#endif +#include <ares.h> +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +class NameResolver { + friend void callback(void* arg, int status, struct hostent* host); + +public: + enum STATUS { + STATUS_READY, + STATUS_QUERYING, + STATUS_SUCCESS, + STATUS_ERROR, + }; +private: + STATUS status; + ares_channel channel; + struct in_addr addr; + string error; +public: + NameResolver(): + status(STATUS_READY) + { + ares_init(&channel); + } + + ~NameResolver() { + ares_destroy(channel); + } + + void resolve(const string& name) { + status = STATUS_QUERYING; + ares_gethostbyname(channel, name.c_str(), AF_INET, callback, this); + } + + string getAddrString() const { + return inet_ntoa(addr); + } + + const struct in_addr& getAddr() const { + return addr; + } + + const string& getError() const { + return error; + } + + STATUS getStatus() const { + return status; + } + + int getFds(fd_set* rfdsPtr, fd_set* wfdsPtr) const { + return ares_fds(channel, rfdsPtr, wfdsPtr); + } + + void process(fd_set* rfdsPtr, fd_set* wfdsPtr) { + ares_process(channel, rfdsPtr, wfdsPtr); + } + + bool operator==(const NameResolver& resolver) { + return this == &resolver; + } +}; + +typedef SharedHandle<NameResolver> NameResolverHandle; + +#endif // _D_NAME_RESOLVER_H_ |
