diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2013-09-30 14:39:02 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2013-09-30 14:39:02 +0000 |
commit | dd22248d2341ba3f5e229cad2ba67f24670c1924 (patch) | |
tree | 743dbf030da2cd5dec8b001ebd39fe225018e7d7 /src/transport/plugin_transport_unix.c | |
parent | c886c53017f31d76c22f5ed55df61719b71ef87a (diff) | |
download | gnunet-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.c | 104 |
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); | |||
362 | static const char * | 362 | static const char * |
363 | unix_address_to_string (void *cls, const void *addr, size_t addrlen); | 363 | unix_address_to_string (void *cls, const void *addr, size_t addrlen); |
364 | 364 | ||
365 | static struct sockaddr_un * | ||
366 | unix_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 | ||
611 | resend: | 623 | resend: |
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 | |||
1220 | unix_transport_server_start (void *cls) | 1238 | unix_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 | ||