--- libev/ev_select.c 2008/03/16 16:38:23 1.28 +++ libev/ev_select.c 2008/05/20 19:26:45 1.29 @@ -98,7 +98,7 @@ int word = fd / NFDBITS; fd_mask mask = 1UL << (fd % NFDBITS); - if (expect_false (vec_max < word + 1)) + if (expect_false (vec_max <= word)) { int new_max = word + 1; @@ -147,6 +147,29 @@ #if EV_SELECT_IS_WINSOCKET errno = WSAGetLastError (); #endif + #ifdef WSABASEERR + /* on windows, select returns incompatible error codes, fix this */ + if (errno >= WSABASEERR && errno < WSABASEERR + 1000) + if (errno == WSAENOTSOCK) + errno = EBADF; + else + errno -= WSABASEERR; + #endif + + #ifdef _WIN32 + /* select on windows errornously returns EINVAL when no fd sets have been + * provided (this is documented). what microsoft doesn't tell you that this bug + * exists even when the fd sets are provided, so we have to check for this bug + * here and emulate by sleeping manually. + * we also get EINVAL when the timeout is invalid, but we ignore this case here + * and assume that EINVAL always means: you have to wait manually. + */ + if (errno == EINVAL) + { + ev_sleep (timeout); + return; + } + #endif if (errno == EBADF) fd_ebadf (EV_A);