From: Sebastian Lackner Subject: [2/4] server: Store pipe_flags in a separate variable for both server and client of named pipes. Message-Id: <53EA6B37.7020507@fds-team.de> Date: Tue, 12 Aug 2014 21:29:59 +0200 One global "flags" member for a pipe is not sufficient to store different values for each opened server/connection. This patch adds an additional pipe_flags member to both the server and client. pipe->flags contain attributes which are valid for all servers/client - the server->pipe_flags and client->pipe_flags values are separate for each connection. When requesting get_named_pipe_info then return the information for the specific instance, instead of the global information. --- server/named_pipe.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) From 44ae1a66a6f12c92b6b1a48af81ac4e759c15975 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Mon, 11 Aug 2014 15:35:50 +0200 Subject: server: Store pipe_flags in a separate variable for both server and client of named pipes. --- server/named_pipe.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/server/named_pipe.c b/server/named_pipe.c index 4b23ba2..59fb0ab 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,7 @@ 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, int pipe_flags ) { struct pipe_server *server; @@ -750,6 +752,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 +765,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, int pipe_flags ) { struct pipe_client *client; @@ -773,6 +776,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 +826,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 +981,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 +1001,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 +1030,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; -- 1.7.9.5