aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_unix.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-05-26 16:27:53 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-05-26 16:27:53 +0000
commit22e5cb9ff9abb79aa7fd89c88103ba2334ab1759 (patch)
treeff8bfea87afc3589605a322096807a358f1564b2 /src/transport/plugin_transport_unix.c
parentec8cf886b68e2ee5b51755ba7283f7d69bb78898 (diff)
downloadgnunet-22e5cb9ff9abb79aa7fd89c88103ba2334ab1759.tar.gz
gnunet-22e5cb9ff9abb79aa7fd89c88103ba2334ab1759.zip
freebsd related changes to unix
Diffstat (limited to 'src/transport/plugin_transport_unix.c')
-rw-r--r--src/transport/plugin_transport_unix.c66
1 files changed, 51 insertions, 15 deletions
diff --git a/src/transport/plugin_transport_unix.c b/src/transport/plugin_transport_unix.c
index f4a69d84e..c72de6ca6 100644
--- a/src/transport/plugin_transport_unix.c
+++ b/src/transport/plugin_transport_unix.c
@@ -42,7 +42,8 @@
42#include "gnunet_transport_plugin.h" 42#include "gnunet_transport_plugin.h"
43#include "transport.h" 43#include "transport.h"
44 44
45#define DEBUG_UNIX GNUNET_YES 45#define DEBUG_UNIX GNUNET_NO
46#define DETAILS GNUNET_NO
46 47
47#define MAX_PROBES 20 48#define MAX_PROBES 20
48 49
@@ -545,6 +546,7 @@ unix_real_send (void *cls,
545 struct sockaddr_un un; 546 struct sockaddr_un un;
546 size_t slen; 547 size_t slen;
547 struct RetryList *retry_list_entry; 548 struct RetryList *retry_list_entry;
549 int retry;
548 550
549 if (send_handle == NULL) 551 if (send_handle == NULL)
550 { 552 {
@@ -581,20 +583,57 @@ unix_real_send (void *cls,
581 memset(&un, 0, sizeof(un)); 583 memset(&un, 0, sizeof(un));
582 un.sun_family = AF_UNIX; 584 un.sun_family = AF_UNIX;
583 slen = strlen (addr) + 1; 585 slen = strlen (addr) + 1;
586 if (slen >= sizeof (un.sun_path))
587 slen = sizeof (un.sun_path) - 1;
584 sent = 0; 588 sent = 0;
585 GNUNET_assert(slen < sizeof(un.sun_path)); 589 GNUNET_assert(slen < sizeof(un.sun_path));
586 memcpy (un.sun_path, addr, slen); 590 memcpy (un.sun_path, addr, slen);
587 un.sun_path[slen] = '\0'; 591 un.sun_path[slen] = '\0';
592 slen = sizeof (struct sockaddr_un);
588#if LINUX 593#if LINUX
589 un.sun_path[0] = '\0'; 594 un.sun_path[0] = '\0';
590#endif 595#endif
591 slen += sizeof (sa_family_t); 596#if HAVE_SOCKADDR_IN_SIN_LEN
597 un.sun_len = (u_char) slen;
598#endif
592 sb = (struct sockaddr*) &un; 599 sb = (struct sockaddr*) &un;
593 sbs = slen; 600 sbs = slen;
601 retry = GNUNET_NO;
594 602
595 sent = GNUNET_NETWORK_socket_sendto(send_handle, message, ssize, sb, sbs); 603 sent = GNUNET_NETWORK_socket_sendto(send_handle, message, ssize, sb, sbs);
596 604
597 if (GNUNET_SYSERR == sent) 605 if ((GNUNET_SYSERR == sent) && (errno == EAGAIN))
606 retry = GNUNET_YES;
607
608 if ((GNUNET_SYSERR == sent) && (errno == EMSGSIZE))
609 {
610 socklen_t size = 0;
611 socklen_t len = sizeof (size);
612 GNUNET_NETWORK_socket_getsockopt ((struct GNUNET_NETWORK_Handle * ) send_handle,
613 SOL_SOCKET,
614 SO_SNDBUF,
615 &size, &len);
616
617 if (size < ssize)
618 {
619#if DEBUG_UNIX
620 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
621 "Trying to increase socket buffer size from %i to %i for message size %i\n",
622 size,
623 ((ssize / 1000) + 2) * 1000, ssize);
624#endif
625 size = ((ssize / 1000) + 2) * 1000;
626 if (GNUNET_NETWORK_socket_setsockopt ((struct GNUNET_NETWORK_Handle * ) send_handle,
627 SOL_SOCKET,
628 SO_SNDBUF,
629 &size, sizeof(size)) == GNUNET_OK)
630 retry = GNUNET_YES;
631 else
632 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
633 }
634 }
635
636 if (retry == GNUNET_YES)
598 { 637 {
599 if (incoming_retry_context == NULL) 638 if (incoming_retry_context == NULL)
600 { 639 {
@@ -624,16 +663,8 @@ unix_real_send (void *cls,
624 retry_ctx->delay = GNUNET_TIME_relative_multiply(retry_ctx->delay, 2); 663 retry_ctx->delay = GNUNET_TIME_relative_multiply(retry_ctx->delay, 2);
625 } 664 }
626 retry_ctx->retry_task = GNUNET_SCHEDULER_add_delayed(retry_ctx->delay, &retry_send_message, retry_ctx); 665 retry_ctx->retry_task = GNUNET_SCHEDULER_add_delayed(retry_ctx->delay, &retry_send_message, retry_ctx);
627#if DETAILS 666
628 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]); 667 //GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "send");
629 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
630 "UNIX transmit %u-byte message to %s (%d: %s)\n",
631 (unsigned int) ssize,
632 GNUNET_a2s (sb, sbs),
633 (int) sent,
634 (sent < 0) ? STRERROR (errno) : "ok");
635#endif
636 GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "send");
637 GNUNET_free(message); 668 GNUNET_free(message);
638 return ssize; 669 return ssize;
639 } 670 }
@@ -905,11 +936,16 @@ unix_transport_server_start (void *cls)
905 memset(&un, 0, sizeof(un)); 936 memset(&un, 0, sizeof(un));
906 un.sun_family = AF_UNIX; 937 un.sun_family = AF_UNIX;
907 slen = strlen (plugin->unix_socket_path) + 1; 938 slen = strlen (plugin->unix_socket_path) + 1;
939 if (slen >= sizeof (un.sun_path))
940 slen = sizeof (un.sun_path) - 1;
908 941
909 GNUNET_assert(slen < sizeof(un.sun_path));
910 memcpy (un.sun_path, plugin->unix_socket_path, slen); 942 memcpy (un.sun_path, plugin->unix_socket_path, slen);
911 un.sun_path[slen] = '\0'; 943 un.sun_path[slen] = '\0';
912 slen += sizeof (sa_family_t); 944 slen = sizeof (struct sockaddr_un);
945#if HAVE_SOCKADDR_IN_SIN_LEN
946 un.sun_len = (u_char) slen;
947#endif
948
913 serverAddr = (struct sockaddr*) &un; 949 serverAddr = (struct sockaddr*) &un;
914 addrlen = slen; 950 addrlen = slen;
915#if LINUX 951#if LINUX