From 6a69d109fb79fb19663137cf606557d663169373 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sat, 7 Oct 2017 14:36:52 +0100 Subject: [PATCH] Fix identd connections on FreeBSD under TCP Fast Open --- src/src/verify.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/src/verify.c b/src/src/verify.c index ac5eb667b..5c093bf31 100644 --- a/src/src/verify.c +++ b/src/src/verify.c @@ -2702,10 +2702,24 @@ if (ip_connect(sock, host_af, sender_host_address, port, sprintf(CS buffer, "%d , %d\r\n", sender_host_port, interface_port); qlen = Ustrlen(buffer); if (send(sock, buffer, qlen, 0) < 0) - { - DEBUG(D_ident) debug_printf("ident send failed: %s\n", strerror(errno)); - goto END_OFF; - } + if (errno == ENOTCONN) /* seen for TFO on FreeBSD */ + { + struct timeval tv = { .tv_sec = 0, .tv_usec = 500*1000 }; + fd_set s; + + FD_ZERO(&s); FD_SET(sock, &s); + (void) select(sock+1, NULL, (SELECT_ARG2_TYPE *)&s, (SELECT_ARG2_TYPE *)&s, &tv); + if (send(sock, buffer, qlen, 0) < 0) + { + DEBUG(D_ident) debug_printf("ident re-send failed: %s\n", strerror(errno)); + goto END_OFF; + } + } + else + { + DEBUG(D_ident) debug_printf("ident send failed: %s\n", strerror(errno)); + goto END_OFF; + } /* Read a response line. We put it into the rest of the buffer, using several recv() calls if necessary. */ -- 2.25.1