Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
aa472f5e
Commit
aa472f5e
authored
Mar 26, 2017
by
Jacek Caban
Committed by
Alexandre Julliard
Mar 27, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Added support for message mode named pipe reads.
Signed-off-by:
Jacek Caban
<
jacek@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
127bb951
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
23 additions
and
48 deletions
+23
-48
pipe.c
dlls/kernel32/tests/pipe.c
+6
-39
named_pipe.c
server/named_pipe.c
+17
-9
No files found.
dlls/kernel32/tests/pipe.c
View file @
aa472f5e
...
...
@@ -263,9 +263,7 @@ static void test_CreateNamedPipe(int pipemode)
else
{
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hnp
,
ibuf
,
4
,
&
readden
,
NULL
),
"ReadFile
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error
\n
"
);
}
ok
(
readden
==
4
,
"read got %d bytes
\n
"
,
readden
);
...
...
@@ -286,15 +284,11 @@ static void test_CreateNamedPipe(int pipemode)
else
{
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hnp
,
ibuf
,
4
,
&
readden
,
NULL
),
"ReadFile
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes
\n
"
,
readden
);
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hnp
,
ibuf
+
4
,
4
,
&
readden
,
NULL
),
"ReadFile
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error
\n
"
);
}
ok
(
readden
==
4
,
"read got %d bytes
\n
"
,
readden
);
...
...
@@ -360,9 +354,7 @@ static void test_CreateNamedPipe(int pipemode)
ok
(
readden
==
sizeof
(
obuf
)
+
sizeof
(
obuf2
),
"read 4 got %d bytes
\n
"
,
readden
);
}
else
{
todo_wine
{
ok
(
readden
==
sizeof
(
obuf
),
"read 4 got %d bytes
\n
"
,
readden
);
}
ok
(
readden
==
sizeof
(
obuf
),
"read 4 got %d bytes
\n
"
,
readden
);
}
pbuf
=
ibuf
;
ok
(
memcmp
(
obuf
,
pbuf
,
sizeof
(
obuf
))
==
0
,
"content 4a check
\n
"
);
...
...
@@ -393,9 +385,7 @@ static void test_CreateNamedPipe(int pipemode)
pbuf
=
ibuf
;
ok
(
memcmp
(
obuf
,
pbuf
,
sizeof
(
obuf
))
==
0
,
"content 5a check
\n
"
);
ok
(
ReadFile
(
hFile
,
ibuf
,
sizeof
(
ibuf
),
&
readden
,
NULL
),
"ReadFile
\n
"
);
todo_wine
{
ok
(
readden
==
sizeof
(
obuf
),
"read 5 got %d bytes
\n
"
,
readden
);
}
ok
(
readden
==
sizeof
(
obuf
),
"read 5 got %d bytes
\n
"
,
readden
);
pbuf
=
ibuf
;
ok
(
memcmp
(
obuf
,
pbuf
,
sizeof
(
obuf
))
==
0
,
"content 5a check
\n
"
);
if
(
readden
<=
sizeof
(
obuf
))
...
...
@@ -404,10 +394,8 @@ static void test_CreateNamedPipe(int pipemode)
/* Multiple writes in the reverse direction */
/* the write of obuf2 from write4 should still be in the buffer */
ok
(
PeekNamedPipe
(
hnp
,
ibuf
,
sizeof
(
ibuf
),
&
readden
,
&
avail
,
NULL
),
"Peek6a
\n
"
);
todo_wine
{
ok
(
readden
==
sizeof
(
obuf2
),
"peek6a got %d bytes
\n
"
,
readden
);
ok
(
avail
==
sizeof
(
obuf2
),
"peek6a got %d bytes available
\n
"
,
avail
);
}
ok
(
readden
==
sizeof
(
obuf2
),
"peek6a got %d bytes
\n
"
,
readden
);
ok
(
avail
==
sizeof
(
obuf2
),
"peek6a got %d bytes available
\n
"
,
avail
);
if
(
avail
>
0
)
{
ok
(
ReadFile
(
hnp
,
ibuf
,
sizeof
(
ibuf
),
&
readden
,
NULL
),
"ReadFile
\n
"
);
ok
(
readden
==
sizeof
(
obuf2
),
"read 6a got %d bytes
\n
"
,
readden
);
...
...
@@ -426,9 +414,7 @@ static void test_CreateNamedPipe(int pipemode)
pbuf
=
ibuf
;
ok
(
memcmp
(
obuf
,
pbuf
,
sizeof
(
obuf
))
==
0
,
"content 6a check
\n
"
);
ok
(
ReadFile
(
hnp
,
ibuf
,
sizeof
(
ibuf
),
&
readden
,
NULL
),
"ReadFile
\n
"
);
todo_wine
{
ok
(
readden
==
sizeof
(
obuf
),
"read 6b got %d bytes
\n
"
,
readden
);
}
ok
(
readden
==
sizeof
(
obuf
),
"read 6b got %d bytes
\n
"
,
readden
);
pbuf
=
ibuf
;
ok
(
memcmp
(
obuf
,
pbuf
,
sizeof
(
obuf
))
==
0
,
"content 6a check
\n
"
);
if
(
readden
<=
sizeof
(
obuf
))
...
...
@@ -439,9 +425,7 @@ static void test_CreateNamedPipe(int pipemode)
ok
(
WriteFile
(
hnp
,
obuf2
,
sizeof
(
obuf2
),
&
written
,
NULL
),
"WriteFile 7
\n
"
);
ok
(
written
==
sizeof
(
obuf2
),
"write file len 7
\n
"
);
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hFile
,
ibuf
,
4
,
&
readden
,
NULL
),
"ReadFile 7
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 7
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 7
\n
"
,
readden
);
ok
(
ReadFile
(
hFile
,
ibuf
+
4
,
sizeof
(
ibuf
)
-
4
,
&
readden
,
NULL
),
"ReadFile 7
\n
"
);
...
...
@@ -452,9 +436,7 @@ static void test_CreateNamedPipe(int pipemode)
ok
(
WriteFile
(
hFile
,
obuf
,
sizeof
(
obuf
),
&
written
,
NULL
),
"WriteFile 8
\n
"
);
ok
(
written
==
sizeof
(
obuf
),
"write file len 8
\n
"
);
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hnp
,
ibuf
,
4
,
&
readden
,
NULL
),
"ReadFile 8
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 8
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 8
\n
"
,
readden
);
ok
(
ReadFile
(
hnp
,
ibuf
+
4
,
sizeof
(
ibuf
)
-
4
,
&
readden
,
NULL
),
"ReadFile 8
\n
"
);
...
...
@@ -471,21 +453,16 @@ static void test_CreateNamedPipe(int pipemode)
ok
(
WriteFile
(
hnp
,
obuf2
,
sizeof
(
obuf2
),
&
written
,
NULL
),
"WriteFile 9
\n
"
);
ok
(
written
==
sizeof
(
obuf2
),
"write file len 9
\n
"
);
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hFile
,
ibuf
,
4
,
&
readden
,
NULL
),
"ReadFile 9
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 9
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 9
\n
"
,
readden
);
SetLastError
(
0xdeadbeef
);
ret
=
RpcReadFile
(
hFile
,
ibuf
+
4
,
4
,
&
readden
,
NULL
);
todo_wine
ok
(
!
ret
,
"RpcReadFile 9
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 9
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 9
\n
"
,
readden
);
ret
=
RpcReadFile
(
hFile
,
ibuf
+
8
,
sizeof
(
ibuf
),
&
readden
,
NULL
);
ok
(
ret
,
"RpcReadFile 9
\n
"
);
todo_wine
ok
(
readden
==
sizeof
(
obuf
)
-
8
,
"read got %d bytes 9
\n
"
,
readden
);
ok
(
memcmp
(
obuf
,
ibuf
,
sizeof
(
obuf
))
==
0
,
"content check 9
\n
"
);
if
(
readden
<=
sizeof
(
obuf
)
-
8
)
/* blocks forever if second part was already received */
...
...
@@ -494,12 +471,10 @@ static void test_CreateNamedPipe(int pipemode)
SetLastError
(
0xdeadbeef
);
ret
=
RpcReadFile
(
hFile
,
ibuf
,
4
,
&
readden
,
NULL
);
ok
(
!
ret
,
"RpcReadFile 9
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 9
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 9
\n
"
,
readden
);
SetLastError
(
0xdeadbeef
);
ok
(
!
ReadFile
(
hFile
,
ibuf
+
4
,
4
,
&
readden
,
NULL
),
"ReadFile 9
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 9
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 9
\n
"
,
readden
);
ret
=
RpcReadFile
(
hFile
,
ibuf
+
8
,
sizeof
(
ibuf
),
&
readden
,
NULL
);
...
...
@@ -515,21 +490,16 @@ static void test_CreateNamedPipe(int pipemode)
ok
(
WriteFile
(
hFile
,
obuf
,
sizeof
(
obuf
),
&
written
,
NULL
),
"WriteFile 10
\n
"
);
ok
(
written
==
sizeof
(
obuf
),
"write file len 10
\n
"
);
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hnp
,
ibuf
,
4
,
&
readden
,
NULL
),
"ReadFile 10
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 10
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 10
\n
"
,
readden
);
SetLastError
(
0xdeadbeef
);
ret
=
RpcReadFile
(
hnp
,
ibuf
+
4
,
4
,
&
readden
,
NULL
);
todo_wine
ok
(
!
ret
,
"RpcReadFile 10
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 10
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 10
\n
"
,
readden
);
ret
=
RpcReadFile
(
hnp
,
ibuf
+
8
,
sizeof
(
ibuf
),
&
readden
,
NULL
);
ok
(
ret
,
"RpcReadFile 10
\n
"
);
todo_wine
ok
(
readden
==
sizeof
(
obuf2
)
-
8
,
"read got %d bytes 10
\n
"
,
readden
);
ok
(
memcmp
(
obuf2
,
ibuf
,
sizeof
(
obuf2
))
==
0
,
"content check 10
\n
"
);
if
(
readden
<=
sizeof
(
obuf2
)
-
8
)
/* blocks forever if second part was already received */
...
...
@@ -537,15 +507,11 @@ static void test_CreateNamedPipe(int pipemode)
memset
(
ibuf
,
0
,
sizeof
(
ibuf
));
SetLastError
(
0xdeadbeef
);
ret
=
RpcReadFile
(
hnp
,
ibuf
,
4
,
&
readden
,
NULL
);
todo_wine
ok
(
!
ret
,
"RpcReadFile 10
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 10
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 10
\n
"
,
readden
);
SetLastError
(
0xdeadbeef
);
todo_wine
ok
(
!
ReadFile
(
hnp
,
ibuf
+
4
,
4
,
&
readden
,
NULL
),
"ReadFile 10
\n
"
);
todo_wine
ok
(
GetLastError
()
==
ERROR_MORE_DATA
,
"wrong error 10
\n
"
);
ok
(
readden
==
4
,
"read got %d bytes 10
\n
"
,
readden
);
ret
=
RpcReadFile
(
hnp
,
ibuf
+
8
,
sizeof
(
ibuf
),
&
readden
,
NULL
);
...
...
@@ -2944,4 +2910,5 @@ START_TEST(pipe)
test_GetNamedPipeInfo
();
test_readfileex_pending
();
test_overlapped_transport
(
TRUE
,
FALSE
);
test_overlapped_transport
(
TRUE
,
TRUE
);
}
server/named_pipe.c
View file @
aa472f5e
...
...
@@ -3,6 +3,7 @@
*
* Copyright (C) 1998 Alexandre Julliard
* Copyright (C) 2001 Mike McCormack
* Copyright 2016 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
...
...
@@ -17,9 +18,6 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*
* TODO:
* message mode
*/
#include "config.h"
...
...
@@ -691,15 +689,25 @@ static obj_handle_t pipe_client_flush( struct fd *fd, struct async *async, int b
static
void
message_queue_read
(
struct
pipe_end
*
pipe_end
,
struct
iosb
*
iosb
)
{
struct
pipe_message
*
message
;
data_size_t
avail
=
0
;
LIST_FOR_EACH_ENTRY
(
message
,
&
pipe_end
->
message_queue
,
struct
pipe_message
,
entry
)
if
(
pipe_end
->
flags
&
NAMED_PIPE_MESSAGE_STREAM_READ
)
{
avail
+=
message
->
iosb
->
in_size
-
message
->
read_pos
;
if
(
avail
>=
iosb
->
out_size
)
break
;
message
=
LIST_ENTRY
(
list_head
(
&
pipe_end
->
message_queue
),
struct
pipe_message
,
entry
);
iosb
->
out_size
=
min
(
iosb
->
out_size
,
message
->
iosb
->
in_size
-
message
->
read_pos
);
iosb
->
status
=
message
->
read_pos
+
iosb
->
out_size
<
message
->
iosb
->
in_size
?
STATUS_BUFFER_OVERFLOW
:
STATUS_SUCCESS
;
}
else
{
data_size_t
avail
=
0
;
LIST_FOR_EACH_ENTRY
(
message
,
&
pipe_end
->
message_queue
,
struct
pipe_message
,
entry
)
{
avail
+=
message
->
iosb
->
in_size
-
message
->
read_pos
;
if
(
avail
>=
iosb
->
out_size
)
break
;
}
iosb
->
out_size
=
min
(
iosb
->
out_size
,
avail
);
iosb
->
status
=
STATUS_SUCCESS
;
}
iosb
->
out_size
=
min
(
iosb
->
out_size
,
avail
);
iosb
->
status
=
STATUS_SUCCESS
;
message
=
LIST_ENTRY
(
list_head
(
&
pipe_end
->
message_queue
),
struct
pipe_message
,
entry
);
if
(
!
message
->
read_pos
&&
message
->
iosb
->
in_size
==
iosb
->
out_size
)
/* fast path */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment