summaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
authorKristján Valur Jónsson <sweskman@gmail.com>2021-03-26 14:40:32 +0000
committermichael-grunder <michael.grunder@gmail.com>2022-06-26 13:19:33 -0700
commit5e002bc21c6b7483592cd66417bf7a374590b973 (patch)
tree19e5aa2b10816bbf78e780f0b9cd52695ca2e92d /net.c
parent5d68ad2f48e908ff7fe2debe22f71182c2150547 (diff)
Support failed async connects on windows.
Diffstat (limited to 'net.c')
-rw-r--r--net.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/net.c b/net.c
index c6b0e5d..d9e6d7a 100644
--- a/net.c
+++ b/net.c
@@ -277,12 +277,29 @@ int redisCheckConnectDone(redisContext *c, int *completed) {
*completed = 1;
return REDIS_OK;
}
- switch (errno) {
+ int error = errno;
+ if (error == EINPROGRESS)
+ {
+ /* must check error to see if connect failed. Get the socket error */
+ int fail, so_error, optlen;
+ optlen = sizeof(so_error);
+ fail = getsockopt(c->fd, SOL_SOCKET, SO_ERROR, &so_error, &optlen);
+ if (fail == 0) {
+ if (so_error == 0) {
+ /* ocket is connected! */
+ *completed = 1;
+ return REDIS_OK;
+ }
+ /* connection error; */
+ errno = so_error;
+ error = so_error;
+ }
+ }
+ switch (error) {
case EISCONN:
*completed = 1;
return REDIS_OK;
case EALREADY:
- case EINPROGRESS:
case EWOULDBLOCK:
*completed = 0;
return REDIS_OK;