Implement PeekNamedPipe properly
Mike McCormack
mike at codeweavers.com
Wed Feb 11 21:38:31 CST 2004
Adapted rewind's PeekNamedPipe patch to work in Wine.
http://cvs.sourceforge.net/viewcvs.py/rewind/rewind/dlls/kernel/sync.c?r1=1.21&r2=1.22
Mike
ChangeLog:
David Hammerton <david at transgaming.com>
Mike McCormack <mike at codeweavers.com>
* Implement PeekNamedPipe
-------------- next part --------------
Index: dlls/kernel/sync.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/sync.c,v
retrieving revision 1.46
diff -u -r1.46 sync.c
--- dlls/kernel/sync.c 8 Dec 2003 21:58:55 -0000 1.46
+++ dlls/kernel/sync.c 12 Feb 2004 02:32:54 -0000
@@ -32,6 +32,9 @@
#ifdef HAVE_SYS_POLL_H
#include <sys/poll.h>
#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
#include <stdarg.h>
#include <stdio.h>
@@ -1117,13 +1120,26 @@
return FALSE;
}
}
- wine_server_release_fd( hPipe, fd );
TRACE(" 0x%08x bytes available\n", avail );
- if (!lpvBuffer && lpcbAvail)
- {
- *lpcbAvail= avail;
- return TRUE;
- }
+ ret = TRUE;
+ if (lpcbAvail)
+ *lpcbAvail = avail;
+ if (lpcbRead)
+ *lpcbRead = 0;
+ if (avail && lpvBuffer)
+ {
+ int readbytes = (avail < cbBuffer) ? avail : cbBuffer;
+ readbytes = recv(fd, lpvBuffer, readbytes, MSG_PEEK);
+ if (readbytes < 0)
+ {
+ ERR("failed to peek socket (%d)\n", errno);
+ ret = FALSE;
+ }
+ else if (lpcbRead)
+ *lpcbRead = readbytes;
+ }
+ wine_server_release_fd( hPipe, fd );
+ return ret;
#endif /* defined(FIONREAD) */
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
More information about the wine-patches
mailing list