Alexandre Julliard : server: Allow the mailslot device to be opened as a file object.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 12 11:10:14 CST 2005


Module: wine
Branch: refs/heads/master
Commit: b0aa29effacd4212e24213693d8e8d9febefe7f7
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=b0aa29effacd4212e24213693d8e8d9febefe7f7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Dec 12 14:39:27 2005 +0100

server: Allow the mailslot device to be opened as a file object.

---

 server/mailslot.c |   45 +++++++++++++++++++++++++++++++++------------
 1 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/server/mailslot.c b/server/mailslot.c
index f4accf2..ce2fbfd 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -65,6 +65,7 @@ struct mailslot
 struct mailslot_device
 {
     struct object       obj;         /* object header */
+    struct fd          *fd;          /* pseudo-fd for ioctls */
     struct namespace   *mailslots;   /* mailslot namespace */
 };
 
@@ -142,6 +143,7 @@ static const struct fd_ops mail_writer_f
 };
 
 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 void mailslot_device_destroy( struct object *obj );
@@ -149,16 +151,26 @@ static void mailslot_device_destroy( str
 static const struct object_ops mailslot_device_ops =
 {
     sizeof(struct mailslot_device), /* size */
-    mailslot_device_dump,         /* dump */
-    no_add_queue,                 /* add_queue */
-    NULL,                         /* remove_queue */
-    NULL,                         /* signaled */
-    no_satisfied,                 /* satisfied */
-    no_signal,                    /* signal */
-    no_get_fd,                    /* get_fd */
-    mailslot_device_lookup_name,  /* lookup_name */
-    no_close_handle,              /* close_handle */
-    mailslot_device_destroy       /* destroy */
+    mailslot_device_dump,           /* dump */
+    no_add_queue,                   /* add_queue */
+    NULL,                           /* remove_queue */
+    NULL,                           /* signaled */
+    no_satisfied,                   /* satisfied */
+    no_signal,                      /* signal */
+    mailslot_device_get_fd,         /* get_fd */
+    mailslot_device_lookup_name,    /* lookup_name */
+    no_close_handle,                /* close_handle */
+    mailslot_device_destroy         /* destroy */
+};
+
+static const struct fd_ops mailslot_device_fd_ops =
+{
+    default_fd_get_poll_events,   /* get_poll_events */
+    default_poll_event,           /* poll_event */
+    no_flush,                     /* flush */
+    no_get_file_info,             /* get_file_info */
+    default_fd_queue_async,       /* queue_async */
+    default_fd_cancel_async       /* cancel_async */
 };
 
 static void mailslot_destroy( struct object *obj)
@@ -248,6 +260,12 @@ static void mailslot_device_dump( struct
     fprintf( stderr, "Mail slot device\n" );
 }
 
+static struct fd *mailslot_device_get_fd( struct object *obj )
+{
+    struct mailslot_device *device = (struct mailslot_device *)obj;
+    return device->fd;
+}
+
 static struct object *mailslot_device_lookup_name( struct object *obj, struct unicode_str *name,
                                                    unsigned int attr )
 {
@@ -266,7 +284,8 @@ static void mailslot_device_destroy( str
 {
     struct mailslot_device *device = (struct mailslot_device*)obj;
     assert( obj->ops == &mailslot_device_ops );
-    free( device->mailslots );
+    if (device->fd) release_object( device->fd );
+    if (device->mailslots) free( device->mailslots );
 }
 
 struct mailslot_device *create_mailslot_device( struct directory *root, const struct unicode_str *name )
@@ -276,7 +295,9 @@ struct mailslot_device *create_mailslot_
     if ((dev = create_named_object_dir( root, name, 0, &mailslot_device_ops )) &&
         get_error() != STATUS_OBJECT_NAME_EXISTS)
     {
-        if (!(dev->mailslots = create_namespace( 7 )))
+        dev->mailslots = NULL;
+        if (!(dev->fd = alloc_pseudo_fd( &mailslot_device_fd_ops, &dev->obj )) ||
+            !(dev->mailslots = create_namespace( 7 )))
         {
             release_object( dev );
             dev = NULL;




More information about the wine-cvs mailing list