MINOR: proto-tcp: make use of connect(AF_UNSPEC) for the pause

Currently the suspend/resume mechanism for listeners only works on Linux
and we resort to a number of tricks involving shutdown+listen+shutdown
to try to detect failures on other operating systems that do not support
it. But on Linux connect(AF_UNSPEC) also works pretty well and is much
cleaner. It still doesn't work on other operating systems but the error
is easier to detect and appears safer. So let's switch to this.
This commit is contained in:
Willy Tarreau 2020-10-13 16:34:19 +02:00
parent 7c9f756dcc
commit 8b6fc3d10e

View File

@ -770,17 +770,12 @@ static void tcp_disable_listener(struct listener *l)
*/ */
static int tcp_suspend_receiver(struct receiver *rx) static int tcp_suspend_receiver(struct receiver *rx)
{ {
struct listener *l = LIST_ELEM(rx, struct listener *, rx);
socklen_t opt_val, opt_len; socklen_t opt_val, opt_len;
struct sockaddr sa;
if (shutdown(rx->fd, SHUT_WR) != 0) sa.sa_family = AF_UNSPEC;
goto check_already_done; /* usually Solaris fails here */ if (connect(rx->fd, &sa, sizeof(sa)) < 0)
goto check_already_done;
if (listen(rx->fd, listener_backlog(l)) != 0)
goto check_already_done; /* Usually OpenBSD fails here */
if (shutdown(rx->fd, SHUT_RD) != 0)
goto check_already_done; /* show always be OK */
fd_stop_recv(rx->fd); fd_stop_recv(rx->fd);
return 1; return 1;