? diff
? src/or/.eventdns.c.swp
? src/or/.eventdns.h.swp
? src/or/eventdns.c
? src/or/eventdns.h
? src/or/extra-config
? src/or/make-private-tor-network.py
? src/or/n1
? src/or/n2
? src/or/n3
? src/or/n4
? src/or/nodeD0
? src/or/nodeD1
? src/or/nodeN10
? src/or/nodeN11
? src/or/nodeN2
? src/or/nodeN3
? src/or/nodeN4
? src/or/nodeN5
? src/or/nodeN6
? src/or/nodeN7
? src/or/nodeN8
? src/or/nodeN9
? src/or/start-network
? src/or/trace
Index: configure.in
===================================================================
RCS file: /home/or/cvsroot/tor/configure.in,v
retrieving revision 1.230
diff -u -r1.230 configure.in
--- configure.in 24 Aug 2005 02:11:33 -0000 1.230
+++ configure.in 1 Sep 2005 14:38:30 -0000
@@ -22,6 +22,12 @@
AC_ARG_ENABLE(threads,
AC_HELP_STRING(--disable-threads, disable multi-threading support))
+AC_ARG_ENABLE(eventdns,
+ AC_HELP_STRING(--enable-eventdns, use the eventdns library for DNS lookups),
+[if test x$enableval = xyes; then
+ CFLAGS="$CFLAGS -DEVENTDNS -DDNS_USE_OPENSSL_FOR_ID"
+fi])
+
if test x$enable_threads = x; then
case $host in
*-*-netbsd* | *-*-openbsd* )
@@ -67,6 +73,8 @@
AC_SEARCH_LIBS(socket, [socket])
AC_SEARCH_LIBS(gethostbyname, [nsl])
+AC_SEARCH_LIBS(strtok_r, [c],
+CFLAGS="$CFLAGS -DHAVE_STRTOK_R")
if test $enable_threads = "yes"; then
AC_SEARCH_LIBS(pthread_create, [pthread])
Index: src/or/Makefile.am
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/Makefile.am,v
retrieving revision 1.38
diff -u -r1.38 Makefile.am
--- src/or/Makefile.am 3 Nov 2004 01:32:26 -0000 1.38
+++ src/or/Makefile.am 1 Sep 2005 14:38:30 -0000
@@ -10,7 +10,7 @@
cpuworker.c directory.c dirserv.c dns.c hibernate.c main.c \
onion.c relay.c rendcommon.c rendclient.c rendmid.c \
rendservice.c rephist.c router.c routerlist.c routerparse.c \
- tor_main.c
+ tor_main.c eventdns.c
tor_LDADD = ../common/libor.a ../common/libor-crypto.a -lz -lssl -lcrypto
@@ -20,7 +20,7 @@
cpuworker.c directory.c dirserv.c dns.c hibernate.c main.c \
onion.c relay.c rendcommon.c rendclient.c rendmid.c \
rendservice.c rephist.c router.c routerlist.c routerparse.c \
- test.c
+ test.c eventdns.c
test_LDADD = ../common/libor.a ../common/libor-crypto.a -lz -lssl -lcrypto
Index: src/or/dns.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/dns.c,v
retrieving revision 1.165
diff -u -r1.165 dns.c
--- src/or/dns.c 15 Aug 2005 23:46:18 -0000 1.165
+++ src/or/dns.c 1 Sep 2005 14:38:31 -0000
@@ -19,6 +19,9 @@
#include "or.h"
#include "tree.h"
+#ifdef EVENTDNS
+#include "eventdns.h"
+#endif
/** Longest hostname we're willing to resolve. */
#define MAX_ADDRESSLEN 256
@@ -37,12 +40,14 @@
#define DNS_RESOLVE_FAILED_PERMANENT 2
#define DNS_RESOLVE_SUCCEEDED 3
+#ifndef EVENTDNS
+/** When did we last rotate the dnsworkers? */
+static time_t last_rotation_time=0;
/** How many dnsworkers we have running right now. */
static int num_dnsworkers=0;
/** How many of the running dnsworkers have an assigned task right now. */
static int num_dnsworkers_busy=0;
-/** When did we last rotate the dnsworkers? */
-static time_t last_rotation_time=0;
+#endif
/** Linked list of connections waiting for a DNS answer. */
typedef struct pending_connection_t {
@@ -68,12 +73,16 @@
} cached_resolve_t;
static void purge_expired_resolves(uint32_t now);
-static int assign_to_dnsworker(connection_t *exitconn);
static void dns_purge_resolve(cached_resolve_t *resolve);
+#ifndef EVENTDNS
+static int assign_to_dnsworker(connection_t *exitconn);
static void dns_found_answer(char *address, uint32_t addr, char outcome);
static int dnsworker_main(void *data);
static int spawn_dnsworker(void);
static void spawn_enough_dnsworkers(void);
+#else
+static int eventdns_submit(connection_t *exitconn);
+#endif
static void send_resolved_cell(connection_t *conn, uint8_t answer_type);
/** Splay tree of cached_resolve objects. */
@@ -312,9 +321,14 @@
exitconn->state = EXIT_CONN_STATE_RESOLVING;
insert_resolve(resolve);
+#ifndef EVENTDNS
return assign_to_dnsworker(exitconn);
+#else
+ return eventdns_submit(exitconn);
+#endif
}
+#ifndef EVENTDNS
/** Find or spawn a dns worker process to handle resolving
* exitconn-\>address; tell that dns worker to begin resolving.
*/
@@ -353,6 +367,7 @@
return 0;
}
+#endif
/** Remove conn from the list of connections waiting for conn-\>address.
*/
@@ -525,7 +540,11 @@
* DNS_RESOLVE_{FAILED_TRANSIENT|FAILED_PERMANENT|SUCCEEDED}.
*/
static void
-dns_found_answer(char *address, uint32_t addr, char outcome)
+dns_found_answer(char *address, uint32_t addr, char outcome
+#ifdef EVENTDNS
+ , int ttl
+#endif
+ )
{
pending_connection_t *pend;
cached_resolve_t search;
@@ -533,6 +552,10 @@
connection_t *pendconn;
circuit_t *circ;
+#ifndef EVENTDNS
+ static const int ttl = MAX_DNS_ENTRY_AGE;
+#endif
+
strlcpy(search.address, address, sizeof(search.address));
resolve = SPLAY_FIND(cache_tree, &cache_root, &search);
@@ -543,7 +566,7 @@
resolve->state = (outcome == DNS_RESOLVE_SUCCEEDED) ?
CACHE_STATE_VALID : CACHE_STATE_FAILED;
resolve->addr = addr;
- resolve->expire = time(NULL) + MAX_DNS_ENTRY_AGE;
+ resolve->expire = time(NULL) + ttl;
insert_resolve(resolve);
return;
}
@@ -567,6 +590,7 @@
resolve->state = CACHE_STATE_VALID;
else
resolve->state = CACHE_STATE_FAILED;
+ resolve->expire = time(NULL) + ttl;
while (resolve->pending_connections) {
pend = resolve->pending_connections;
@@ -624,6 +648,7 @@
}
/******************************************************************/
+#ifndef EVENTDNS
/*
* Connection between OR and dnsworker
@@ -921,3 +946,41 @@
}
}
+#else // !EVENTDNS
+
+// stubs
+void dnsworkers_rotate() {}
+int connection_dns_finished_flushing(connection_t *conn) { return 0; }
+int connection_dns_reached_eof(connection_t *conn) { return 0; }
+int connection_dns_process_inbuf(connection_t *conn) { return 0; }
+
+// true if we have inited eventdns
+static char have_eventdns_init = 0;
+
+static void
+eventdns_callback(int result, char type, int count, int ttl, void *addresses, void *arg) {
+ char *const query_string = (char *) arg;
+ int outcome;
+ uint32_t addr = 0;
+
+ if (result == DNS_ERR_NONE) outcome = DNS_RESOLVE_SUCCEEDED;
+ else if (result == DNS_ERR_NOTEXIST) outcome = DNS_RESOLVE_FAILED_PERMANENT;
+ else outcome = DNS_RESOLVE_FAILED_TRANSIENT;
+
+ if (result == DNS_ERR_NONE) addr = htonl(*((uint32_t *) addresses));
+
+ dns_found_answer(query_string, addr, outcome, ttl);
+}
+
+static int
+eventdns_submit(connection_t *exitconn) {
+ if (!have_eventdns_init) {
+ eventdns_resolv_conf_parse(DNS_OPTION_NAMESERVERS, "/etc/resolv.conf");
+ have_eventdns_init = 1;
+ }
+ eventdns_resolve(exitconn->address, DNS_QUERY_NO_SEARCH, eventdns_callback, exitconn->address);
+
+ return 0;
+}
+
+#endif