gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r6971 - GNUnet/src/util/network_client
Date: Sun, 1 Jun 2008 12:58:38 -0600 (MDT)

Author: holindho
Date: 2008-06-01 12:58:38 -0600 (Sun, 01 Jun 2008)
New Revision: 6971

Modified:
   GNUnet/src/util/network_client/tcpio.c
Log:
use getsockopt to find out whether socket is really connected


Modified: GNUnet/src/util/network_client/tcpio.c
===================================================================
--- GNUnet/src/util/network_client/tcpio.c      2008-06-01 17:27:48 UTC (rev 
6970)
+++ GNUnet/src/util/network_client/tcpio.c      2008-06-01 18:58:38 UTC (rev 
6971)
@@ -250,8 +250,6 @@
   unsigned short port;
   char *host;
   int af_index;
-  struct sockaddr *sa;
-  socklen_t slen;
 
   GNUNET_GE_ASSERT (NULL, sock != NULL);
   if (sock->sock != NULL)
@@ -314,13 +312,13 @@
       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_free (soaddr);
           GNUNET_socket_destroy (sock->sock);
           sock->sock = NULL;
           GNUNET_mutex_unlock (sock->destroylock);
@@ -346,7 +344,6 @@
             GNUNET_GE_LOG_STRERROR (sock->ectx,
                                     GNUNET_GE_WARNING | GNUNET_GE_USER |
                                     GNUNET_GE_BULK, "select");
-          GNUNET_free (soaddr);
           GNUNET_socket_destroy (sock->sock);
           sock->sock = NULL;
           GNUNET_mutex_unlock (sock->destroylock);
@@ -357,7 +354,6 @@
           GNUNET_GE_LOG (sock->ectx,
                          GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
                          _("Error connecting to %s:%u\n"), host, port);
-          GNUNET_free (soaddr);
           GNUNET_socket_destroy (sock->sock);
           sock->sock = NULL;
           GNUNET_mutex_unlock (sock->destroylock);
@@ -369,26 +365,36 @@
                          GNUNET_GE_WARNING | GNUNET_GE_USER | GNUNET_GE_BULK,
                          _("Failed to connect to %s:%u in %ds\n"),
                          host, port, WAIT_SECONDS);
-          GNUNET_free (soaddr);
           GNUNET_socket_destroy (sock->sock);
           sock->sock = NULL;
           GNUNET_mutex_unlock (sock->destroylock);
           continue;
         }
-      if (soaddr->sa_family == AF_INET)
-       {
-         sa = GNUNET_malloc (sizeof (struct sockaddr_in));
-         memset (sa, 0, sizeof (struct sockaddr_in));
-         slen = sizeof (struct sockaddr_in);
-       }
       else
-       {
-         sa = GNUNET_malloc (sizeof (struct sockaddr_in6));
-         memset (sa, 0, sizeof (struct sockaddr_in6));
-         slen = sizeof (struct sockaddr_in6);
-       }
-      GNUNET_free (soaddr);
-      GNUNET_free (sa);
+        {
+          int soerr = 0;
+          socklen_t soerrlen = sizeof(soerr);
+
+          ret = GETSOCKOPT(osock, SOL_SOCKET, SO_ERROR, &soerr, &soerrlen);
+          if (ret != 0)
+              GNUNET_GE_LOG_STRERROR (sock->ectx,
+                                      GNUNET_GE_WARNING | GNUNET_GE_USER |
+                                      GNUNET_GE_BULK, "getsockopt");
+ 
+          if ((soerr != 0) || 
+              (ret != 0 && (errno == ENOTSOCK || errno == EBADF)))
+            {
+              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_mutex_unlock (sock->destroylock);
+              continue;
+            }
+        }
       break;
     }
   GNUNET_free (host);





reply via email to

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