Jacek Caban : server: Use pipe stored in pipe_end in get_named_pipe_info.

Alexandre Julliard julliard at winehq.org
Thu Aug 16 13:42:50 CDT 2018


Module: wine
Branch: master
Commit: 3375ccba2f76a29908c144dcca73787d4d9c569b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3375ccba2f76a29908c144dcca73787d4d9c569b

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Aug 16 15:11:22 2018 +0200

server: Use pipe stored in pipe_end in get_named_pipe_info.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/pipe.c | 11 -----------
 server/named_pipe.c     | 40 ++++++++++++++++++----------------------
 2 files changed, 18 insertions(+), 33 deletions(-)

diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index 80037cb..94db1a2 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -1355,7 +1355,6 @@ static void test_pipe_with_data_state(HANDLE pipe, BOOL is_server, DWORD state)
     memset(&io, 0xcc, sizeof(io));
     status = pNtQueryInformationFile(pipe, &io, &local_info, sizeof(local_info), FilePipeLocalInformation);
     if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE)
-        todo_wine
         ok(status == STATUS_PIPE_DISCONNECTED,
             "NtQueryInformationFile(FilePipeLocalInformation) failed in %s state %u: %x\n",
             is_server ? "server" : "client", state, status);
@@ -1370,7 +1369,6 @@ static void test_pipe_with_data_state(HANDLE pipe, BOOL is_server, DWORD state)
 
     status = pNtQueryInformationFile(pipe, &io, &pipe_info, sizeof(pipe_info), FilePipeInformation);
     if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE)
-        todo_wine
         ok(status == STATUS_PIPE_DISCONNECTED,
             "NtQueryInformationFile(FilePipeInformation) failed in %s state %u: %x\n",
             is_server ? "server" : "client", state, status);
@@ -1555,7 +1553,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state)
     memset(&local_info, 0xcc, sizeof(local_info));
     status = pNtQueryInformationFile(pipe, &iosb, &local_info, sizeof(local_info), FilePipeLocalInformation);
     if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE)
-        todo_wine
         ok(status == STATUS_PIPE_DISCONNECTED,
             "NtQueryInformationFile(FilePipeLocalInformation) failed in %s state %u: %x\n",
             is_server ? "server" : "client", state, status);
@@ -1566,23 +1563,18 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state)
     if (!status)
     {
         ok(local_info.NamedPipeType == 1, "NamedPipeType = %u\n", local_info.NamedPipeType);
-        todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE))
         ok(local_info.NamedPipeConfiguration == 1, "NamedPipeConfiguration = %u\n",
            local_info.NamedPipeConfiguration);
-        todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE))
         ok(local_info.MaximumInstances == 1, "MaximumInstances = %u\n", local_info.MaximumInstances);
         if (!is_server && state == FILE_PIPE_CLOSING_STATE)
             ok(local_info.CurrentInstances == 0 || broken(local_info.CurrentInstances == 1 /* winxp */),
                "CurrentInstances = %u\n", local_info.CurrentInstances);
         else
-            todo_wine_if(!is_server && state == FILE_PIPE_DISCONNECTED_STATE)
             ok(local_info.CurrentInstances == 1,
                "CurrentInstances = %u\n", local_info.CurrentInstances);
-        todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE))
         ok(local_info.InboundQuota == 100, "InboundQuota = %u\n", local_info.InboundQuota);
         ok(local_info.ReadDataAvailable == 0, "ReadDataAvailable = %u\n",
            local_info.ReadDataAvailable);
-        todo_wine_if(!is_server && (state == FILE_PIPE_CLOSING_STATE || state == FILE_PIPE_DISCONNECTED_STATE))
         ok(local_info.OutboundQuota == 200, "OutboundQuota = %u\n", local_info.OutboundQuota);
         todo_wine
         ok(local_info.WriteQuotaAvailable == (is_server ? 200 : 100), "WriteQuotaAvailable = %u\n",
@@ -1608,7 +1600,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state)
                                         &attr, &iosb, FILE_SHARE_WRITE, FILE_CREATE, 0, 0, 0, 0, 1,
                                         100, 200, &timeout);
         if (!local_info.CurrentInstances)
-            todo_wine_if(status) /* FIXME */
             ok(status == STATUS_SUCCESS, "NtCreateNamedPipeFile failed: %x\n", status);
         else
             ok(status == STATUS_INSTANCE_NOT_AVAILABLE, "NtCreateNamedPipeFile failed: %x\n", status);
@@ -1625,7 +1616,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state)
             ok(local_info.CurrentInstances == 0 || broken(local_info.CurrentInstances == 1 /* winxp */),
                "CurrentInstances = %u\n", local_info.CurrentInstances);
         else
-            todo_wine_if(!is_server && state == FILE_PIPE_DISCONNECTED_STATE)
             ok(local_info.CurrentInstances == 1,
                "CurrentInstances = %u\n", local_info.CurrentInstances);
     }
@@ -1633,7 +1623,6 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state)
     memset(&iosb, 0xcc, sizeof(iosb));
     status = pNtQueryInformationFile(pipe, &iosb, &pipe_info, sizeof(pipe_info), FilePipeInformation);
     if (!is_server && state == FILE_PIPE_DISCONNECTED_STATE)
-        todo_wine
         ok(status == STATUS_PIPE_DISCONNECTED,
             "NtQueryInformationFile(FilePipeLocalInformation) failed in %s state %u: %x\n",
             is_server ? "server" : "client", state, status);
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 95c2442..e6e497b 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -1354,39 +1354,35 @@ DECL_HANDLER(create_named_pipe)
 
 DECL_HANDLER(get_named_pipe_info)
 {
-    struct pipe_server *server;
-    struct pipe_client *client = NULL;
+    struct pipe_end *pipe_end;
 
-    server = get_pipe_server_obj( current->process, req->handle, FILE_READ_ATTRIBUTES );
-    if (!server)
+    pipe_end = (struct pipe_end *)get_handle_obj( current->process, req->handle,
+                                                  FILE_READ_ATTRIBUTES, &pipe_server_ops );
+    if (!pipe_end)
     {
         if (get_error() != STATUS_OBJECT_TYPE_MISMATCH)
             return;
 
         clear_error();
-        client = (struct pipe_client *)get_handle_obj( current->process, req->handle,
-                                                       0, &pipe_client_ops );
-        if (!client) return;
-        server = client->server;
+        pipe_end = (struct pipe_end *)get_handle_obj( current->process, req->handle,
+                                                      0, &pipe_client_ops );
+        if (!pipe_end) return;
     }
 
-    reply->flags = client ? client->pipe_end.flags : server->pipe_end.flags;
-    if (server)
+    if (pipe_end->pipe)
     {
-        reply->sharing      = server->pipe->sharing;
-        reply->maxinstances = server->pipe->maxinstances;
-        reply->instances    = server->pipe->instances;
-        reply->insize       = server->pipe->insize;
-        reply->outsize      = server->pipe->outsize;
+        reply->flags        = pipe_end->flags;
+        reply->sharing      = pipe_end->pipe->sharing;
+        reply->maxinstances = pipe_end->pipe->maxinstances;
+        reply->instances    = pipe_end->pipe->instances;
+        reply->insize       = pipe_end->pipe->insize;
+        reply->outsize      = pipe_end->pipe->outsize;
+
+        if (pipe_end->obj.ops == &pipe_server_ops) reply->flags |= NAMED_PIPE_SERVER_END;
     }
+    else set_error( STATUS_PIPE_DISCONNECTED );
 
-    if (client)
-        release_object(client);
-    else
-    {
-        reply->flags |= NAMED_PIPE_SERVER_END;
-        release_object(server);
-    }
+    release_object( pipe_end );
 }
 
 DECL_HANDLER(set_named_pipe_info)




More information about the wine-cvs mailing list