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