aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchanzenbach, Martin <mschanzenbach@posteo.de>2019-12-23 18:04:01 +0900
committerSchanzenbach, Martin <mschanzenbach@posteo.de>2019-12-23 18:04:01 +0900
commita140ff725af20d55f80463969a415bbd85ff63bc (patch)
tree63e3cae02309416ff5c773c10be6b8fd2718dd04 /src
parentad16610d60141848958c9a4838cd4b706a2d4f2b (diff)
downloadgnunet-a140ff725af20d55f80463969a415bbd85ff63bc.tar.gz
gnunet-a140ff725af20d55f80463969a415bbd85ff63bc.zip
call listen before accept
Diffstat (limited to 'src')
-rw-r--r--src/transport/gnunet-communicator-tcp.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/transport/gnunet-communicator-tcp.c b/src/transport/gnunet-communicator-tcp.c
index 70cbb731a..b577a96a6 100644
--- a/src/transport/gnunet-communicator-tcp.c
+++ b/src/transport/gnunet-communicator-tcp.c
@@ -1121,6 +1121,9 @@ tcp_address_to_sockaddr (const char *bindto, socklen_t *sock_len)
1121 i4 = GNUNET_malloc (sizeof(struct sockaddr_in)); 1121 i4 = GNUNET_malloc (sizeof(struct sockaddr_in));
1122 i4->sin_family = AF_INET; 1122 i4->sin_family = AF_INET;
1123 i4->sin_port = htons ((uint16_t) port); 1123 i4->sin_port = htons ((uint16_t) port);
1124#if HAVE_SOCKADDR_IN_SIN_LEN
1125 sa4.sin_len = sizeof(sizeof(struct sockaddr_in));
1126#endif
1124 *sock_len = sizeof(struct sockaddr_in); 1127 *sock_len = sizeof(struct sockaddr_in);
1125 in = (struct sockaddr *) i4; 1128 in = (struct sockaddr *) i4;
1126 } 1129 }
@@ -1131,6 +1134,9 @@ tcp_address_to_sockaddr (const char *bindto, socklen_t *sock_len)
1131 i6 = GNUNET_malloc (sizeof(struct sockaddr_in6)); 1134 i6 = GNUNET_malloc (sizeof(struct sockaddr_in6));
1132 i6->sin6_family = AF_INET6; 1135 i6->sin6_family = AF_INET6;
1133 i6->sin6_port = htons ((uint16_t) port); 1136 i6->sin6_port = htons ((uint16_t) port);
1137#if HAVE_SOCKADDR_IN_SIN_LEN
1138 sa6.sin6_len = sizeof(sizeof(struct sockaddr_in6));
1139#endif
1134 *sock_len = sizeof(struct sockaddr_in6); 1140 *sock_len = sizeof(struct sockaddr_in6);
1135 in = (struct sockaddr *) i6; 1141 in = (struct sockaddr *) i6;
1136 } 1142 }
@@ -1728,7 +1734,7 @@ listen_cb (void *cls)
1728 addrlen = sizeof(in); 1734 addrlen = sizeof(in);
1729 memset (&in, 0, sizeof(in)); 1735 memset (&in, 0, sizeof(in));
1730 sock = GNUNET_NETWORK_socket_accept (listen_sock, 1736 sock = GNUNET_NETWORK_socket_accept (listen_sock,
1731 (struct sockaddr *) &in, 1737 (struct sockaddr*) &in,
1732 &addrlen); 1738 &addrlen);
1733 if ((NULL == sock) && ((EMFILE == errno) || (ENFILE == errno))) 1739 if ((NULL == sock) && ((EMFILE == errno) || (ENFILE == errno)))
1734 return; /* system limit reached, wait until connection goes down */ 1740 return; /* system limit reached, wait until connection goes down */
@@ -2125,6 +2131,17 @@ run (void *cls,
2125 GNUNET_free (bindto); 2131 GNUNET_free (bindto);
2126 return; 2132 return;
2127 } 2133 }
2134 if (GNUNET_OK !=
2135 GNUNET_NETWORK_socket_listen (listen_sock,
2136 5))
2137 {
2138 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
2139 "listen");
2140 GNUNET_NETWORK_socket_close (listen_sock);
2141 listen_sock = NULL;
2142 GNUNET_free (in);
2143 GNUNET_free (bindto);
2144 }
2128 /* We might have bound to port 0, allowing the OS to figure it out; 2145 /* We might have bound to port 0, allowing the OS to figure it out;
2129 thus, get the real IN-address from the socket */ 2146 thus, get the real IN-address from the socket */
2130 sto_len = sizeof(in_sto); 2147 sto_len = sizeof(in_sto);