Resent: Partial PeekNamedPipe Implementation

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Sun Jul 21 16:16:58 CDT 2002


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 at 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;
 }



More information about the wine-patches mailing list