Module: wine Branch: master Commit: 290320a8fec6f78289761d5162f27873d83edbb0 URL: https://source.winehq.org/git/wine.git/?a=commit;h=290320a8fec6f78289761d516...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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)