[Top][All Lists]
[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r6884 - GNUnet/src/util/network_client,
gnunet <=