summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Hoersken <info@marc-hoersken.de>2020-08-26 22:13:21 +0200
committerMarc Hoersken <info@marc-hoersken.de>2020-08-28 17:57:52 +0200
commit003e81e2a3d2e72c2319ef9bd285141fe02e0b26 (patch)
tree620c3e2bdbdbff1cdcd75fd9e1fe704c7c90cbc2
parenta2c85bb8e4ba9fa94b88c7592766763e30379ed2 (diff)
downloadcurl-003e81e2a3d2e72c2319ef9bd285141fe02e0b26.tar.gz
multi: handle connection state winsock events
Learn from the way Cygwin handles and maps the WinSock events to simulate correct and complete poll and select behaviour according to Richard W. Stevens Network Programming book. Reviewed-by: Jay Satiro Reviewed-by: Marcel Raad Follow up to #5634 Closes #5867
-rw-r--r--lib/multi.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/lib/multi.c b/lib/multi.c
index f4448f7c4..2a9124648 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1184,7 +1184,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
#ifdef USE_WINSOCK
if(SOCKET_READABLE(sockbunch[i], 0) > 0)
timeout_ms = 0;
- mask |= FD_READ;
+ mask |= (FD_READ|FD_ACCEPT|FD_CLOSE);
#else
ufds[nfds].fd = sockbunch[i];
ufds[nfds].events = POLLIN;
@@ -1196,7 +1196,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
#ifdef USE_WINSOCK
if(SOCKET_WRITABLE(sockbunch[i], 0) > 0)
timeout_ms = 0;
- mask |= FD_WRITE;
+ mask |= (FD_WRITE|FD_CONNECT|FD_CLOSE);
#else
ufds[nfds].fd = sockbunch[i];
ufds[nfds].events = POLLOUT;
@@ -1226,7 +1226,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
pre_poll.events = 0;
pre_poll.revents = 0;
if(extra_fds[i].events & CURL_WAIT_POLLIN) {
- events |= FD_READ;
+ events |= (FD_READ|FD_ACCEPT|FD_CLOSE);
pre_poll.events |= POLLIN;
}
if(extra_fds[i].events & CURL_WAIT_POLLPRI) {
@@ -1234,7 +1234,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
pre_poll.events |= POLLPRI;
}
if(extra_fds[i].events & CURL_WAIT_POLLOUT) {
- events |= FD_WRITE;
+ events |= (FD_WRITE|FD_CONNECT|FD_CLOSE);
pre_poll.events |= POLLOUT;
}
if(Curl_poll(&pre_poll, 1, 0) > 0) {
@@ -1299,9 +1299,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
mask = extra_fds[i].revents;
if(WSAEnumNetworkEvents(extra_fds[i].fd, multi->wsa_event,
&events) == 0) {
- if(events.lNetworkEvents & FD_READ)
+ if(events.lNetworkEvents & (FD_READ|FD_ACCEPT|FD_CLOSE))
mask |= CURL_WAIT_POLLIN;
- if(events.lNetworkEvents & FD_WRITE)
+ if(events.lNetworkEvents & (FD_WRITE|FD_CONNECT|FD_CLOSE))
mask |= CURL_WAIT_POLLOUT;
if(events.lNetworkEvents & FD_OOB)
mask |= CURL_WAIT_POLLPRI;