aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_unix.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-09-27 09:49:39 +0000
committerChristian Grothoff <christian@grothoff.org>2013-09-27 09:49:39 +0000
commitbcdae74167d2e1f9d8dd9b01fb368bf8bcc2287d (patch)
treeb1f47d243e677d53de0c3503a1d5caf43dba073e /src/transport/plugin_transport_unix.c
parentdd22c2132e58ba4ac960337efc0f843c12f58780 (diff)
downloadgnunet-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.c51
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
601resend: 611resend:
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 */
1208static int 1219static int
1209unix_transport_server_start (void *cls) 1220unix_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);