aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_unix.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-09-30 14:39:02 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-09-30 14:39:02 +0000
commitdd22248d2341ba3f5e229cad2ba67f24670c1924 (patch)
tree743dbf030da2cd5dec8b001ebd39fe225018e7d7 /src/transport/plugin_transport_unix.c
parentc886c53017f31d76c22f5ed55df61719b71ef87a (diff)
downloadgnunet-dd22248d2341ba3f5e229cad2ba67f24670c1924.tar.gz
gnunet-dd22248d2341ba3f5e229cad2ba67f24670c1924.zip
fix unix plugin
Diffstat (limited to 'src/transport/plugin_transport_unix.c')
-rw-r--r--src/transport/plugin_transport_unix.c104
1 files changed, 52 insertions, 52 deletions
diff --git a/src/transport/plugin_transport_unix.c b/src/transport/plugin_transport_unix.c
index 2087d30e5..beed32d8d 100644
--- a/src/transport/plugin_transport_unix.c
+++ b/src/transport/plugin_transport_unix.c
@@ -27,8 +27,8 @@
27 * @author Nathan Evans 27 * @author Nathan Evans
28 */ 28 */
29#include "platform.h" 29#include "platform.h"
30#include "gnunet_hello_lib.h"
31#include "gnunet_util_lib.h" 30#include "gnunet_util_lib.h"
31#include "gnunet_hello_lib.h"
32#include "gnunet_protocols.h" 32#include "gnunet_protocols.h"
33#include "gnunet_statistics_service.h" 33#include "gnunet_statistics_service.h"
34#include "gnunet_transport_service.h" 34#include "gnunet_transport_service.h"
@@ -362,6 +362,32 @@ unix_plugin_select (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
362static const char * 362static const char *
363unix_address_to_string (void *cls, const void *addr, size_t addrlen); 363unix_address_to_string (void *cls, const void *addr, size_t addrlen);
364 364
365static struct sockaddr_un *
366unix_address_to_sockaddr (const char *unixpath , socklen_t *sock_len)
367{
368 struct sockaddr_un *un;
369 size_t slen;
370
371 GNUNET_assert (0 < strlen (unixpath)); /* sanity check */
372 un = GNUNET_new (struct sockaddr_un);
373 un->sun_family = AF_UNIX;
374 slen = strlen (unixpath);
375 if (slen >= sizeof (un->sun_path))
376 slen = sizeof (un->sun_path) - 1;
377 memcpy (un->sun_path, unixpath, slen);
378 un->sun_path[slen] = '\0';
379 slen = sizeof (struct sockaddr_un);
380#if HAVE_SOCKADDR_IN_SIN_LEN
381 un->sun_len = (u_char) slen;
382#endif
383#if LINUX
384 un->sun_path[0] = '\0';
385#endif
386
387 (*sock_len) = slen;
388 return un;
389}
390
365/** 391/**
366 * Re-schedule the main 'select' callback (unix_plugin_select) 392 * Re-schedule the main 'select' callback (unix_plugin_select)
367 * for this plugin. 393 * for this plugin.
@@ -569,11 +595,9 @@ unix_real_send (void *cls,
569{ 595{
570 struct Plugin *plugin = cls; 596 struct Plugin *plugin = cls;
571 ssize_t sent; 597 ssize_t sent;
572 const void *sb; 598 struct sockaddr_un *un;
573 size_t sbs; 599 socklen_t un_len;
574 struct sockaddr_un un; 600 const char *unixpath;
575 size_t slen;
576 const char *unix_path;
577 601
578 602
579 GNUNET_assert (NULL != plugin); 603 GNUNET_assert (NULL != plugin);
@@ -589,34 +613,25 @@ unix_real_send (void *cls,
589 } 613 }
590 614
591 /* Prepare address */ 615 /* Prepare address */
592 unix_path = (const char *) &addr[1]; 616 unixpath = (const char *) &addr[1];
593 memset (&un, 0, sizeof (un)); 617 if (NULL == (un = unix_address_to_sockaddr (unixpath, &un_len)))
594 un.sun_family = AF_UNIX; 618 {
595 slen = strlen (unix_path); 619 GNUNET_break (0);
596 if (slen >= sizeof (un.sun_path)) 620 return -1;
597 slen = sizeof (un.sun_path) - 1; 621 }
598 GNUNET_assert (slen < sizeof (un.sun_path));
599 memcpy (un.sun_path, unix_path, slen);
600 un.sun_path[slen] = '\0';
601 slen = sizeof (struct sockaddr_un);
602#if LINUX
603 un.sun_path[0] = '\0';
604#endif
605#if HAVE_SOCKADDR_IN_SIN_LEN
606 un.sun_len = (u_char) slen;
607#endif
608 sb = (struct sockaddr *) &un;
609 sbs = slen;
610 622
611resend: 623resend:
612 /* Send the data */ 624 /* Send the data */
613 sent = GNUNET_NETWORK_socket_sendto (send_handle, msgbuf, msgbuf_size, sb, sbs); 625 sent = GNUNET_NETWORK_socket_sendto (send_handle, msgbuf, msgbuf_size,
614 626 (const struct sockaddr *) un, un_len);
615 if (GNUNET_SYSERR == sent) 627 if (GNUNET_SYSERR == sent)
616 { 628 {
617 if ( (EAGAIN == errno) || 629 if ( (EAGAIN == errno) ||
618 (ENOBUFS == errno) ) 630 (ENOBUFS == errno) )
631 {
632 GNUNET_free (un);
619 return RETRY; /* We have to retry later */ 633 return RETRY; /* We have to retry later */
634 }
620 if (EMSGSIZE == errno) 635 if (EMSGSIZE == errno)
621 { 636 {
622 socklen_t size = 0; 637 socklen_t size = 0;
@@ -639,6 +654,7 @@ resend:
639 { 654 {
640 /* Could not increase buffer size: error, no retry */ 655 /* Could not increase buffer size: error, no retry */
641 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt"); 656 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
657 GNUNET_free (un);
642 return GNUNET_SYSERR; 658 return GNUNET_SYSERR;
643 } 659 }
644 } 660 }
@@ -647,6 +663,7 @@ resend:
647 /* Buffer is bigger than message: error, no retry 663 /* Buffer is bigger than message: error, no retry
648 * This should never happen!*/ 664 * This should never happen!*/
649 GNUNET_break (0); 665 GNUNET_break (0);
666 GNUNET_free (un);
650 return GNUNET_SYSERR; 667 return GNUNET_SYSERR;
651 } 668 }
652 } 669 }
@@ -655,9 +672,10 @@ resend:
655 LOG (GNUNET_ERROR_TYPE_DEBUG, 672 LOG (GNUNET_ERROR_TYPE_DEBUG,
656 "UNIX transmit %u-byte message to %s (%d: %s)\n", 673 "UNIX transmit %u-byte message to %s (%d: %s)\n",
657 (unsigned int) msgbuf_size, 674 (unsigned int) msgbuf_size,
658 GNUNET_a2s (sb, sbs), 675 GNUNET_a2s ((const struct sockaddr *)un, un_len),
659 (int) sent, 676 (int) sent,
660 (sent < 0) ? STRERROR (errno) : "ok"); 677 (sent < 0) ? STRERROR (errno) : "ok");
678 GNUNET_free (un);
661 return sent; 679 return sent;
662} 680}
663 681
@@ -1220,30 +1238,11 @@ static int
1220unix_transport_server_start (void *cls) 1238unix_transport_server_start (void *cls)
1221{ 1239{
1222 struct Plugin *plugin = cls; 1240 struct Plugin *plugin = cls;
1223 struct sockaddr *serverAddr; 1241 struct sockaddr_un *un;
1224 socklen_t addrlen; 1242 socklen_t un_len;
1225 struct sockaddr_un un;
1226 size_t slen;
1227 1243
1228 memset (&un, 0, sizeof (un)); 1244 un = unix_address_to_sockaddr (plugin->unix_socket_path, &un_len);
1229 un.sun_family = AF_UNIX; 1245 plugin->ats_network = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) un, un_len);
1230 slen = strlen (plugin->unix_socket_path) + 1;
1231 if (slen >= sizeof (un.sun_path))
1232 slen = sizeof (un.sun_path) - 1;
1233
1234 memcpy (un.sun_path, plugin->unix_socket_path, slen);
1235 un.sun_path[slen] = '\0';
1236 slen = sizeof (struct sockaddr_un);
1237#if HAVE_SOCKADDR_IN_SIN_LEN
1238 un.sun_len = (u_char) slen;
1239#endif
1240
1241 serverAddr = (struct sockaddr *) &un;
1242 addrlen = slen;
1243#if LINUX
1244 un.sun_path[0] = '\0';
1245#endif
1246 plugin->ats_network = plugin->env->get_address_type (plugin->env->cls, serverAddr, addrlen);
1247 plugin->unix_sock.desc = 1246 plugin->unix_sock.desc =
1248 GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_DGRAM, 0); 1247 GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_DGRAM, 0);
1249 if (NULL == plugin->unix_sock.desc) 1248 if (NULL == plugin->unix_sock.desc)
@@ -1251,12 +1250,13 @@ unix_transport_server_start (void *cls)
1251 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); 1250 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
1252 return GNUNET_SYSERR; 1251 return GNUNET_SYSERR;
1253 } 1252 }
1254 if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, serverAddr, addrlen, 0) 1253 if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, (const struct sockaddr *) un, un_len, 0)
1255 != GNUNET_OK) 1254 != GNUNET_OK)
1256 { 1255 {
1257 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); 1256 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
1258 GNUNET_NETWORK_socket_close (plugin->unix_sock.desc); 1257 GNUNET_NETWORK_socket_close (plugin->unix_sock.desc);
1259 plugin->unix_sock.desc = NULL; 1258 plugin->unix_sock.desc = NULL;
1259 GNUNET_free (un);
1260 return GNUNET_SYSERR; 1260 return GNUNET_SYSERR;
1261 } 1261 }
1262 LOG (GNUNET_ERROR_TYPE_DEBUG, "Bound to `%s'\n", plugin->unix_socket_path); 1262 LOG (GNUNET_ERROR_TYPE_DEBUG, "Bound to `%s'\n", plugin->unix_socket_path);
@@ -1268,7 +1268,7 @@ unix_transport_server_start (void *cls)
1268 GNUNET_NETWORK_fdset_set (plugin->ws, plugin->unix_sock.desc); 1268 GNUNET_NETWORK_fdset_set (plugin->ws, plugin->unix_sock.desc);
1269 1269
1270 reschedule_select (plugin); 1270 reschedule_select (plugin);
1271 1271 GNUNET_free (un);
1272 return 1; 1272 return 1;
1273} 1273}
1274 1274