Alexandre Julliard : server: Implemented the open_file method for named pipe and mailslot devices.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 22 10:11:08 CDT 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Mar 22 11:52:40 2007 +0100

server: Implemented the open_file method for named pipe and mailslot devices.

---

 dlls/ntdll/file.c              |    1 +
 include/wine/server_protocol.h |    3 ++-
 server/fd.c                    |   10 ++++------
 server/mailslot.c              |   10 +++++++++-
 server/named_pipe.c            |   10 +++++++++-
 server/protocol.def            |    1 +
 server/trace.c                 |    1 +
 7 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 0b22583..2a2f9d2 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -218,6 +218,7 @@ NTSTATUS WINAPI NtCreateFile( PHANDLE handle, ACCESS_MASK access, POBJECT_ATTRIB
             req->attributes = attr->Attributes;
             req->rootdir    = attr->RootDirectory;
             req->sharing    = sharing;
+            req->options    = options;
             wine_server_add_data( req, attr->ObjectName->Buffer, attr->ObjectName->Length );
             io->u.Status = wine_server_call( req );
             *handle = reply->handle;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 726d833..c0d628f 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -1035,6 +1035,7 @@ struct open_file_object_request
     unsigned int attributes;
     obj_handle_t rootdir;
     unsigned int sharing;
+    unsigned int options;
     /* VARARG(filename,unicode_str); */
 };
 struct open_file_object_reply
@@ -4699,6 +4700,6 @@ union generic_reply
     struct allocate_locally_unique_id_reply allocate_locally_unique_id_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 285
+#define SERVER_PROTOCOL_VERSION 286
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/fd.c b/server/fd.c
index cefdc16..fba6907 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1871,7 +1871,7 @@ DECL_HANDLER(open_file_object)
 {
     struct unicode_str name;
     struct directory *root = NULL;
-    struct object *obj;
+    struct object *obj, *result;
 
     get_req_unicode_str( &name );
     if (req->rootdir && !(root = get_directory_obj( current->process, req->rootdir, 0 )))
@@ -1879,12 +1879,10 @@ DECL_HANDLER(open_file_object)
 
     if ((obj = open_object_dir( root, &name, req->attributes, NULL )))
     {
-        /* make sure this is a valid file object */
-        struct fd *fd = get_obj_fd( obj );
-        if (fd)
+        if ((result = obj->ops->open_file( obj, req->access, req->sharing, req->options )))
         {
-            reply->handle = alloc_handle( current->process, obj, req->access, req->attributes );
-            release_object( fd );
+            reply->handle = alloc_handle( current->process, result, req->access, req->attributes );
+            release_object( result );
         }
         release_object( obj );
     }
diff --git a/server/mailslot.c b/server/mailslot.c
index af2b25b..9391e13 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -154,6 +154,8 @@ static void mailslot_device_dump( struct object *obj, int verbose );
 static struct fd *mailslot_device_get_fd( struct object *obj );
 static struct object *mailslot_device_lookup_name( struct object *obj, struct unicode_str *name,
                                                    unsigned int attr );
+static struct object *mailslot_device_open_file( struct object *obj, unsigned int access,
+                                                 unsigned int sharing, unsigned int options );
 static void mailslot_device_destroy( struct object *obj );
 static enum server_fd_type mailslot_device_get_file_info( struct fd *fd, int *flags );
 
@@ -169,7 +171,7 @@ static const struct object_ops mailslot_device_ops =
     mailslot_device_get_fd,         /* get_fd */
     no_map_access,                  /* map_access */
     mailslot_device_lookup_name,    /* lookup_name */
-    no_open_file,                   /* open_file */
+    mailslot_device_open_file,      /* open_file */
     fd_close_handle,                /* close_handle */
     mailslot_device_destroy         /* destroy */
 };
@@ -293,6 +295,12 @@ static struct object *mailslot_device_lookup_name( struct object *obj, struct un
     return found;
 }
 
+static struct object *mailslot_device_open_file( struct object *obj, unsigned int access,
+                                                 unsigned int sharing, unsigned int options )
+{
+    return grab_object( obj );
+}
+
 static void mailslot_device_destroy( struct object *obj )
 {
     struct mailslot_device *device = (struct mailslot_device*)obj;
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 0e1aeab..e121c91 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -202,6 +202,8 @@ static void named_pipe_device_dump( struct object *obj, int verbose );
 static struct fd *named_pipe_device_get_fd( struct object *obj );
 static struct object *named_pipe_device_lookup_name( struct object *obj,
     struct unicode_str *name, unsigned int attr );
+static struct object *named_pipe_device_open_file( struct object *obj, unsigned int access,
+                                                   unsigned int sharing, unsigned int options );
 static void named_pipe_device_destroy( struct object *obj );
 static enum server_fd_type named_pipe_device_get_file_info( struct fd *fd, int *flags );
 
@@ -217,7 +219,7 @@ static const struct object_ops named_pipe_device_ops =
     named_pipe_device_get_fd,         /* get_fd */
     pipe_map_access,                  /* map_access */
     named_pipe_device_lookup_name,    /* lookup_name */
-    no_open_file,                     /* open_file */
+    named_pipe_device_open_file,      /* open_file */
     fd_close_handle,                  /* close_handle */
     named_pipe_device_destroy         /* destroy */
 };
@@ -434,6 +436,12 @@ static struct object *named_pipe_device_lookup_name( struct object *obj, struct
     return found;
 }
 
+static struct object *named_pipe_device_open_file( struct object *obj, unsigned int access,
+                                                   unsigned int sharing, unsigned int options )
+{
+    return grab_object( obj );
+}
+
 static void named_pipe_device_destroy( struct object *obj )
 {
     struct named_pipe_device *device = (struct named_pipe_device*)obj;
diff --git a/server/protocol.def b/server/protocol.def
index 1e7cb8b..8e7875c 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -861,6 +861,7 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
     unsigned int attributes;    /* open attributes */
     obj_handle_t rootdir;       /* root directory */
     unsigned int sharing;       /* sharing flags */
+    unsigned int options;       /* file options */
     VARARG(filename,unicode_str); /* file name */
 @REPLY
     obj_handle_t handle;        /* handle to the file */
diff --git a/server/trace.c b/server/trace.c
index ed42650..c3ffe18 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1249,6 +1249,7 @@ static void dump_open_file_object_request( const struct open_file_object_request
     fprintf( stderr, " attributes=%08x,", req->attributes );
     fprintf( stderr, " rootdir=%p,", req->rootdir );
     fprintf( stderr, " sharing=%08x,", req->sharing );
+    fprintf( stderr, " options=%08x,", req->options );
     fprintf( stderr, " filename=" );
     dump_varargs_unicode_str( cur_size );
 }




More information about the wine-cvs mailing list