[project @ 2005-03-16 10:55:04 by simonmar]
[ghc-base.git] / cbits / inputReady.c
index 8677f26..2949e94 100644 (file)
@@ -17,7 +17,7 @@ int
 inputReady(int fd, int msecs, int isSock)
 {
     if 
-#ifndef mingw32_TARGET_OS
+#ifndef mingw32_HOST_OS
     ( 1 ) {
 #else
     ( isSock ) {
@@ -34,7 +34,7 @@ inputReady(int fd, int msecs, int isSock)
         */
        maxfd = fd + 1;
        tv.tv_sec  = msecs / 1000;
-       tv.tv_usec = msecs % 1000;
+       tv.tv_usec = (msecs % 1000) * 1000;
        
        while ((ready = select(maxfd, &rfd, NULL, NULL, &tv)) < 0 ) {
            if (errno != EINTR ) {
@@ -45,11 +45,36 @@ inputReady(int fd, int msecs, int isSock)
        /* 1 => Input ready, 0 => not ready, -1 => error */
        return (ready);
     }
-#ifdef mingw32_TARGET_OS
+#ifdef mingw32_HOST_OS
     else {
        DWORD rc;
        HANDLE hFile = (HANDLE)_get_osfhandle(fd);
-       
+       DWORD avail;
+
+       // WaitForMultipleObjects() works for Console input, but it
+       // doesn't work for pipes (it always returns WAIT_OBJECT_0
+       // even when no data is available).  There doesn't seem to be
+       // an easy way to distinguish the two kinds of HANDLE, so we
+       // try to detect pipe input first, and if that fails we try
+       // WaitForMultipleObjects().
+       //
+       rc = PeekNamedPipe( hFile, NULL, 0, NULL, &avail, NULL );
+       if (rc != 0) {
+           if (avail != 0) {
+               return 1;
+           } else {
+               return 0;
+           }
+       } else {
+           rc = GetLastError();
+           if (rc == ERROR_BROKEN_PIPE) {
+               return 1; // this is probably what we want
+           }
+           if (rc != ERROR_INVALID_HANDLE) {
+               return -1;
+           }
+       }
+
        rc = WaitForMultipleObjects( 1,
                                     &hFile,
                                     TRUE,   /* wait all */