]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: proto-tcp: make use of connect(AF_UNSPEC) for the pause
authorWilly Tarreau <w@1wt.eu>
Tue, 13 Oct 2020 14:34:19 +0000 (16:34 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 13 Oct 2020 16:15:33 +0000 (18:15 +0200)
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.

src/proto_tcp.c

index 9e6a3d7226035306a03e6fba9da6966f32de4107..aadac7c07b105fee48822cf7b4907d3befb79499 100644 (file)
@@ -770,17 +770,12 @@ static void tcp_disable_listener(struct listener *l)
  */
 static int tcp_suspend_receiver(struct receiver *rx)
 {
-       struct listener *l = LIST_ELEM(rx, struct listener *, rx);
        socklen_t opt_val, opt_len;
+       struct sockaddr sa;
 
-       if (shutdown(rx->fd, SHUT_WR) != 0)
-               goto check_already_done; /* usually Solaris fails here */
-
-       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 */
+       sa.sa_family = AF_UNSPEC;
+       if (connect(rx->fd, &sa, sizeof(sa)) < 0)
+               goto check_already_done;
 
        fd_stop_recv(rx->fd);
        return 1;