gcconfig.h - Add weak attribute to avoid __data_start undefined messages on dlopen
[mono.git] / mono / utils / mono-poll.c
index 66d61a831e9c53747d1a2b46790fb47ff8439033..f353fc53af4de7011b548af2edfcd3a91d82824b 100644 (file)
@@ -1,6 +1,7 @@
 #include "mono-poll.h"
+#include <errno.h>
 
-#ifdef HAVE_POLL
+#if defined(HAVE_POLL) && !defined(__APPLE__)
 int
 mono_poll (mono_pollfd *ufds, unsigned int nfds, int timeout)
 {
@@ -35,7 +36,7 @@ mono_poll (mono_pollfd *ufds, unsigned int nfds, int timeout)
                if (fd < 0)
                        continue;
 
-#ifdef PLATFORM_WIN32
+#ifdef HOST_WIN32
                if (nexc >= FD_SETSIZE) {
                        ufds [i].revents = MONO_POLLNVAL;
                        return 1;
@@ -62,8 +63,25 @@ mono_poll (mono_pollfd *ufds, unsigned int nfds, int timeout)
        }
 
        affected = select (maxfd + 1, &rfds, &wfds, &efds, tvptr);
-       if (affected == -1) /* EBADF should be translated to POLLNVAL */
+       if (affected == -1) {
+#ifdef HOST_WIN32
+               int error = WSAGetLastError ();
+               switch (error) {
+               case WSAEFAULT: errno = EFAULT; break;
+               case WSAEINVAL: errno = EINVAL; break;
+               case WSAEINTR: errno = EINTR; break;
+               /* case WSAEINPROGRESS: errno = EINPROGRESS; break; */
+               case WSAEINPROGRESS: errno = EINTR; break;
+               case WSAENOTSOCK: errno = EBADF; break;
+#ifdef ENOSR
+               case WSAENETDOWN: errno = ENOSR; break;
+#endif
+               default: errno = 0;
+               }
+#endif
+
                return -1;
+       }
 
        count = 0;
        for (i = 0; i < nfds && affected > 0; i++) {