From: Willy Tarreau Date: Tue, 13 Oct 2020 15:42:21 +0000 (+0200) Subject: CLEANUP: tcp: make use of sock_accept_conn() where relevant X-Git-Tag: v2.3-dev7~48 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3e12de2cc66038115ec4cd9ec381045702e684e0;p=thirdparty%2Fhaproxy.git CLEANUP: tcp: make use of sock_accept_conn() where relevant This allows to get rid of two getsockopt(SO_ACCEPTCONN). --- diff --git a/src/proto_tcp.c b/src/proto_tcp.c index fbc99c939f..2b5367b368 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -570,7 +570,6 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen) { int fd, err; int ready; - socklen_t ready_len; char *msg = NULL; err = ERR_NONE; @@ -678,10 +677,8 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen) } } #endif - ready = 0; - ready_len = sizeof(ready); - if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &ready, &ready_len) == -1) - ready = 0; + + ready = sock_accept_conn(&listener->rx) > 0; if (!ready && /* only listen if not already done by external process */ listen(fd, listener_backlog(listener)) == -1) { @@ -772,8 +769,8 @@ static void tcp_disable_listener(struct listener *l) */ static int tcp_suspend_receiver(struct receiver *rx) { - socklen_t opt_val, opt_len; struct sockaddr sa; + int ret; sa.sa_family = AF_UNSPEC; if (connect(rx->fd, &sa, sizeof(sa)) < 0) @@ -787,19 +784,14 @@ static int tcp_suspend_receiver(struct receiver *rx) * dealing with a socket that is shared with other processes doing the * same. Let's check if it's still accepting connections. */ - opt_val = 0; - opt_len = sizeof(opt_val); - if (getsockopt(rx->fd, SOL_SOCKET, SO_ACCEPTCONN, &opt_val, &opt_len) == -1) { - fd_stop_recv(rx->fd); - return 0; /* the socket is really unrecoverable */ - } - - if (!opt_val) { + ret = sock_accept_conn(rx); + if (ret <= 0) { + /* unrecoverable or paused by another process */ fd_stop_recv(rx->fd); - return 1; /* already paused by another process */ + return ret == 0; } - /* something looks fishy here */ + /* still listening, that's not good */ return -1; }