gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r6884 - GNUnet/src/util/network_client


From: gnunet
Subject: [GNUnet-SVN] r6884 - GNUnet/src/util/network_client
Date: Sun, 25 May 2008 21:14:41 -0600 (MDT)

Author: grothoff
Date: 2008-05-25 21:14:41 -0600 (Sun, 25 May 2008)
New Revision: 6884

Modified:
   GNUnet/src/util/network_client/tcpio.c
Log:
trying to fix Mantis #1330

Modified: GNUnet/src/util/network_client/tcpio.c
===================================================================
--- GNUnet/src/util/network_client/tcpio.c      2008-05-26 03:02:49 UTC (rev 
6883)
+++ GNUnet/src/util/network_client/tcpio.c      2008-05-26 03:14:41 UTC (rev 
6884)
@@ -236,6 +236,9 @@
                                            GNUNET_ClientServerConnection
                                            *sock)
 {
+  /* list of address families to try for connecting,
+     in order of preference */
+  static int addr_families[] = { AF_UNSPEC, AF_INET6, AF_INET, -1 };
   struct sockaddr *soaddr;
   socklen_t socklen;
   fd_set rset;
@@ -246,6 +249,7 @@
   int osock;
   unsigned short port;
   char *host;
+  int af_index;
 
   GNUNET_GE_ASSERT (NULL, sock != NULL);
   if (sock->sock != NULL)
@@ -258,115 +262,123 @@
   host = getGNUnetdHost (sock->ectx, sock->cfg);
   if (host == NULL)
     return GNUNET_SYSERR;
-  soaddr = NULL;
-  socklen = 0;
-  if (GNUNET_SYSERR ==
-      GNUNET_get_ip_from_hostname (sock->ectx, host, AF_UNSPEC, &soaddr,
-                                   &socklen))
+  af_index = -1;
+  /* loop over all possible address families */
+  while (1) 
     {
-      GNUNET_free (host);
-      return GNUNET_SYSERR;
-    }
-  GNUNET_mutex_lock (sock->destroylock);
-  if (sock->sock != NULL)
-    {
-      GNUNET_free (host);
-      GNUNET_mutex_unlock (sock->destroylock);
+      if (addr_families[++af_index] == -1)
+       return GNUNET_SYSERR;      
+      soaddr = NULL;
+      socklen = 0;
+      if (GNUNET_SYSERR ==
+         GNUNET_get_ip_from_hostname (sock->ectx, host, 
addr_families[af_index], &soaddr,
+                                      &socklen))
+       {
+         GNUNET_free (host);
+         continue;
+       }
+      GNUNET_mutex_lock (sock->destroylock);
+      if (sock->sock != NULL)
+       {
+         GNUNET_free (host);
+         GNUNET_mutex_unlock (sock->destroylock);
+         GNUNET_free (soaddr);
+         return GNUNET_OK;
+       }
+      if (sock->dead == GNUNET_YES)
+       {
+         GNUNET_free (host);
+         GNUNET_mutex_unlock (sock->destroylock);
+         GNUNET_free (soaddr);
+         return GNUNET_SYSERR;
+       }
+      if (soaddr->sa_family == AF_INET)
+       {
+         ((struct sockaddr_in *) soaddr)->sin_port = htons (port);
+         osock = SOCKET (PF_INET, SOCK_STREAM, 0);
+       }
+      else
+       {
+         ((struct sockaddr_in6 *) soaddr)->sin6_port = htons (port);
+         osock = SOCKET (PF_INET6, SOCK_STREAM, 0);
+       }
+      if (osock == -1)
+       {
+         GNUNET_GE_LOG_STRERROR (sock->ectx,
+                                 GNUNET_GE_ERROR | GNUNET_GE_USER |
+                                 GNUNET_GE_ADMIN | GNUNET_GE_BULK, "socket");
+         GNUNET_free (host);
+         GNUNET_mutex_unlock (sock->destroylock);
+         GNUNET_free (soaddr);
+         continue;
+       }
+      sock->sock = GNUNET_socket_create (sock->ectx, NULL, osock);
+      GNUNET_socket_set_blocking (sock->sock, GNUNET_NO);
+      ret = CONNECT (osock, soaddr, socklen);
       GNUNET_free (soaddr);
-      return GNUNET_OK;
-    }
-  if (sock->dead == GNUNET_YES)
-    {
-      GNUNET_free (host);
-      GNUNET_mutex_unlock (sock->destroylock);
-      GNUNET_free (soaddr);
-      return GNUNET_SYSERR;
-    }
-  if (soaddr->sa_family == AF_INET)
-    {
-      ((struct sockaddr_in *) soaddr)->sin_port = htons (port);
-      osock = SOCKET (PF_INET, SOCK_STREAM, 0);
-    }
-  else
-    {
-      ((struct sockaddr_in6 *) soaddr)->sin6_port = htons (port);
-      osock = SOCKET (PF_INET6, SOCK_STREAM, 0);
-    }
-  if (osock == -1)
-    {
-      GNUNET_GE_LOG_STRERROR (sock->ectx,
-                              GNUNET_GE_ERROR | GNUNET_GE_USER |
-                              GNUNET_GE_ADMIN | GNUNET_GE_BULK, "socket");
-      GNUNET_free (host);
-      GNUNET_mutex_unlock (sock->destroylock);
-      GNUNET_free (soaddr);
-      return GNUNET_SYSERR;
-    }
-  sock->sock = GNUNET_socket_create (sock->ectx, NULL, osock);
-  GNUNET_socket_set_blocking (sock->sock, GNUNET_NO);
-  ret = CONNECT (osock, soaddr, socklen);
-  GNUNET_free (soaddr);
-  if ((ret != 0) && (errno != EINPROGRESS) && (errno != EWOULDBLOCK))
-    {
-      GNUNET_GE_LOG (sock->ectx,
-                     GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
-                     _("Cannot connect to %s:%u: %s\n"),
-                     host, port, STRERROR (errno));
-      GNUNET_socket_destroy (sock->sock);
-      sock->sock = NULL;
-      GNUNET_free (host);
-      GNUNET_mutex_unlock (sock->destroylock);
-      return GNUNET_SYSERR;
-    }
-  /* we call select() first with a timeout of WAIT_SECONDS to
-     avoid blocking on a later write indefinitely;
-     Important if a local firewall decides to just drop
-     the TCP handshake... */
-  FD_ZERO (&rset);
-  FD_ZERO (&wset);
-  FD_ZERO (&eset);
-  FD_SET (osock, &wset);
-  FD_SET (osock, &eset);
+      if ((ret != 0) && (errno != EINPROGRESS) && (errno != EWOULDBLOCK))
+       {
+         GNUNET_GE_LOG (sock->ectx,
+                        GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
+                        _("Cannot connect to %s:%u: %s\n"),
+                        host, port, STRERROR (errno));
+         GNUNET_socket_destroy (sock->sock);
+         sock->sock = NULL;
+         GNUNET_free (host);
+         GNUNET_mutex_unlock (sock->destroylock);
+         continue;
+       }
+      /* we call select() first with a timeout of WAIT_SECONDS to
+        avoid blocking on a later write indefinitely;
+        Important if a local firewall decides to just drop
+        the TCP handshake... */
+      FD_ZERO (&rset);
+      FD_ZERO (&wset);
+      FD_ZERO (&eset);
+      FD_SET (osock, &wset);
+      FD_SET (osock, &eset);
 #define WAIT_SECONDS 10
-  timeout.tv_sec = WAIT_SECONDS;
-  timeout.tv_usec = 0;
-  errno = 0;
-  ret = SELECT (osock + 1, &rset, &wset, &eset, &timeout);
-  if (ret == -1)
-    {
-      if (errno != EINTR)
-        GNUNET_GE_LOG_STRERROR (sock->ectx,
-                                GNUNET_GE_WARNING | GNUNET_GE_USER |
-                                GNUNET_GE_BULK, "select");
-      GNUNET_socket_destroy (sock->sock);
-      sock->sock = NULL;
-      GNUNET_free (host);
-      GNUNET_mutex_unlock (sock->destroylock);
-      return GNUNET_SYSERR;
+      timeout.tv_sec = WAIT_SECONDS;
+      timeout.tv_usec = 0;
+      errno = 0;
+      ret = SELECT (osock + 1, &rset, &wset, &eset, &timeout);
+      if (ret == -1)
+       {
+         if (errno != EINTR)
+           GNUNET_GE_LOG_STRERROR (sock->ectx,
+                                   GNUNET_GE_WARNING | GNUNET_GE_USER |
+                                   GNUNET_GE_BULK, "select");
+         GNUNET_socket_destroy (sock->sock);
+         sock->sock = NULL;
+         GNUNET_free (host);
+         GNUNET_mutex_unlock (sock->destroylock);
+         continue;
+       }
+      if (FD_ISSET (osock, &eset))
+       {
+         GNUNET_GE_LOG (sock->ectx,
+                        GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
+                        _("Error connecting to %s:%u\n"), host, port);
+         GNUNET_socket_destroy (sock->sock);
+         sock->sock = NULL;
+         GNUNET_free (host);
+         GNUNET_mutex_unlock (sock->destroylock);
+         continue;
+       }
+      if (!FD_ISSET (osock, &wset))
+       {
+         GNUNET_GE_LOG (sock->ectx,
+                        GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
+                        _("Failed to connect to %s:%u in %ds\n"),
+                        host, port, WAIT_SECONDS);
+         GNUNET_socket_destroy (sock->sock);
+         sock->sock = NULL;
+         GNUNET_free (host);
+         GNUNET_mutex_unlock (sock->destroylock);
+         continue;
+       }
+      break;
     }
-  if (FD_ISSET (osock, &eset))
-    {
-      GNUNET_GE_LOG (sock->ectx,
-                     GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
-                     _("Error connecting to %s:%u\n"), host, port);
-      GNUNET_socket_destroy (sock->sock);
-      sock->sock = NULL;
-      GNUNET_free (host);
-      GNUNET_mutex_unlock (sock->destroylock);
-      return GNUNET_SYSERR;
-    }
-  if (!FD_ISSET (osock, &wset))
-    {
-      GNUNET_GE_LOG (sock->ectx,
-                     GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
-                     _("Failed to connect to %s:%u in %ds\n"),
-                     host, port, WAIT_SECONDS);
-      GNUNET_socket_destroy (sock->sock);
-      sock->sock = NULL;
-      GNUNET_free (host);
-      GNUNET_mutex_unlock (sock->destroylock);
-      return GNUNET_SYSERR;
-    }
   GNUNET_free (host);
   GNUNET_socket_set_blocking (sock->sock, GNUNET_YES);
   GNUNET_mutex_unlock (sock->destroylock);





reply via email to

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