Jacek Caban : ntdll: Always use server ioctl for FSCTL_PIPE_PEEK.
Alexandre Julliard
julliard at winehq.org
Thu Oct 5 14:59:35 CDT 2017
Module: wine
Branch: master
Commit: 1e87417e7f4bd2d995e67113b5562c67329b5656
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e87417e7f4bd2d995e67113b5562c67329b5656
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Oct 5 14:30:36 2017 +0200
ntdll: Always use server ioctl for FSCTL_PIPE_PEEK.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/file.c | 63 -------------------------------------------------
dlls/ntdll/tests/file.c | 8 +++++++
2 files changed, 8 insertions(+), 63 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 217b678..35fd2c1 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1699,69 +1699,6 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
if (!status) status = DIR_unmount_device( handle );
return status;
- case FSCTL_PIPE_PEEK:
- {
- FILE_PIPE_PEEK_BUFFER *buffer = out_buffer;
- int avail = 0, fd, needs_close;
-
- if (out_size < FIELD_OFFSET( FILE_PIPE_PEEK_BUFFER, Data ))
- {
- status = STATUS_INFO_LENGTH_MISMATCH;
- break;
- }
-
- if ((status = server_get_unix_fd( handle, FILE_READ_DATA, &fd, &needs_close, NULL, NULL )))
- {
- if (status == STATUS_BAD_DEVICE_TYPE)
- return server_ioctl_file( handle, event, apc, apc_context, io, code,
- in_buffer, in_size, out_buffer, out_size );
- break;
- }
-
-#ifdef FIONREAD
- if (ioctl( fd, FIONREAD, &avail ) != 0)
- {
- TRACE("FIONREAD failed reason: %s\n",strerror(errno));
- if (needs_close) close( fd );
- status = FILE_GetNtStatus();
- break;
- }
-#endif
- if (!avail) /* check for closed pipe */
- {
- struct pollfd pollfd;
- int ret;
-
- pollfd.fd = fd;
- pollfd.events = POLLIN;
- pollfd.revents = 0;
- ret = poll( &pollfd, 1, 0 );
- if (ret == -1 || (ret == 1 && (pollfd.revents & (POLLHUP|POLLERR))))
- {
- if (needs_close) close( fd );
- status = STATUS_PIPE_BROKEN;
- break;
- }
- }
- buffer->NamedPipeState = 0; /* FIXME */
- buffer->ReadDataAvailable = avail;
- buffer->NumberOfMessages = 0; /* FIXME */
- buffer->MessageLength = 0; /* FIXME */
- io->Information = FIELD_OFFSET( FILE_PIPE_PEEK_BUFFER, Data );
- status = STATUS_SUCCESS;
- if (avail)
- {
- ULONG data_size = out_size - FIELD_OFFSET( FILE_PIPE_PEEK_BUFFER, Data );
- if (data_size)
- {
- int res = recv( fd, buffer->Data, data_size, MSG_PEEK );
- if (res >= 0) io->Information += res;
- }
- }
- if (needs_close) close( fd );
- }
- break;
-
case FSCTL_PIPE_DISCONNECT:
status = server_ioctl_file( handle, event, apc, apc_context, io, code,
in_buffer, in_size, out_buffer, out_size );
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index ff27d98..f88d16b 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -4179,6 +4179,7 @@ static void test_read_write(void)
static void test_ioctl(void)
{
HANDLE event = CreateEventA(NULL, TRUE, FALSE, NULL);
+ FILE_PIPE_PEEK_BUFFER peek_buf;
IO_STATUS_BLOCK iosb;
HANDLE file;
NTSTATUS status;
@@ -4195,6 +4196,13 @@ static void test_ioctl(void)
status = pNtFsControlFile(file, (HANDLE)0xdeadbeef, NULL, NULL, &iosb, 0xdeadbeef, 0, 0, 0, 0);
ok(status == STATUS_INVALID_HANDLE, "NtFsControlFile returned %x\n", status);
+ memset(&iosb, 0x55, sizeof(iosb));
+ status = NtFsControlFile(file, NULL, NULL, NULL, &iosb, FSCTL_PIPE_PEEK, NULL, 0,
+ &peek_buf, sizeof(peek_buf));
+ todo_wine
+ ok(status == STATUS_INVALID_DEVICE_REQUEST, "NtFsControlFile failed: %x\n", status);
+ ok(iosb.Status == 0x55555555, "iosb.Status = %x\n", iosb.Status);
+
CloseHandle(event);
CloseHandle(file);
}
More information about the wine-cvs
mailing list