Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
hiredis
Commits
a890d9ce
Unverified
Commit
a890d9ce
authored
Jun 26, 2022
by
Michael Grunder
Committed by
GitHub
Jun 26, 2022
Browse files
Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
Fix async connect on Windows
parents
5d68ad2f
f246ee43
Changes
2
Show whitespace changes
Inline
Side-by-side
net.c
View file @
a890d9ce
...
...
@@ -277,12 +277,28 @@ 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
;
socklen_t
optlen
=
sizeof
(
so_error
);
fail
=
getsockopt
(
c
->
fd
,
SOL_SOCKET
,
SO_ERROR
,
&
so_error
,
&
optlen
);
if
(
fail
==
0
)
{
if
(
so_error
==
0
)
{
/* Socket 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
;
...
...
sockcompat.c
View file @
a890d9ce
...
...
@@ -180,10 +180,17 @@ int win32_connect(SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen)
/* For Winsock connect(), the WSAEWOULDBLOCK error means the same thing as
* EINPROGRESS for POSIX connect(), so we do that translation to keep POSIX
* logic consistent. */
if
(
errno
==
EWOULDBLOCK
)
{
* logic consistent.
* Additionally, WSAALREADY is can be reported as WSAEINVAL to and this is
* translated to EIO. Convert appropriately
*/
int
err
=
errno
;
if
(
err
==
EWOULDBLOCK
)
{
errno
=
EINPROGRESS
;
}
else
if
(
err
==
EIO
)
{
errno
=
EALREADY
;
}
return
ret
!=
SOCKET_ERROR
?
ret
:
-
1
;
}
...
...
@@ -205,6 +212,14 @@ int win32_getsockopt(SOCKET sockfd, int level, int optname, void *optval, sockle
}
else
{
ret
=
getsockopt
(
sockfd
,
level
,
optname
,
(
char
*
)
optval
,
optlen
);
}
if
(
ret
!=
SOCKET_ERROR
&&
level
==
SOL_SOCKET
&&
optname
==
SO_ERROR
)
{
/* translate SO_ERROR codes, if non-zero */
int
err
=
*
(
int
*
)
optval
;
if
(
err
!=
0
)
{
err
=
_wsaErrorToErrno
(
err
);
*
(
int
*
)
optval
=
err
;
}
}
_updateErrno
(
ret
!=
SOCKET_ERROR
);
return
ret
!=
SOCKET_ERROR
?
ret
:
-
1
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment