[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r5073 - in GNUnet: . m4 src/server src/transports src/util/
From: |
gnunet |
Subject: |
[GNUnet-SVN] r5073 - in GNUnet: . m4 src/server src/transports src/util/network |
Date: |
Fri, 15 Jun 2007 21:42:51 -0600 (MDT) |
Author: grothoff
Date: 2007-06-15 21:42:49 -0600 (Fri, 15 Jun 2007)
New Revision: 5073
Modified:
GNUnet/README.debian
GNUnet/configure.ac
GNUnet/m4/Makefile.in
GNUnet/src/server/gnunet-peer-info.c
GNUnet/src/transports/udp.c
GNUnet/src/util/network/Makefile.am
GNUnet/src/util/network/dns.c
Log:
bugfixes
Modified: GNUnet/README.debian
===================================================================
--- GNUnet/README.debian 2007-06-16 01:03:49 UTC (rev 5072)
+++ GNUnet/README.debian 2007-06-16 03:42:49 UTC (rev 5073)
@@ -16,6 +16,7 @@
GNUnet library dependencies:
+libadns1-dev
libgcrypt11-dev
libgmp3-dev
libltdl3-dev
Modified: GNUnet/configure.ac
===================================================================
--- GNUnet/configure.ac 2007-06-16 01:03:49 UTC (rev 5072)
+++ GNUnet/configure.ac 2007-06-16 03:42:49 UTC (rev 5073)
@@ -444,6 +444,41 @@
AM_CONDITIONAL(HAVE_MHD, test x$lmhd = x1)
AC_DEFINE_UNQUOTED([HAVE_MHD], $lmhd, [We have libmicrohttpd])
+
+
+# GNU adns
+adns=0
+AC_CHECK_LIB([adns],[adns_init])
+AC_MSG_CHECKING([for GNU adns])
+AC_ARG_WITH(adns,
+ [ --with-adns=PFX Base of GNU adns installation],
+ [AC_MSG_RESULT([$with_adns])
+ case $with_adns in
+ no)
+ ;;
+ yes)
+ AC_CHECK_HEADERS(adns.h,
+ AC_CHECK_LIB([adns], [adns_init],
+ adns=1))
+ ;;
+ *)
+ LDFLAGS="-L$with_adns/lib $LDFLAGS"
+ CPPFLAGS="-I$with_adns/include $CPPFLAGS"
+ AC_CHECK_HEADERS(adns.h,
+ AC_CHECK_LIB([adns], [adns_init],
+ EXT_LIB_PATH="-L$with_adns/lib $EXT_LIB_PATH"
+ adns=1))
+ ;;
+ esac
+ ],
+ [AC_MSG_RESULT([--with-adns not specified])
+ AC_CHECK_HEADERS(adns.h,
+ AC_CHECK_LIB([adns], [adns_init],
+ adns=1))])
+
+AM_CONDITIONAL(HAVE_ADNS, test x$adns = x1)
+AC_DEFINE_UNQUOTED([HAVE_ADNS], $adns, [We have GNU adns])
+
# check for gtk >= 2.6.0
AC_MSG_CHECKING(for gtk)
AM_PATH_GTK_2_0(2.6.0,without_gtk=false,without_gtk=true)
@@ -680,3 +715,9 @@
AC_MSG_NOTICE([WARNING: Guile not found, gnunet-setup will not be installed.])
fi
+
+if test "$adns" != 1
+then
+ AC_MSG_NOTICE([WARNING: GNU adns not found, will use synchronous DNS
resolution.])
+fi
+
Modified: GNUnet/m4/Makefile.in
===================================================================
--- GNUnet/m4/Makefile.in 2007-06-16 01:03:49 UTC (rev 5072)
+++ GNUnet/m4/Makefile.in 2007-06-16 03:42:49 UTC (rev 5073)
@@ -97,6 +97,8 @@
GREP = @GREP@
GTK_CFLAGS = @GTK_CFLAGS@
GTK_LIBS = @GTK_LIBS@
+HAVE_ADNS_FALSE = @HAVE_ADNS_FALSE@
+HAVE_ADNS_TRUE = @HAVE_ADNS_TRUE@
HAVE_DIALOG_FALSE = @HAVE_DIALOG_FALSE@
HAVE_DIALOG_TRUE = @HAVE_DIALOG_TRUE@
HAVE_GTK_FALSE = @HAVE_GTK_FALSE@
Modified: GNUnet/src/server/gnunet-peer-info.c
===================================================================
--- GNUnet/src/server/gnunet-peer-info.c 2007-06-16 01:03:49 UTC (rev
5072)
+++ GNUnet/src/server/gnunet-peer-info.c 2007-06-16 03:42:49 UTC (rev
5073)
@@ -98,23 +98,29 @@
GE_WARNING | GE_BULK | GE_USER,
_("hello message invalid (signature invalid).\n"));
}
+ addr = NULL;
+ addr_len = 0;
have_addr = transport->helloToAddress(hello,
&addr,
&addr_len);
FREE(hello);
- if (have_addr == NO) {
+ if (have_addr != OK) {
info = STRDUP("NAT"); /* most likely */
} else {
info = network_get_ip_as_string(addr,
addr_len,
! no_resolve);
FREE(addr);
- }
+ addr = NULL;
+ }
if (info == NULL) {
GE_LOG(ectx,
- GE_WARNING | GE_BULK | GE_USER,
+ GE_DEBUG | GE_BULK | GE_USER,
_("Could not get address of peer `%s'.\n"),
&enc);
+ printf(_("Peer `%s' with trust %8u\n"),
+ (char*)&enc,
+ identity->getHostTrust(id));
return OK;
}
printf(_("Peer `%s' with trust %8u and address `%s'\n"),
@@ -155,6 +161,9 @@
identity->forEachHost(0, /* no timeout */
&printHostInfo,
NULL);
+ identity->forEachHost(0, /* no timeout */
+ &printHostInfo,
+ NULL);
releaseService(identity);
releaseService(transport);
doneCore();
Modified: GNUnet/src/transports/udp.c
===================================================================
--- GNUnet/src/transports/udp.c 2007-06-16 01:03:49 UTC (rev 5072)
+++ GNUnet/src/transports/udp.c 2007-06-16 03:42:49 UTC (rev 5073)
@@ -478,7 +478,7 @@
/**
* Convert UDP hello to IP address
*/
-static char *
+static int
helloToAddress(const P2P_hello_MESSAGE * hello,
void ** sa,
unsigned int * sa_len) {
Modified: GNUnet/src/util/network/Makefile.am
===================================================================
--- GNUnet/src/util/network/Makefile.am 2007-06-16 01:03:49 UTC (rev 5072)
+++ GNUnet/src/util/network/Makefile.am 2007-06-16 03:42:49 UTC (rev 5073)
@@ -5,6 +5,10 @@
noinst_LTLIBRARIES = \
libnetwork.la
+if HAVE_ADNS
+ADNS_LINK=-ladns
+endif
+
libnetwork_la_SOURCES = \
dns.c \
endian.c network.h \
@@ -12,8 +16,8 @@
ip.c \
ipcheck.c \
select.c
+libnetwork_la_LIBADD = $(ADNS_LINK)
-
check_PROGRAMS = \
selecttest
Modified: GNUnet/src/util/network/dns.c
===================================================================
--- GNUnet/src/util/network/dns.c 2007-06-16 01:03:49 UTC (rev 5072)
+++ GNUnet/src/util/network/dns.c 2007-06-16 03:42:49 UTC (rev 5073)
@@ -29,14 +29,12 @@
#include "platform.h"
#include "gnunet_util_network.h"
+#undef HAVE_ADNS
+#define HAVE_ADNS YES
-/**
- * Disable DNS resolutions. The existing DNS resolution
- * code is synchronous and introduces ~500ms delays while
- * holding an important lock. As a result, it makes
- * GNUnet laggy. This should be fixed in the future.
- */
-#define NO_RESOLVE YES
+#if HAVE_ADNS
+#include <adns.h>
+#endif
struct IPCache {
@@ -46,23 +44,52 @@
cron_t last_refresh;
cron_t last_request;
unsigned int salen;
+#if HAVE_ADNS
+ int posted;
+ adns_query query;
+#endif
};
static struct IPCache * head;
static struct MUTEX * lock;
+#if HAVE_ADNS
+static adns_state a_state;
+#endif
+
static void cache_resolve(struct IPCache * cache) {
-#if NO_RESOLVE
- if (cache->sa->sa_family == AF_INET) {
- cache->addr = STRDUP("255.255.255.255");
- SNPRINTF(cache->addr,
- strlen("255.255.255.255")+1,
- "%u.%u.%u.%u",
- PRIP(ntohl(*(int*)&((struct sockaddr_in*) cache->sa)->sin_addr)));
- } else {
- cache->addr = STRDUP("IPv6");
+#if HAVE_ADNS
+ adns_answer * answer;
+ void * unused;
+ adns_status ret;
+
+ if (cache->posted == NO) {
+ ret = adns_submit_reverse(a_state,
+ cache->sa,
+ adns_r_ptr,
+ adns_qf_none,
+ cache,
+ &cache->query);
+ if (adns_s_ok == ret)
+ cache->posted = YES;
+ else
+ fprintf(stderr,
+ "Oops: %s\n",
+ adns_strerror(ret));
}
+ adns_processany(a_state);
+ answer = NULL;
+ adns_check(a_state,
+ &cache->query,
+ &answer,
+ &unused);
+ if (answer != NULL) {
+ printf("HAVE ANSWER!\n");
+ if (answer->owner != NULL)
+ cache->addr = STRDUP(answer->owner);
+ free(answer);
+ }
#else
#if HAVE_GETNAMEINFO
char hostname[256];
@@ -105,6 +132,9 @@
struct IPCache * ret;
ret = MALLOC(sizeof(struct IPCache));
+#if HAVE_ADNS
+ ret->posted = NO;
+#endif
ret->next = head;
ret->salen = salen;
ret->sa = salen == 0 ? NULL : MALLOC(salen);
@@ -119,55 +149,39 @@
return ret;
}
-#if IPV6_STUFF
+static char * no_resolve(const struct sockaddr * sa,
+ unsigned int salen) {
char * ret;
char inet6[INET6_ADDRSTRLEN];
- const Host6Address * haddr = (const Host6Address*) &hello[1];
- char * hn;
- size_t n;
- struct sockaddr_in6 serverAddr;
- if (do_resolve) {
- memset((char *) &serverAddr,
- 0,
- sizeof(serverAddr));
- serverAddr.sin6_family = AF_INET6;
- memcpy(&serverAddr.sin6_addr,
- haddr,
- sizeof(IP6addr));
- serverAddr.sin6_port = haddr->port;
- hn = getIPaddressAsString((const struct sockaddr*) &serverAddr,
- sizeof(struct sockaddr_in));
- } else
- hn = NULL;
- n = INET6_ADDRSTRLEN + 16 + (hn == NULL ? 0 : strlen(hn)) + 10;
- ret = MALLOC(n);
- if (hn != NULL) {
+ if (salen < sizeof(struct sockaddr))
+ return NULL;
+ switch (sa->sa_family) {
+ case AF_INET:
+ if (salen != sizeof(struct sockaddr_in))
+ return NULL;
+ ret = STRDUP("255.255.255.255");
SNPRINTF(ret,
- n,
- "%s (%s) TCP6 (%u)",
- hn,
- inet_ntop(AF_INET6,
- haddr,
- inet6,
- INET6_ADDRSTRLEN),
- ntohs(haddr->port));
- } else {
- SNPRINTF(ret,
- n,
- "%s TCP6 (%u)",
- inet_ntop(AF_INET6,
- haddr,
- inet6,
- INET6_ADDRSTRLEN),
- ntohs(haddr->port));
+ strlen("255.255.255.255")+1,
+ "%u.%u.%u.%u",
+ PRIP(ntohl(*(int*)&((struct sockaddr_in*)sa)->sin_addr)));
+ break;
+ case AF_INET6:
+ if (salen != sizeof(struct sockaddr_in6))
+ return NULL;
+ inet_ntop(AF_INET6,
+ &((struct sockaddr_in6*) sa)->sin6_addr,
+ inet6,
+ INET6_ADDRSTRLEN);
+ ret = STRDUP(inet6);
+ break;
+ default:
+ ret = NULL;
+ break;
}
- FREENONNULL(hn);
return ret;
}
-#endif
-
/**
* Get an IP address as a string (works for both IPv4 and IPv6). Note
* that the resolution happens asynchronously and that the first call
@@ -195,6 +209,12 @@
sa,
salen) ) ) ) {
if (cache->last_request + 60 * cronMINUTES < now) {
+#if HAVE_ADNS
+ if (cache->posted == YES) {
+ adns_cancel(cache->query);
+ cache->posted = NO;
+ }
+#endif
if (prev != NULL) {
prev->next = cache->next;
FREENONNULL(cache->addr);
@@ -218,11 +238,17 @@
if (cache->last_refresh + 12 * cronHOURS < now) {
FREENONNULL(cache->addr);
cache->addr = NULL;
+ cache->salen = 0;
cache_resolve(cache);
}
+ } else if (do_resolve == NO) {
+ MUTEX_UNLOCK(lock);
+ return no_resolve(sav, salen);
} else
cache = resolve(sa, salen);
ret = (cache->addr == NULL) ? NULL : STRDUP(cache->addr);
+ if (ret == NULL)
+ ret = no_resolve(sa, salen);
MUTEX_UNLOCK(lock);
return ret;
}
@@ -232,6 +258,11 @@
void __attribute__ ((constructor)) gnunet_dns_ltdl_init() {
lock = MUTEX_CREATE(YES);
+#if HAVE_ADNS
+ adns_init(&a_state,
+ adns_if_none, // adns_if_noerrprint,
+ NULL);
+#endif
}
void __attribute__ ((destructor)) gnunet_dns_ltdl_fini() {
@@ -239,9 +270,18 @@
MUTEX_DESTROY(lock);
while (head != NULL) {
pos = head->next;
+#if HAVE_ADNS
+ if (head->posted == YES) {
+ adns_cancel(head->query);
+ head->posted = NO;
+ }
+#endif
FREENONNULL(head->addr);
FREE(head->sa);
FREE(head);
head = pos;
}
+#if HAVE_ADNS
+ adns_finish(a_state);
+#endif
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r5073 - in GNUnet: . m4 src/server src/transports src/util/network,
gnunet <=