Get number of bytes available in PeekNamedPipe (take 2)
Uwe Bonnes
bon at elektron.ikp.physik.tu-darmstadt.de
Tue Jul 23 14:59:04 CDT 2002
Hallo,
on Alexandre's request here a patch to get the number of bytes available for
read in PeekNamedPipe, doing the fd manipulation on the client side.
As I don't have a test target, I don't feel yet like filling lpvBuffer and I
don't yet have an idea how to do that. I looked at the kernel sources and
lseek unconditionally returns error on pipe. So how can we read the pipe and
get the filepointer back to the original position afterwards?
Long Changelog:
wine/server/protocol.def
Define a FD_TYPE_PIPE
wine/server/file.c: get_handle_fd
On type FD_TYPE_PIPE check other end of type
wine/server/pipe.c, wine/server/named_pipe.c: get_file_info
Return FD_TYPE_PIPE
dlls/kernel/sync.c: PeekNamedPipe
Use FIONREAD to get number of bytes available to read
Changelog:
wine/server/protocol.def, wine/server/file.c,
wine/server/pipe.c, wine/server/named_pipe.c, dlls/kernel/sync.c:
Fill lpcbAvail for PeekNamedPipe
--
Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Free Software: If you contribute nothing, expect nothing
--
Index: wine/server/protocol.def
===================================================================
RCS file: /home/wine/wine/server/protocol.def,v
retrieving revision 1.39
diff -u -r1.39 protocol.def
--- wine/server/protocol.def 2 Jun 2002 21:22:22 -0000 1.39
+++ wine/server/protocol.def 23 Jul 2002 19:57:11 -0000
@@ -603,7 +603,8 @@
FD_TYPE_DEFAULT,
FD_TYPE_CONSOLE,
FD_TYPE_SOCKET,
- FD_TYPE_SMB
+ FD_TYPE_SMB,
+ FD_TYPE_PIPE
};
#define FD_FLAG_OVERLAPPED 0x01
#define FD_FLAG_TIMEOUT 0x02
Index: wine/server/file.c
===================================================================
RCS file: /home/wine/wine/server/file.c,v
retrieving revision 1.58
diff -u -r1.58 file.c
--- wine/server/file.c 30 May 2002 20:12:58 -0000 1.58
+++ wine/server/file.c 23 Jul 2002 19:57:11 -0000
@@ -644,7 +644,11 @@
send_client_fd( current->process, fd, req->handle );
}
reply->type = obj->ops->get_file_info( obj, NULL, &reply->flags );
- release_object( obj );
+ if (reply->type == FD_TYPE_PIPE)
+ /* validate that the other end of the pipe is alive*/
+ if ((fd = obj->ops->get_fd( obj )) == -1)
+ reply->fd = -1;
+ release_object( obj );
}
}
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 23 Jul 2002 19:57:11 -0000
@@ -155,7 +155,7 @@
reply->serial = 0;
}
*flags = 0;
- return FD_TYPE_DEFAULT;
+ return FD_TYPE_PIPE;
}
static void pipe_destroy( struct object *obj )
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 23 Jul 2002 19:57:11 -0000
@@ -215,7 +215,7 @@
reply->serial = 0;
}
*flags = 0;
- return FD_TYPE_DEFAULT;
+ return FD_TYPE_PIPE;
}
static struct named_pipe *create_named_pipe( const WCHAR *name, size_t len )
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 23 Jul 2002 19:57:12 -0000
@@ -21,6 +21,9 @@
#include "config.h"
#include <string.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <errno.h>
#include "winbase.h"
#include "winerror.h"
@@ -28,6 +31,7 @@
#include "wine/server.h"
#include "wine/unicode.h"
+#include "file.h"
#include "wine/debug.h"
@@ -530,9 +534,28 @@
BOOL WINAPI PeekNamedPipe( HANDLE hPipe, LPVOID lpvBuffer, DWORD cbBuffer,
LPDWORD lpcbRead, LPDWORD lpcbAvail, LPDWORD lpcbMessage )
{
- FIXME("(%08x, %p, %08lx, %p, %p, %p): stub\n",
- hPipe, lpvBuffer, cbBuffer, lpcbRead, lpcbAvail, lpcbMessage);
+ int avail=0,fd;
+
+ 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)
+ {
+ TRACE("FINOREAD failed reason: %s\n",strerror(errno));
+ return FALSE;
+ }
+ else
+ close(fd);
+ TRACE(" 0x%08x bytes available\n", avail );
+ if (!lpvBuffer && lpcbAvail)
+ {
+ *lpcbAvail= avail;
+ return TRUE;
+ }
+
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ FIXME("function not implemented\n");
return FALSE;
}
More information about the wine-patches
mailing list