summaryrefslogtreecommitdiff
path: root/src/NameResolver.h
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-08-11 12:29:55 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-08-11 12:29:55 +0000
commitf2d4faad083ffb1bdf622090f63283150bd95aeb (patch)
treedbcff240417b7879e93958a2fbbf493b83a943bc /src/NameResolver.h
parent7ca1b43eddd1aba1c71a38dfb46b5ac5685b43d0 (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.h102
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_