summaryrefslogtreecommitdiff
path: root/docs/examples/pop3-multi.c
diff options
context:
space:
mode:
authorJay Satiro <raysatiro@yahoo.com>2014-11-14 03:59:46 -0500
committerDaniel Stenberg <daniel@haxx.se>2014-11-15 21:27:20 +0100
commita607f8a20c6c5ac869598753097e3da06165cbd9 (patch)
tree69622fb06a0fc0774a01bed41c3353bed01d2a13 /docs/examples/pop3-multi.c
parented77fdf389cb5a45bc7465a6d08955c7edd3a6cd (diff)
downloadcurl-a607f8a20c6c5ac869598753097e3da06165cbd9.tar.gz
examples: Don't call select() to sleep on windows
Windows does not support using select() for sleeping without a dummy socket. Instead use Windows' Sleep() and sleep for 100ms which is the minimum suggested value in the curl_multi_fdset() doc. Prior to this change the multi examples would exit prematurely since select() would error instead of sleeping when called without an fd. Reported-by: Johan Lantz Bug: http://curl.haxx.se/mail/lib-2014-11/0221.html
Diffstat (limited to 'docs/examples/pop3-multi.c')
-rw-r--r--docs/examples/pop3-multi.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/docs/examples/pop3-multi.c b/docs/examples/pop3-multi.c
index d14d1159b..42142f954 100644
--- a/docs/examples/pop3-multi.c
+++ b/docs/examples/pop3-multi.c
@@ -88,6 +88,7 @@ int main(void)
fd_set fdexcep;
int maxfd = -1;
int rc;
+ CURLMcode mc; /* curl_multi_fdset() return code */
long curl_timeo = -1;
@@ -109,15 +110,32 @@ int main(void)
timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
- /* Get file descriptors from the transfers */
- curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd);
+ /* get file descriptors from the transfers */
+ mc = curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd);
- /* In a real-world program you OF COURSE check the return code of the
- function calls. On success, the value of maxfd is guaranteed to be
- greater or equal than -1. We call select(maxfd + 1, ...), specially in
- case of (maxfd == -1), we call select(0, ...), which is basically equal
- to sleep. */
- rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+ if(mc != CURLM_OK)
+ {
+ fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+ break;
+ }
+
+ /* On success the value of maxfd is guaranteed to be >= -1. We call
+ select(maxfd + 1, ...); specially in case of (maxfd == -1) we call
+ select(0, ...), which is basically equal to sleeping the timeout. On
+ Windows we can't sleep via select without a dummy socket and instead
+ we Sleep() for 100ms which is the minimum suggested value in the
+ curl_multi_fdset() doc. */
+
+#ifdef _WIN32
+ if(maxfd == -1) {
+ Sleep(100);
+ rc = 0;
+ }
+ else
+#endif
+ {
+ rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
+ }
if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
fprintf(stderr,