This is essentially a straight port of 2600ecd4ed.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntdll/tests/file.c | 4 +- dlls/ntdll/tests/om.c | 4 +- server/mailslot.c | 117 +++++++++++++++++++++++++++++----------- 3 files changed, 89 insertions(+), 36 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 9c749ace1fe..8b9ec4f624d 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -3813,7 +3813,6 @@ static void test_file_mode(void) UNICODE_STRING *file_name; ULONG options; ULONG mode; - BOOL todo; } option_tests[] = { { &file_name, 0, 0 }, { &file_name, FILE_NON_DIRECTORY_FILE, 0 }, @@ -3827,7 +3826,7 @@ static void test_file_mode(void) { &pipe_dev_name, 0, 0 }, { &pipe_dev_name, FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_ALERT }, { &mailslot_dev_name, 0, 0 }, - { &mailslot_dev_name, FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_ALERT, TRUE }, + { &mailslot_dev_name, FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_ALERT }, { &mountmgr_dev_name, 0, 0 }, { &mountmgr_dev_name, FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_ALERT } }; @@ -3879,7 +3878,6 @@ static void test_file_mode(void) memset(&mode, 0xcc, sizeof(mode)); status = pNtQueryInformationFile(file, &io, &mode, sizeof(mode), FileModeInformation); ok(status == STATUS_SUCCESS, "[%u] can't get FileModeInformation: %x\n", i, status); - todo_wine_if(option_tests[i].todo) ok(mode.Mode == option_tests[i].mode, "[%u] Mode = %x, expected %x\n", i, mode.Mode, option_tests[i].mode);
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c index c83052d2881..a9da114cb5c 100644 --- a/dlls/ntdll/tests/om.c +++ b/dlls/ntdll/tests/om.c @@ -1445,8 +1445,8 @@ static void test_query_object(void) handle = CreateFileA( "\\.\mailslot", 0, 0, NULL, OPEN_EXISTING, 0, 0 ); ok( handle != INVALID_HANDLE_VALUE, "CreateFile failed (%d)\n", GetLastError() );
- test_object_name( handle, L"\Device\Mailslot", FALSE ); - test_object_type_todo( handle, L"File" ); + test_object_name( handle, L"\Device\Mailslot", TRUE ); + test_object_type( handle, L"File" ); test_file_info( handle );
pNtClose( handle ); diff --git a/server/mailslot.c b/server/mailslot.c index 781e6f3141a..58d650cbb25 100644 --- a/server/mailslot.c +++ b/server/mailslot.c @@ -171,19 +171,23 @@ static const struct fd_ops mail_writer_fd_ops = struct mailslot_device { struct object obj; /* object header */ - struct fd *fd; /* pseudo-fd for ioctls */ struct namespace *mailslots; /* mailslot namespace */ };
+struct mailslot_device_file +{ + struct object obj; /* object header */ + struct fd *fd; /* pseudo-fd for ioctls */ + struct mailslot_device *device; /* mailslot device */ +}; + static void mailslot_device_dump( struct object *obj, int verbose ); static struct object_type *mailslot_device_get_type( struct object *obj ); -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_fd_type( struct fd *fd );
static const struct object_ops mailslot_device_ops = { @@ -195,7 +199,7 @@ static const struct object_ops mailslot_device_ops = NULL, /* signaled */ no_satisfied, /* satisfied */ no_signal, /* signal */ - mailslot_device_get_fd, /* get_fd */ + no_get_fd, /* get_fd */ no_map_access, /* map_access */ default_get_sd, /* get_sd */ default_set_sd, /* set_sd */ @@ -204,23 +208,51 @@ static const struct object_ops mailslot_device_ops = default_unlink_name, /* unlink_name */ mailslot_device_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ - fd_close_handle, /* close_handle */ + no_close_handle, /* close_handle */ mailslot_device_destroy /* destroy */ };
+static void mailslot_device_file_dump( struct object *obj, int verbose ); +static struct fd *mailslot_device_file_get_fd( struct object *obj ); +static void mailslot_device_file_destroy( struct object *obj ); +static enum server_fd_type mailslot_device_file_get_fd_type( struct fd *fd ); + +static const struct object_ops mailslot_device_file_ops = +{ + sizeof(struct mailslot_device_file), /* size */ + mailslot_device_file_dump, /* dump */ + file_get_type, /* get_type */ + add_queue, /* add_queue */ + remove_queue, /* remove_queue */ + default_fd_signaled, /* signaled */ + no_satisfied, /* satisfied */ + no_signal, /* signal */ + mailslot_device_file_get_fd, /* get_fd */ + default_fd_map_access, /* map_access */ + default_get_sd, /* get_sd */ + default_set_sd, /* set_sd */ + no_lookup_name, /* lookup_name */ + no_link_name, /* link_name */ + NULL, /* unlink_name */ + no_open_file, /* open_file */ + no_kernel_obj_list, /* get_kernel_obj_list */ + fd_close_handle, /* close_handle */ + mailslot_device_file_destroy /* destroy */ +}; + static const struct fd_ops mailslot_device_fd_ops = { - default_fd_get_poll_events, /* get_poll_events */ - default_poll_event, /* poll_event */ - mailslot_device_get_fd_type, /* get_fd_type */ - no_fd_read, /* read */ - no_fd_write, /* write */ - no_fd_flush, /* flush */ - default_fd_get_file_info, /* get_file_info */ - no_fd_get_volume_info, /* get_volume_info */ - default_fd_ioctl, /* ioctl */ - default_fd_queue_async, /* queue_async */ - default_fd_reselect_async /* reselect_async */ + default_fd_get_poll_events, /* get_poll_events */ + default_poll_event, /* poll_event */ + mailslot_device_file_get_fd_type, /* get_fd_type */ + no_fd_read, /* read */ + no_fd_write, /* write */ + no_fd_flush, /* flush */ + default_fd_get_file_info, /* get_file_info */ + no_fd_get_volume_info, /* get_volume_info */ + default_fd_ioctl, /* ioctl */ + default_fd_queue_async, /* queue_async */ + default_fd_reselect_async /* reselect_async */ };
static void mailslot_destroy( struct object *obj) @@ -357,12 +389,6 @@ static struct object_type *mailslot_device_get_type( struct object *obj ) return get_object_type( &str ); }
-static struct fd *mailslot_device_get_fd( struct object *obj ) -{ - struct mailslot_device *device = (struct mailslot_device *)obj; - return (struct fd *)grab_object( device->fd ); -} - static struct object *mailslot_device_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr ) { @@ -382,22 +408,26 @@ static struct object *mailslot_device_lookup_name( struct object *obj, struct un static struct object *mailslot_device_open_file( struct object *obj, unsigned int access, unsigned int sharing, unsigned int options ) { - return grab_object( obj ); + struct mailslot_device_file *file; + + if (!(file = alloc_object( &mailslot_device_file_ops ))) return NULL; + file->device = (struct mailslot_device *)grab_object( obj ); + if (!(file->fd = alloc_pseudo_fd( &mailslot_device_fd_ops, obj, options ))) + { + release_object( file ); + return NULL; + } + allow_fd_caching( file->fd ); + return &file->obj; }
static void mailslot_device_destroy( struct object *obj ) { struct mailslot_device *device = (struct mailslot_device*)obj; assert( obj->ops == &mailslot_device_ops ); - if (device->fd) release_object( device->fd ); free( device->mailslots ); }
-static enum server_fd_type mailslot_device_get_fd_type( struct fd *fd ) -{ - return FD_TYPE_DEVICE; -} - struct object *create_mailslot_device( struct object *root, const struct unicode_str *name ) { struct mailslot_device *dev; @@ -406,8 +436,7 @@ struct object *create_mailslot_device( struct object *root, const struct unicode get_error() != STATUS_OBJECT_NAME_EXISTS) { dev->mailslots = NULL; - if (!(dev->fd = alloc_pseudo_fd( &mailslot_device_fd_ops, &dev->obj, 0 )) || - !(dev->mailslots = create_namespace( 7 ))) + if (!(dev->mailslots = create_namespace( 7 ))) { release_object( dev ); dev = NULL; @@ -416,6 +445,32 @@ struct object *create_mailslot_device( struct object *root, const struct unicode return &dev->obj; }
+static void mailslot_device_file_dump( struct object *obj, int verbose ) +{ + struct mailslot_device_file *file = (struct mailslot_device_file *)obj; + + fprintf( stderr, "File on mailslot device %p\n", file->device ); +} + +static struct fd *mailslot_device_file_get_fd( struct object *obj ) +{ + struct mailslot_device_file *file = (struct mailslot_device_file *)obj; + return (struct fd *)grab_object( file->fd ); +} + +static void mailslot_device_file_destroy( struct object *obj ) +{ + struct mailslot_device_file *file = (struct mailslot_device_file*)obj; + assert( obj->ops == &mailslot_device_file_ops ); + if (file->fd) release_object( file->fd ); + release_object( file->device ); +} + +static enum server_fd_type mailslot_device_file_get_fd_type( struct fd *fd ) +{ + return FD_TYPE_DEVICE; +} + static struct mailslot *create_mailslot( struct object *root, const struct unicode_str *name, unsigned int attr, int max_msgsize, timeout_t read_timeout,