Sebastian Lackner : server: Store pipe_flags in a separate variable for both server and client of named pipes.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 20 14:30:34 CDT 2014


Module: wine
Branch: master
Commit: 2e95f370d4a162b4f6955bc582fd8f551c79350a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2e95f370d4a162b4f6955bc582fd8f551c79350a

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Mon Aug 11 15:35:50 2014 +0200

server: Store pipe_flags in a separate variable for both server and client of named pipes.

---

 server/named_pipe.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/server/named_pipe.c b/server/named_pipe.c
index 4b23ba2..d864478 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -77,6 +77,7 @@ struct pipe_server
     struct timeout_user *flush_poll;
     struct event        *event;
     unsigned int         options;    /* pipe options */
+    unsigned int         pipe_flags;
 };
 
 struct pipe_client
@@ -85,6 +86,7 @@ struct pipe_client
     struct fd           *fd;         /* pipe file descriptor */
     struct pipe_server  *server;     /* server that this client is connected to */
     unsigned int         flags;      /* file flags */
+    unsigned int         pipe_flags;
 };
 
 struct named_pipe
@@ -737,7 +739,8 @@ static struct pipe_server *get_pipe_server_obj( struct process *process,
     return (struct pipe_server *) obj;
 }
 
-static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned int options )
+static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned int options,
+                                               unsigned int pipe_flags )
 {
     struct pipe_server *server;
 
@@ -750,6 +753,7 @@ static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned
     server->client = NULL;
     server->flush_poll = NULL;
     server->options = options;
+    server->pipe_flags = pipe_flags;
 
     list_add_head( &pipe->servers, &server->entry );
     grab_object( pipe );
@@ -762,7 +766,7 @@ static struct pipe_server *create_pipe_server( struct named_pipe *pipe, unsigned
     return server;
 }
 
-static struct pipe_client *create_pipe_client( unsigned int flags )
+static struct pipe_client *create_pipe_client( unsigned int flags, unsigned int pipe_flags )
 {
     struct pipe_client *client;
 
@@ -773,6 +777,7 @@ static struct pipe_client *create_pipe_client( unsigned int flags )
     client->fd = NULL;
     client->server = NULL;
     client->flags = flags;
+    client->pipe_flags = pipe_flags;
 
     return client;
 }
@@ -822,7 +827,7 @@ static struct object *named_pipe_open_file( struct object *obj, unsigned int acc
         return NULL;
     }
 
-    if ((client = create_pipe_client( options )))
+    if ((client = create_pipe_client( options, pipe->flags )))
     {
         if (!socketpair( PF_UNIX, SOCK_STREAM, 0, fds ))
         {
@@ -977,7 +982,7 @@ DECL_HANDLER(create_named_pipe)
         pipe->outsize = req->outsize;
         pipe->maxinstances = req->maxinstances;
         pipe->timeout = req->timeout;
-        pipe->flags = req->flags;
+        pipe->flags = req->flags & NAMED_PIPE_MESSAGE_STREAM_WRITE;
         pipe->sharing = req->sharing;
     }
     else
@@ -997,7 +1002,7 @@ DECL_HANDLER(create_named_pipe)
         clear_error(); /* clear the name collision */
     }
 
-    server = create_pipe_server( pipe, req->options );
+    server = create_pipe_server( pipe, req->options, req->flags );
     if (server)
     {
         reply->handle = alloc_handle( current->process, server, req->access, req->attributes );
@@ -1026,7 +1031,7 @@ DECL_HANDLER(get_named_pipe_info)
         server = client->server;
     }
 
-    reply->flags        = server->pipe->flags;
+    reply->flags        = client ? client->pipe_flags : server->pipe_flags;
     reply->sharing      = server->pipe->sharing;
     reply->maxinstances = server->pipe->maxinstances;
     reply->instances    = server->pipe->instances;




More information about the wine-cvs mailing list