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