Hallo, OUCH, I didn't check whether the cut and paste to named_pipe.c did compile... Appended patch implements returning the number of bytes available for reading in PeekNamedPipe. With this functionality, Xilinx Webpack can detect the result of spawned subprocesses. The changes to wine/server/named_pipe.c are not tested. Changelog: wine/server/pipe.c, wine/server/named_pipe.c: xxx_get_info Return the number of bytes available for reading wine/dlls/kernel/sync.c: PeekNamedPipe Use get_file_info to get the number of bytes available for reading Bye -- Uwe Bonnes bon@elektron.ikp.physik.tu-darmstadt.de Free Software: If you contribute nothing, expect nothing -- Index: wine/server/pipe.c =================================================================== RCS file: /home/wine/wine/server/pipe.c,v retrieving revision 1.24 diff -u -r1.24 pipe.c --- wine/server/pipe.c 30 May 2002 20:12:58 -0000 1.24 +++ wine/server/pipe.c 21 Jul 2002 21:12:03 -0000 @@ -30,6 +30,7 @@ #endif #include <sys/time.h> #include <sys/types.h> +#include <sys/ioctl.h> #include <time.h> #include <unistd.h> @@ -141,6 +142,21 @@ static int pipe_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags ) { + + int avail=0, fd; + assert( obj->ops == &pipe_ops ); + /* On Linux fstat on a file descriptor always returns 0 + Use FIONREAD instead*/ + fd = obj->ops->get_fd( obj ); + if (fd == -1) + { + if (get_error() != STATUS_PIPE_BROKEN ) + fprintf(stderr, "cant get file descriptor for reason %d\n",get_error() ); + } + else if (ioctl(fd,FIONREAD, &avail ) != 0) + { + fprintf(stderr, "can't get size for fd %08x %s\n",fd, strerror(errno)); + } if (reply) { reply->type = FILE_TYPE_PIPE; @@ -148,7 +164,7 @@ reply->access_time = 0; reply->write_time = 0; reply->size_high = 0; - reply->size_low = 0; + reply->size_low = avail; reply->links = 0; reply->index_high = 0; reply->index_low = 0; Index: wine/server/named_pipe.c =================================================================== RCS file: /home/wine/wine/server/named_pipe.c,v retrieving revision 1.14 diff -u -r1.14 named_pipe.c --- wine/server/named_pipe.c 31 May 2002 23:06:53 -0000 1.14 +++ wine/server/named_pipe.c 21 Jul 2002 21:12:03 -0000 @@ -33,6 +33,10 @@ #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> +#include <sys/ioctl.h> +#ifdef HAVE_SYS_ERRNO_H +#include <sys/errno.h> +#endif #include <time.h> #include <unistd.h> @@ -201,6 +205,21 @@ static int pipe_user_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags ) { + + int avail=0, fd; + assert( obj->ops == &pipe_user_ops ); + /* On Linux fstat on a file descriptor always returns 0 + Use FIONREAD instead*/ + fd = obj->ops->get_fd( obj ); + if (fd == -1) + { + if (get_error() != STATUS_PIPE_BROKEN ) + fprintf(stderr, "cant get file descriptor for reason %d\n",get_error() ); + } + else if (ioctl(fd,FIONREAD, &avail ) != 0) + { + fprintf(stderr, "can't get size for fd %08x %s\n",fd, strerror(errno)); + } if (reply) { reply->type = FILE_TYPE_PIPE; @@ -208,7 +227,7 @@ reply->access_time = 0; reply->write_time = 0; reply->size_high = 0; - reply->size_low = 0; + reply->size_low = avail; reply->links = 0; reply->index_high = 0; reply->index_low = 0; Index: wine/dlls/kernel/sync.c =================================================================== RCS file: /home/wine/wine/dlls/kernel/sync.c,v retrieving revision 1.20 diff -u -r1.20 sync.c --- wine/dlls/kernel/sync.c 31 May 2002 23:25:48 -0000 1.20 +++ wine/dlls/kernel/sync.c 21 Jul 2002 21:12:04 -0000 @@ -25,6 +25,7 @@ #include "winbase.h" #include "winerror.h" #include "winnls.h" +#include <errno.h> #include "wine/server.h" #include "wine/unicode.h" @@ -530,8 +531,32 @@ BOOL WINAPI PeekNamedPipe( HANDLE hPipe, LPVOID lpvBuffer, DWORD cbBuffer, LPDWORD lpcbRead, LPDWORD lpcbAvail, LPDWORD lpcbMessage ) { - FIXME("(%08x, %p, %08lx, %p, %p, %p): stub\n", + INT avail; + unsigned int err; + + TRACE("(%08x, %p, %08lx, %p, %p, %p): stub\n", hPipe, lpvBuffer, cbBuffer, lpcbRead, lpcbAvail, lpcbMessage); + + SERVER_START_REQ( get_file_info ) + { + req->handle = hPipe; + if (!(err =wine_server_call( req ))) + avail = reply->size_low; + } + SERVER_END_REQ; + if (err) + { + SetLastError( RtlNtStatusToDosError(err) ); + TRACE("BON: returning error %ld \n", GetLastError()); + return FALSE; + } + TRACE("BON: %08x bytes available\n", avail); + if (!lpvBuffer && lpcbAvail) /* only number of bytes available requested */ + { + *lpcbAvail= avail; + return TRUE; + } + FIXME("function not implemented\n"); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; }