diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-09-27 09:49:39 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-09-27 09:49:39 +0000 |
commit | bcdae74167d2e1f9d8dd9b01fb368bf8bcc2287d (patch) | |
tree | b1f47d243e677d53de0c3503a1d5caf43dba073e /src/transport/plugin_transport_unix.c | |
parent | dd22c2132e58ba4ac960337efc0f843c12f58780 (diff) | |
download | gnunet-bcdae74167d2e1f9d8dd9b01fb368bf8bcc2287d.tar.gz gnunet-bcdae74167d2e1f9d8dd9b01fb368bf8bcc2287d.zip |
-undo #29640, somehow causes problems
Diffstat (limited to 'src/transport/plugin_transport_unix.c')
-rw-r--r-- | src/transport/plugin_transport_unix.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/src/transport/plugin_transport_unix.c b/src/transport/plugin_transport_unix.c index 4e3038787..2087d30e5 100644 --- a/src/transport/plugin_transport_unix.c +++ b/src/transport/plugin_transport_unix.c | |||
@@ -572,6 +572,7 @@ unix_real_send (void *cls, | |||
572 | const void *sb; | 572 | const void *sb; |
573 | size_t sbs; | 573 | size_t sbs; |
574 | struct sockaddr_un un; | 574 | struct sockaddr_un un; |
575 | size_t slen; | ||
575 | const char *unix_path; | 576 | const char *unix_path; |
576 | 577 | ||
577 | 578 | ||
@@ -591,12 +592,21 @@ unix_real_send (void *cls, | |||
591 | unix_path = (const char *) &addr[1]; | 592 | unix_path = (const char *) &addr[1]; |
592 | memset (&un, 0, sizeof (un)); | 593 | memset (&un, 0, sizeof (un)); |
593 | un.sun_family = AF_UNIX; | 594 | un.sun_family = AF_UNIX; |
594 | strncpy (un.sun_path, unix_path, sizeof (un.sun_path) - 1); | 595 | slen = strlen (unix_path); |
596 | if (slen >= sizeof (un.sun_path)) | ||
597 | slen = sizeof (un.sun_path) - 1; | ||
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 | ||
595 | #if HAVE_SOCKADDR_IN_SIN_LEN | 605 | #if HAVE_SOCKADDR_IN_SIN_LEN |
596 | un.sun_len = (u_char) sizeof (struct sockaddr_un); | 606 | un.sun_len = (u_char) slen; |
597 | #endif | 607 | #endif |
598 | sb = (struct sockaddr *) &un; | 608 | sb = (struct sockaddr *) &un; |
599 | sbs = sizeof (struct sockaddr_un); | 609 | sbs = slen; |
600 | 610 | ||
601 | resend: | 611 | resend: |
602 | /* Send the data */ | 612 | /* Send the data */ |
@@ -1013,18 +1023,19 @@ unix_plugin_select_read (struct Plugin *plugin) | |||
1013 | } | 1023 | } |
1014 | else | 1024 | else |
1015 | { | 1025 | { |
1016 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 1026 | #if LINUX |
1017 | "Read %d bytes from socket %s\n", | 1027 | un.sun_path[0] = '/'; |
1018 | (int) ret, | 1028 | #endif |
1019 | un.sun_path); | 1029 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Read %d bytes from socket %s\n", ret, |
1030 | &un.sun_path[0]); | ||
1020 | } | 1031 | } |
1021 | 1032 | ||
1022 | GNUNET_assert (AF_UNIX == (un.sun_family)); | 1033 | GNUNET_assert (AF_UNIX == (un.sun_family)); |
1023 | ua_len = sizeof (struct UnixAddress) + strlen (un.sun_path) + 1; | 1034 | ua_len = sizeof (struct UnixAddress) + strlen (&un.sun_path[0]) +1; |
1024 | ua = GNUNET_malloc (ua_len); | 1035 | ua = GNUNET_malloc (ua_len); |
1025 | ua->addrlen = htonl (strlen (&un.sun_path[0]) +1); | 1036 | ua->addrlen = htonl (strlen (&un.sun_path[0]) +1); |
1026 | ua->options = htonl (0); | 1037 | ua->options = htonl (0); |
1027 | memcpy (&ua[1], &un.sun_path[0], strlen (un.sun_path) + 1); | 1038 | memcpy (&ua[1], &un.sun_path[0], strlen (&un.sun_path[0]) +1); |
1028 | 1039 | ||
1029 | msg = (struct UNIXMessage *) buf; | 1040 | msg = (struct UNIXMessage *) buf; |
1030 | csize = ntohs (msg->header.size); | 1041 | csize = ntohs (msg->header.size); |
@@ -1203,7 +1214,7 @@ unix_plugin_select (void *cls, | |||
1203 | * Create a slew of UNIX sockets. If possible, use IPv6 and IPv4. | 1214 | * Create a slew of UNIX sockets. If possible, use IPv6 and IPv4. |
1204 | * | 1215 | * |
1205 | * @param cls closure for server start, should be a struct Plugin * | 1216 | * @param cls closure for server start, should be a struct Plugin * |
1206 | * @return number of sockets created or #GNUNET_SYSERR on error | 1217 | * @return number of sockets created or GNUNET_SYSERR on error |
1207 | */ | 1218 | */ |
1208 | static int | 1219 | static int |
1209 | unix_transport_server_start (void *cls) | 1220 | unix_transport_server_start (void *cls) |
@@ -1212,16 +1223,26 @@ unix_transport_server_start (void *cls) | |||
1212 | struct sockaddr *serverAddr; | 1223 | struct sockaddr *serverAddr; |
1213 | socklen_t addrlen; | 1224 | socklen_t addrlen; |
1214 | struct sockaddr_un un; | 1225 | struct sockaddr_un un; |
1226 | size_t slen; | ||
1215 | 1227 | ||
1216 | memset (&un, 0, sizeof (un)); | 1228 | memset (&un, 0, sizeof (un)); |
1217 | un.sun_family = AF_UNIX; | 1229 | un.sun_family = AF_UNIX; |
1218 | strncpy (un.sun_path, plugin->unix_socket_path, sizeof (un.sun_path) - 1); | 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); | ||
1219 | #if HAVE_SOCKADDR_IN_SIN_LEN | 1237 | #if HAVE_SOCKADDR_IN_SIN_LEN |
1220 | un.sun_len = (u_char) sizeof (struct sockaddr_un); | 1238 | un.sun_len = (u_char) slen; |
1221 | #endif | 1239 | #endif |
1222 | 1240 | ||
1223 | serverAddr = (struct sockaddr *) &un; | 1241 | serverAddr = (struct sockaddr *) &un; |
1224 | addrlen = sizeof (struct sockaddr_un); | 1242 | addrlen = slen; |
1243 | #if LINUX | ||
1244 | un.sun_path[0] = '\0'; | ||
1245 | #endif | ||
1225 | plugin->ats_network = plugin->env->get_address_type (plugin->env->cls, serverAddr, addrlen); | 1246 | plugin->ats_network = plugin->env->get_address_type (plugin->env->cls, serverAddr, addrlen); |
1226 | plugin->unix_sock.desc = | 1247 | plugin->unix_sock.desc = |
1227 | GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_DGRAM, 0); | 1248 | GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_DGRAM, 0); |
@@ -1230,8 +1251,8 @@ unix_transport_server_start (void *cls) | |||
1230 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); | 1251 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); |
1231 | return GNUNET_SYSERR; | 1252 | return GNUNET_SYSERR; |
1232 | } | 1253 | } |
1233 | if (GNUNET_OK != | 1254 | if (GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, serverAddr, addrlen, 0) |
1234 | GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc, serverAddr, addrlen)) | 1255 | != GNUNET_OK) |
1235 | { | 1256 | { |
1236 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); | 1257 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind"); |
1237 | GNUNET_NETWORK_socket_close (plugin->unix_sock.desc); | 1258 | GNUNET_NETWORK_socket_close (plugin->unix_sock.desc); |