2 * (c) The GRASP/AQUA Project, Glasgow University, 1994-2002
4 * hWaitForInput Runtime Support
7 /* select and supporting types is not Posix */
8 /* #include "PosixSource.h" */
12 * inputReady(fd) checks to see whether input is available on the file
13 * descriptor 'fd'. Input meaning 'can I safely read at least a
14 * *character* from this file object without blocking?'
17 inputReady(int fd, int msecs, int isSock)
20 #ifndef mingw32_HOST_OS
32 /* select() will consider the descriptor set in the range of 0 to
36 tv.tv_sec = msecs / 1000;
37 tv.tv_usec = (msecs % 1000) * 1000;
39 while ((ready = select(maxfd, &rfd, NULL, NULL, &tv)) < 0 ) {
40 if (errno != EINTR ) {
45 /* 1 => Input ready, 0 => not ready, -1 => error */
48 #ifdef mingw32_HOST_OS
51 HANDLE hFile = (HANDLE)_get_osfhandle(fd);
54 // WaitForMultipleObjects() works for Console input, but it
55 // doesn't work for pipes (it always returns WAIT_OBJECT_0
56 // even when no data is available). There doesn't seem to be
57 // an easy way to distinguish the two kinds of HANDLE, so we
58 // try to detect pipe input first, and if that fails we try
59 // WaitForMultipleObjects().
61 rc = PeekNamedPipe( hFile, NULL, 0, NULL, &avail, NULL );
70 if (rc == ERROR_BROKEN_PIPE) {
71 return 1; // this is probably what we want
73 if (rc != ERROR_INVALID_HANDLE) {
78 rc = WaitForMultipleObjects( 1,
83 /* 1 => Input ready, 0 => not ready, -1 => error */
85 case WAIT_TIMEOUT: return 0;
86 case WAIT_OBJECT_0: return 1;