From 70587641584e4cebca42a8dcd7a6624bd08bc1f2 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Fri, 7 Mar 2014 09:23:46 +0000
Subject: [PATCH] Check exceptions on sockets when select()ing for connect()
 completion since that's what Windows does when a non-blocking connect()
 fails.

Should fix the IPv6 localhost issue.
---
 src/syncterm/conn.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c
index 415d5ffef7..f52349691d 100644
--- a/src/syncterm/conn.c
+++ b/src/syncterm/conn.c
@@ -411,6 +411,7 @@ int conn_socket_connect(struct bbslist *bbs)
 	int				nonblock;
 	struct timeval	tv;
 	fd_set			wfd;
+	fd_set			efd;
 	int				failcode=FAILURE_WHAT_FAILURE;
 	struct addrinfo	hints;
 	struct addrinfo	*res=NULL;
@@ -476,7 +477,9 @@ int conn_socket_connect(struct bbslist *bbs)
 
 						FD_ZERO(&wfd);
 						FD_SET(sock, &wfd);
-						switch(select(sock+1, NULL, &wfd, NULL, &tv)) {
+						FD_ZERO(&efd);
+						FD_SET(sock, &efd);
+						switch(select(sock+1, NULL, &wfd, &efd, &tv)) {
 							case 0:
 								if(kbhit()) {
 									failcode=FAILURE_ABORTED;
@@ -488,11 +491,18 @@ int conn_socket_connect(struct bbslist *bbs)
 								sock=INVALID_SOCKET;
 								continue;
 							case 1:
-								if(socket_check(sock, NULL, NULL, 0))
-									goto connected;
-								closesocket(sock);
-								sock=INVALID_SOCKET;
-								continue;
+								if(FD_ISSET(sock, &efd)) {
+									closesocket(sock);
+									sock=INVALID_SOCKET;
+									continue;
+								}
+								else {
+									if(socket_check(sock, NULL, NULL, 0))
+										goto connected;
+									closesocket(sock);
+									sock=INVALID_SOCKET;
+									continue;
+								}
 							default:
 								break;
 						}
-- 
GitLab