Fix for unixpath/arm bug
authorNathan S. Evans <evans@in.tum.de>
Mon, 31 Jan 2011 11:22:23 +0000 (11:22 +0000)
committerNathan S. Evans <evans@in.tum.de>
Mon, 31 Jan 2011 11:22:23 +0000 (11:22 +0000)
src/util/client.c
src/util/connection.c

index 257a69b5a82e8c25bdd8e64073797c5d79658b7d..a097086d36074a5829203ce659f279ea5ec0b819 100644 (file)
@@ -43,6 +43,8 @@
  */
 #define MAX_ATTEMPTS 50
 
+#define UNIXPATH_RETRIES 0
+
 
 /**
  * Handle for a transmission request.
@@ -271,7 +273,9 @@ do_connect (const char *service_name,
   char *hostname;
   char *unixpath;
   unsigned long long port;
+  unsigned int count;
 
+  sock = NULL;
 #if AF_UNIX
   if (0 == (attempt % 2))
     {
@@ -280,13 +284,28 @@ do_connect (const char *service_name,
          GNUNET_CONFIGURATION_get_value_string (cfg,
                                                 service_name,
                                                 "UNIXPATH", &unixpath)) &&
-          (0 < strlen (unixpath)))
+          (0 < strlen (unixpath))) /* We have a non-NULL unixpath, does that mean it's valid? */
        {
-         sock = GNUNET_CONNECTION_create_from_connect_to_unixpath (cfg,
-                                                                   unixpath);
+          count = 0;
+          sock = GNUNET_CONNECTION_create_from_connect_to_unixpath (cfg, unixpath);
+          while ((NULL == sock) && (count < UNIXPATH_RETRIES))
+            {
+#if DEBUG_CLIENT
+              GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Failed to connect to unixpath `%s', retrying!\n", unixpath);
+#endif
+              count++;
+              sleep(1);
+              sock = GNUNET_CONNECTION_create_from_connect_to_unixpath (cfg, unixpath);
+            }
+
          GNUNET_free (unixpath);
          if (sock != NULL)
-           return sock;
+           {
+#if DEBUG_CLIENT
+              GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Connected to unixpath `%s'!\n", unixpath);
+#endif
+              return sock;
+           }
        }
     }
 #endif
@@ -332,12 +351,16 @@ do_connect (const char *service_name,
                                                                        unixpath);
              GNUNET_free (unixpath);
              if (sock != NULL)
-               return sock;
+               {
+                  return sock;
+               }
            }
        }
 #endif
+      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Port is 0 for service `%s', unixpath didn't work, returning NULL(!)!\n", service_name);
       return NULL;
     }
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Creating from connect!\n");
   sock = GNUNET_CONNECTION_create_from_connect (cfg,
                                                 hostname,
                                                 port);
@@ -480,6 +503,9 @@ receive_helper (void *cls,
   if ((available == 0) || (conn->sock == NULL) || (errCode != 0))
     {
       /* signal timeout! */
+#if DEBUG_CLIENT
+      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "timeout in receive_helper, available %d, conn->sock %s, errCode %d\n", available, conn->sock == NULL ? "NULL" : "non-NULL", errCode);
+#endif
       if (NULL != (receive_handler = conn->receiver_handler))
         {
           receive_handler_cls = conn->receiver_handler_cls;
@@ -586,6 +612,9 @@ GNUNET_CLIENT_receive (struct GNUNET_CLIENT_Connection *sock,
     {
       GNUNET_assert (sock->in_receive == GNUNET_NO);
       sock->in_receive = GNUNET_YES;
+#if DEBUG_CLIENT
+      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "calling GNUNET_CONNECTION_receive\n");
+#endif
       GNUNET_CONNECTION_receive (sock->sock,
                                  GNUNET_SERVER_MAX_MESSAGE_SIZE - 1,
                                  timeout, &receive_helper, sock);
index b0504ddd867744d9aa7c922c797abf56b8ac3394..095fddb45cb45c169e085bdb2c833a390eae4d8e 100644 (file)
@@ -41,6 +41,8 @@
 
 #define DEBUG_CONNECTION GNUNET_NO
 
+#define HARD_FAIL GNUNET_NO
+
 
 /**
  * Possible functions to call after connect failed or succeeded.
@@ -965,14 +967,16 @@ GNUNET_CONNECTION_create_from_connect_to_unixpath (const struct
                                                  ret->addr,
                                                  ret->addrlen)) 
     {
-      /* Just return; we expect everything to work eventually so don't fail HARD */
-      return ret;
 #if HARD_FAIL
       GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ret->sock));
       GNUNET_free (ret->addr);
       GNUNET_free (ret->write_buffer);
       GNUNET_free (ret);
       return NULL;
+#else /* Just return; we expect everything to work eventually so don't fail HARD */
+      GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ret->sock));
+      ret->sock = NULL;
+      return ret;
 #endif
     }
   connect_success_continuation (ret);
@@ -1415,7 +1419,9 @@ connect_error (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct GNUNET_CONNECTION_Handle *sock = cls;
   GNUNET_CONNECTION_TransmitReadyNotify notify;
-
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Transmission request of size %u fails, connection failed (%p).\n",
+              sock->nth.notify_size, sock);
 #if DEBUG_CONNECTION
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Transmission request of size %u fails, connection failed (%p).\n",