diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2011-05-26 16:27:53 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2011-05-26 16:27:53 +0000 |
commit | 22e5cb9ff9abb79aa7fd89c88103ba2334ab1759 (patch) | |
tree | ff8bfea87afc3589605a322096807a358f1564b2 /src/transport/plugin_transport_unix.c | |
parent | ec8cf886b68e2ee5b51755ba7283f7d69bb78898 (diff) | |
download | gnunet-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.c | 66 |
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 |