? 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