Changelog: dlls/kernel/sync.c: PeeknamedPipe Use poll() to see if pipe is still alife We probably need to check with configure whether we have poll(). However I go out to vacation and want to get this part out before. With this patch and native msvcrt, I can run processes from the Xilinx Webpack "Processes for Current Source" window. Bye -- Uwe Bonnes bon@elektron.ikp.physik.tu-darmstadt.de Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt --------- Tel. 06151 162516 -------- Fax. 06151 164321 ---------- Index: wine/dlls/kernel/sync.c =================================================================== RCS file: /home/wine/wine/dlls/kernel/sync.c,v retrieving revision 1.22 diff -u -r1.22 sync.c --- wine/dlls/kernel/sync.c 31 Jul 2002 20:04:20 -0000 1.22 +++ wine/dlls/kernel/sync.c 3 Aug 2002 00:17:22 -0000 @@ -26,6 +26,7 @@ #ifdef HAVE_SYS_IOCTL_H #include <sys/ioctl.h> #endif +#include <sys/poll.h> #include "winbase.h" #include "winerror.h" @@ -37,7 +38,7 @@ #include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(win32); +WINE_DEFAULT_DEBUG_CHANNEL(pipe); /* * Events @@ -538,16 +539,40 @@ { #ifdef FIONREAD int avail=0,fd; + struct pollfd pollfd; fd = FILE_GetUnixHandle(hPipe, GENERIC_READ); if (fd == -1) return FALSE; - /* On linux fstat on pipes doesn't work */ - if (ioctl(fd,FIONREAD, &avail ) != 0) + pollfd.fd = fd; + pollfd.events = POLLIN; + pollfd.revents = 0; + switch (poll(&pollfd, 1, 0)) { - TRACE("FIONREAD failed reason: %s\n",strerror(errno)); - close(fd); - return FALSE; + case 1: + /* got something */ + if (pollfd.revents & (POLLHUP | POLLERR)) + { + /* pipe is broken */ + TRACE("POLLHUP | POLLERR\n"); + goto error; + } + else + { + /* On linux fstat on pipes doesn't work */ + if (ioctl(fd,FIONREAD, &avail ) != 0) + { + TRACE("FINOREAD failed reason: %s\n",strerror(errno)); + goto error; + } + } + break; + case 0: + break; + case -1: + TRACE("handle 0x%08x fd 0x%08x poll failed: %s\n", + hPipe, fd, strerror(errno)); + goto error; } close(fd); TRACE(" 0x%08x bytes available\n", avail ); @@ -556,6 +581,16 @@ *lpcbAvail= avail; return TRUE; } + else + { + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + FIXME("function not implemented\n"); + return FALSE; + } + error: + close(fd); + SetLastError(ERROR_BROKEN_PIPE); + return FALSE; #endif /* defined(FIONREAD) */ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);