Jacek Caban : server: Use pipe_end state in FSCTL_PIPE_LISTEN implementation.
Alexandre Julliard
julliard at winehq.org
Fri Aug 17 12:33:09 CDT 2018
Module: wine
Branch: master
Commit: 290320a8fec6f78289761d5162f27873d83edbb0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=290320a8fec6f78289761d5162f27873d83edbb0
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Aug 17 17:40:44 2018 +0200
server: Use pipe_end state in FSCTL_PIPE_LISTEN implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/tests/pipe.c | 8 ++++++++
server/named_pipe.c | 34 ++++++++++++++++------------------
2 files changed, 24 insertions(+), 18 deletions(-)
diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index 94db1a2..d6a0d41 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -1341,6 +1341,14 @@ static void test_pipe_state(HANDLE pipe, BOOL is_server, DWORD state)
ok(status == expected_status, "NtReadFile failed in %s state %u: %x\n",
is_server ? "server" : "client", state, status);
}
+
+ if (is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_CONNECTED_STATE))
+ {
+ memset(&io, 0xcc, sizeof(io));
+ status = listen_pipe(pipe, NULL, &io, FALSE);
+ ok(status == (state == FILE_PIPE_CLOSING_STATE ? STATUS_PIPE_CLOSING : STATUS_PIPE_CONNECTED),
+ "status = %x in %u state\n", status, state);
+ }
}
static void test_pipe_with_data_state(HANDLE pipe, BOOL is_server, DWORD state)
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 76e38a9..bb4ea3b 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -990,27 +990,25 @@ static int pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *as
switch(code)
{
case FSCTL_PIPE_LISTEN:
- switch(server->state)
+ switch(server->pipe_end.state)
{
- case ps_idle_server:
- case ps_wait_connect:
- fd_queue_async( server->pipe_end.fd, async, ASYNC_TYPE_WAIT );
- server->pipe_end.state = FILE_PIPE_LISTENING_STATE;
- set_server_state( server, ps_wait_open );
- async_wake_up( &server->pipe_end.pipe->waiters, STATUS_SUCCESS );
- set_error( STATUS_PENDING );
- return 1;
- case ps_connected_server:
- set_error( STATUS_PIPE_CONNECTED );
- break;
- case ps_wait_disconnect:
- set_error( STATUS_NO_DATA_DETECTED );
- break;
- case ps_wait_open:
- set_error( STATUS_INVALID_HANDLE );
+ case FILE_PIPE_LISTENING_STATE:
+ case FILE_PIPE_DISCONNECTED_STATE:
break;
+ case FILE_PIPE_CONNECTED_STATE:
+ set_error( STATUS_PIPE_CONNECTED );
+ return 0;
+ case FILE_PIPE_CLOSING_STATE:
+ set_error( STATUS_PIPE_CLOSING );
+ return 0;
}
- return 0;
+
+ fd_queue_async( server->pipe_end.fd, async, ASYNC_TYPE_WAIT );
+ server->pipe_end.state = FILE_PIPE_LISTENING_STATE;
+ set_server_state( server, ps_wait_open );
+ async_wake_up( &server->pipe_end.pipe->waiters, STATUS_SUCCESS );
+ set_error( STATUS_PENDING );
+ return 1;
case FSCTL_PIPE_DISCONNECT:
switch(server->state)
More information about the wine-cvs
mailing list