gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r15317 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r15317 - gnunet/src/transport
Date: Thu, 26 May 2011 18:27:53 +0200

Author: wachs
Date: 2011-05-26 18:27:53 +0200 (Thu, 26 May 2011)
New Revision: 15317

Modified:
   gnunet/src/transport/plugin_transport_unix.c
Log:
freebsd related changes to unix


Modified: gnunet/src/transport/plugin_transport_unix.c
===================================================================
--- gnunet/src/transport/plugin_transport_unix.c        2011-05-25 22:19:16 UTC 
(rev 15316)
+++ gnunet/src/transport/plugin_transport_unix.c        2011-05-26 16:27:53 UTC 
(rev 15317)
@@ -42,7 +42,8 @@
 #include "gnunet_transport_plugin.h"
 #include "transport.h"
 
-#define DEBUG_UNIX GNUNET_YES
+#define DEBUG_UNIX GNUNET_NO
+#define DETAILS GNUNET_NO
 
 #define MAX_PROBES 20
 
@@ -545,6 +546,7 @@
   struct sockaddr_un un;
   size_t slen;
   struct RetryList *retry_list_entry;
+  int retry;
 
   if (send_handle == NULL)
     {
@@ -581,20 +583,57 @@
   memset(&un, 0, sizeof(un));
   un.sun_family = AF_UNIX;
   slen = strlen (addr) + 1;
+  if (slen >= sizeof (un.sun_path))
+    slen = sizeof (un.sun_path) - 1;
   sent = 0;
   GNUNET_assert(slen < sizeof(un.sun_path));
   memcpy (un.sun_path, addr, slen);
   un.sun_path[slen] = '\0';
+  slen = sizeof (struct sockaddr_un);
 #if LINUX
   un.sun_path[0] = '\0';
 #endif
-  slen += sizeof (sa_family_t);
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  un.sun_len = (u_char) slen;
+#endif
   sb = (struct sockaddr*) &un;
   sbs = slen;
+  retry = GNUNET_NO;
 
   sent = GNUNET_NETWORK_socket_sendto(send_handle, message, ssize, sb, sbs);
 
-  if (GNUNET_SYSERR == sent)
+  if ((GNUNET_SYSERR == sent) && (errno == EAGAIN))
+         retry = GNUNET_YES;
+
+  if ((GNUNET_SYSERR == sent) && (errno == EMSGSIZE))
+  {
+         socklen_t size = 0;
+         socklen_t len = sizeof (size);
+         GNUNET_NETWORK_socket_getsockopt ((struct GNUNET_NETWORK_Handle * ) 
send_handle,
+                         SOL_SOCKET,
+                         SO_SNDBUF,
+                         &size, &len);
+
+         if (size < ssize)
+         {
+#if DEBUG_UNIX
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Trying to increase socket buffer size from %i to %i for message 
size %i\n",
+             size,
+              ((ssize / 1000) + 2) * 1000, ssize);
+#endif
+                 size = ((ssize / 1000) + 2) * 1000;
+                 if (GNUNET_NETWORK_socket_setsockopt ((struct 
GNUNET_NETWORK_Handle * ) send_handle,
+                                 SOL_SOCKET,
+                                 SO_SNDBUF,
+                                 &size, sizeof(size)) == GNUNET_OK)
+                        retry = GNUNET_YES;
+                 else
+                        GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, 
"setsockopt");
+         }
+  }
+
+  if (retry == GNUNET_YES)
     {
       if (incoming_retry_context == NULL)
         {
@@ -624,16 +663,8 @@
           retry_ctx->delay = GNUNET_TIME_relative_multiply(retry_ctx->delay, 
2);
         }
       retry_ctx->retry_task = GNUNET_SCHEDULER_add_delayed(retry_ctx->delay, 
&retry_send_message, retry_ctx);
-#if DETAILS
-      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Error when trying to send %d byte 
message to %s\n", retry_ctx->msg_size, &un->sun_path[1]);
-      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                  "UNIX transmit %u-byte message to %s (%d: %s)\n",
-                  (unsigned int) ssize,
-                  GNUNET_a2s (sb, sbs),
-                  (int) sent,
-                  (sent < 0) ? STRERROR (errno) : "ok");
-#endif
-      GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "send");
+
+      //GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "send");
       GNUNET_free(message);
       return ssize;
     }
@@ -905,11 +936,16 @@
   memset(&un, 0, sizeof(un));
   un.sun_family = AF_UNIX;
   slen = strlen (plugin->unix_socket_path) + 1;
+  if (slen >= sizeof (un.sun_path))
+    slen = sizeof (un.sun_path) - 1;
 
-  GNUNET_assert(slen < sizeof(un.sun_path));
   memcpy (un.sun_path, plugin->unix_socket_path, slen);
   un.sun_path[slen] = '\0';
-  slen += sizeof (sa_family_t);
+  slen = sizeof (struct sockaddr_un);
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  un.sun_len = (u_char) slen;
+#endif
+
   serverAddr = (struct sockaddr*) &un;
   addrlen = slen;
 #if LINUX




reply via email to

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