gnunet-svn
[Top][All Lists]
Advanced

[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
 }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]