Jacek Caban : server: Support FSCTL_PIPE_PEEK in byte mode.
Alexandre Julliard
julliard at winehq.org
Wed Oct 4 15:37:14 CDT 2017
Module: wine
Branch: master
Commit: f68bea526f0edf5abab1e677aaa968dff1c2e51a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f68bea526f0edf5abab1e677aaa968dff1c2e51a
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Oct 4 15:17:52 2017 +0200
server: Support FSCTL_PIPE_PEEK in byte mode.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/named_pipe.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 1ec1ff4..2141f44 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -930,21 +930,33 @@ static int pipe_end_peek( struct pipe_end *pipe_end )
LIST_FOR_EACH_ENTRY( message, &pipe_end->message_queue, struct pipe_message, entry )
avail += message->iosb->in_size - message->read_pos;
+ reply_size = min( reply_size, avail );
- if (avail)
+ if (avail && (pipe_end->flags & NAMED_PIPE_MESSAGE_STREAM_WRITE))
{
message = LIST_ENTRY( list_head(&pipe_end->message_queue), struct pipe_message, entry );
message_length = message->iosb->in_size - message->read_pos;
reply_size = min( reply_size, message_length );
}
- else reply_size = 0;
if (!(buffer = set_reply_data_size( offsetof( FILE_PIPE_PEEK_BUFFER, Data[reply_size] )))) return 0;
buffer->NamedPipeState = 0; /* FIXME */
buffer->ReadDataAvailable = avail;
buffer->NumberOfMessages = 0; /* FIXME */
buffer->MessageLength = message_length;
- if (reply_size) memcpy( buffer->Data, (const char *)message->iosb->in_data + message->read_pos, reply_size );
+
+ if (reply_size)
+ {
+ data_size_t write_pos = 0, writing;
+ LIST_FOR_EACH_ENTRY( message, &pipe_end->message_queue, struct pipe_message, entry )
+ {
+ writing = min( reply_size - write_pos, message->iosb->in_size - message->read_pos );
+ memcpy( buffer->Data + write_pos, (const char *)message->iosb->in_data + message->read_pos,
+ writing );
+ write_pos += writing;
+ if (write_pos == reply_size) break;
+ }
+ }
return 1;
}
More information about the wine-cvs
mailing list