|
@@ -963,6 +963,27 @@ make_socket_reuseable(tor_socket_t sock)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+/** Max backlog to pass to listen. We start at */
|
|
|
+static int listen_limit = INT_MAX;
|
|
|
+
|
|
|
+/* Listen on <b>fd</b> with appropriate backlog. Return as for listen. */
|
|
|
+static int
|
|
|
+tor_listen(tor_socket_t fd)
|
|
|
+{
|
|
|
+ int r;
|
|
|
+
|
|
|
+ if ((r = listen(fd, listen_limit)) < 0) {
|
|
|
+ if (listen_limit == SOMAXCONN)
|
|
|
+ return r;
|
|
|
+ if ((r = listen(fd, SOMAXCONN)) == 0) {
|
|
|
+ listen_limit = SOMAXCONN;
|
|
|
+ log_warn(LD_NET, "Setting listen backlog to INT_MAX connections "
|
|
|
+ "didn't work, but SOMAXCONN did. Lowering backlog limit.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return r;
|
|
|
+}
|
|
|
+
|
|
|
/** Bind a new non-blocking socket listening to the socket described
|
|
|
* by <b>listensockaddr</b>.
|
|
|
*
|
|
@@ -1045,7 +1066,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
|
|
|
}
|
|
|
|
|
|
if (is_tcp) {
|
|
|
- if (listen(s,SOMAXCONN) < 0) {
|
|
|
+ if (tor_listen(s) < 0) {
|
|
|
log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort,
|
|
|
tor_socket_strerror(tor_socket_errno(s)));
|
|
|
goto err;
|