diff options
author | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2019-12-23 18:04:01 +0900 |
---|---|---|
committer | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2019-12-23 18:04:01 +0900 |
commit | a140ff725af20d55f80463969a415bbd85ff63bc (patch) | |
tree | 63e3cae02309416ff5c773c10be6b8fd2718dd04 /src/transport/gnunet-communicator-tcp.c | |
parent | ad16610d60141848958c9a4838cd4b706a2d4f2b (diff) | |
download | gnunet-a140ff725af20d55f80463969a415bbd85ff63bc.tar.gz gnunet-a140ff725af20d55f80463969a415bbd85ff63bc.zip |
call listen before accept
Diffstat (limited to 'src/transport/gnunet-communicator-tcp.c')
-rw-r--r-- | src/transport/gnunet-communicator-tcp.c | 19 |
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); |