gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r29715 - gnunet/src/transport
Date: Mon, 30 Sep 2013 16:39:02 +0200

Author: wachs
Date: 2013-09-30 16:39:02 +0200 (Mon, 30 Sep 2013)
New Revision: 29715

Modified:
   gnunet/src/transport/plugin_transport_unix.c
Log:
fix unix plugin


Modified: gnunet/src/transport/plugin_transport_unix.c
===================================================================
--- gnunet/src/transport/plugin_transport_unix.c        2013-09-30 13:55:43 UTC 
(rev 29714)
+++ gnunet/src/transport/plugin_transport_unix.c        2013-09-30 14:39:02 UTC 
(rev 29715)
@@ -27,8 +27,8 @@
  * @author Nathan Evans
  */
 #include "platform.h"
+#include "gnunet_util_lib.h"
 #include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
 #include "gnunet_protocols.h"
 #include "gnunet_statistics_service.h"
 #include "gnunet_transport_service.h"
@@ -362,6 +362,32 @@
 static const char *
 unix_address_to_string (void *cls, const void *addr, size_t addrlen);
 
+static struct sockaddr_un *
+unix_address_to_sockaddr (const char *unixpath , socklen_t *sock_len)
+{
+  struct sockaddr_un *un;
+  size_t slen;
+
+  GNUNET_assert (0 < strlen (unixpath));        /* sanity check */
+  un = GNUNET_new (struct sockaddr_un);
+  un->sun_family = AF_UNIX;
+  slen = strlen (unixpath);
+  if (slen >= sizeof (un->sun_path))
+    slen = sizeof (un->sun_path) - 1;
+  memcpy (un->sun_path, unixpath, slen);
+  un->sun_path[slen] = '\0';
+  slen = sizeof (struct sockaddr_un);
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  un->sun_len = (u_char) slen;
+#endif
+#if LINUX
+  un->sun_path[0] = '\0';
+#endif
+
+  (*sock_len) = slen;
+  return un;
+}
+
 /**
  * Re-schedule the main 'select' callback (unix_plugin_select)
  * for this plugin.
@@ -569,11 +595,9 @@
 {
   struct Plugin *plugin = cls;
   ssize_t sent;
-  const void *sb;
-  size_t sbs;
-  struct sockaddr_un un;
-  size_t slen;
-  const char *unix_path;
+  struct sockaddr_un *un;
+  socklen_t un_len;
+  const char *unixpath;
 
 
   GNUNET_assert (NULL != plugin);
@@ -589,34 +613,25 @@
   }
 
   /* Prepare address */
-  unix_path = (const char *)  &addr[1];
-  memset (&un, 0, sizeof (un));
-  un.sun_family = AF_UNIX;
-  slen =  strlen (unix_path);
-  if (slen >= sizeof (un.sun_path))
-    slen = sizeof (un.sun_path) - 1;
-  GNUNET_assert (slen < sizeof (un.sun_path));
-  memcpy (un.sun_path, unix_path, slen);
-  un.sun_path[slen] = '\0';
-  slen = sizeof (struct sockaddr_un);
-#if LINUX
-  un.sun_path[0] = '\0';
-#endif
-#if HAVE_SOCKADDR_IN_SIN_LEN
-  un.sun_len = (u_char) slen;
-#endif
-  sb = (struct sockaddr *) &un;
-  sbs = slen;
+  unixpath = (const char *)  &addr[1];
+  if (NULL == (un = unix_address_to_sockaddr (unixpath, &un_len)))
+  {
+    GNUNET_break (0);
+    return -1;
+  }
 
 resend:
   /* Send the data */
-  sent = GNUNET_NETWORK_socket_sendto (send_handle, msgbuf, msgbuf_size, sb, 
sbs);
-
+  sent = GNUNET_NETWORK_socket_sendto (send_handle, msgbuf, msgbuf_size,
+      (const struct sockaddr *) un, un_len);
   if (GNUNET_SYSERR == sent)
   {
     if ( (EAGAIN == errno) ||
         (ENOBUFS == errno) )
+    {
+      GNUNET_free (un);
       return RETRY; /* We have to retry later  */
+    }
     if (EMSGSIZE == errno)
     {
       socklen_t size = 0;
@@ -639,6 +654,7 @@
         {
           /* Could not increase buffer size: error, no retry */
           GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
+          GNUNET_free (un);
           return GNUNET_SYSERR;
         }
       }
@@ -647,6 +663,7 @@
         /* Buffer is bigger than message:  error, no retry
          * This should never happen!*/
         GNUNET_break (0);
+        GNUNET_free (un);
         return GNUNET_SYSERR;
       }
     }
@@ -655,9 +672,10 @@
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "UNIX transmit %u-byte message to %s (%d: %s)\n",
        (unsigned int) msgbuf_size, 
-       GNUNET_a2s (sb, sbs), 
+       GNUNET_a2s ((const struct sockaddr *)un, un_len),
        (int) sent,
        (sent < 0) ? STRERROR (errno) : "ok");
+  GNUNET_free (un);
   return sent;
 }
 
@@ -1220,30 +1238,11 @@
 unix_transport_server_start (void *cls)
 {
   struct Plugin *plugin = cls;
-  struct sockaddr *serverAddr;
-  socklen_t addrlen;
-  struct sockaddr_un un;
-  size_t slen;
+  struct sockaddr_un *un;
+  socklen_t un_len;
 
-  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;
-
-  memcpy (un.sun_path, plugin->unix_socket_path, slen);
-  un.sun_path[slen] = '\0';
-  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
-  un.sun_path[0] = '\0';
-#endif
-  plugin->ats_network = plugin->env->get_address_type (plugin->env->cls, 
serverAddr, addrlen);
+  un = unix_address_to_sockaddr (plugin->unix_socket_path, &un_len);
+  plugin->ats_network = plugin->env->get_address_type (plugin->env->cls, 
(const struct sockaddr *) un, un_len);
   plugin->unix_sock.desc =
       GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_DGRAM, 0);
   if (NULL == plugin->unix_sock.desc)
@@ -1251,12 +1250,13 @@
     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
     return GNUNET_SYSERR;
   }
-  if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, serverAddr, addrlen, 
0)
+  if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, (const struct 
sockaddr *)  un, un_len, 0)
       != GNUNET_OK)
   {
     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
     GNUNET_NETWORK_socket_close (plugin->unix_sock.desc);
     plugin->unix_sock.desc = NULL;
+    GNUNET_free (un);
     return GNUNET_SYSERR;
   }
   LOG (GNUNET_ERROR_TYPE_DEBUG, "Bound to `%s'\n", plugin->unix_socket_path);
@@ -1268,7 +1268,7 @@
   GNUNET_NETWORK_fdset_set (plugin->ws, plugin->unix_sock.desc);
 
   reschedule_select (plugin);
-
+  GNUNET_free (un);
   return 1;
 }
 




reply via email to

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