]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
multi: handle connection state winsock events
authorMarc Hoersken <info@marc-hoersken.de>
Wed, 26 Aug 2020 20:13:21 +0000 (22:13 +0200)
committerMarc Hoersken <info@marc-hoersken.de>
Fri, 28 Aug 2020 15:57:52 +0000 (17:57 +0200)
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

lib/multi.c

index f4448f7c45a3dbd99291fe6291662226d07b14d0..2a91246486956137f2ff72147abddab1fc93c082 100644 (file)
@@ -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;