Merged the get_read_fd and get_write_fd requests.

diff --git a/server/async.c b/server/async.c
index 379d130..7978a90 100644
--- a/server/async.c
+++ b/server/async.c
@@ -58,8 +58,7 @@
 static void async_dump( struct object *obj, int verbose );
 static void async_destroy( struct object *obj );
 static int async_get_poll_events( struct object *obj );
-static int async_get_read_fd( struct object *obj );
-static int async_get_write_fd( struct object *obj );
+static int async_get_fd( struct object *obj );
 static int async_get_info( struct object *obj, struct get_file_info_request *req );
 static void async_poll_event( struct object *obj, int event );
 
@@ -73,8 +72,7 @@
     no_satisfied,                 /* satisfied */
     async_get_poll_events,        /* get_poll_events */
     async_poll_event,             /* poll_event */
-    async_get_read_fd,            /* get_read_fd */
-    async_get_write_fd,           /* get_write_fd */
+    async_get_fd,                 /* get_fd */
     no_flush,                     /* flush */
     async_get_info,               /* get_file_info */
     async_destroy                 /* destroy */
@@ -115,14 +113,7 @@
     return serial_async_get_poll_events(ov);
 }
 
-static int async_get_read_fd( struct object *obj )
-{
-    struct async *async = (struct async *)obj;
-    assert( obj->ops == &async_ops );
-    return dup( async->obj.fd );
-}
-
-static int async_get_write_fd( struct object *obj )
+static int async_get_fd( struct object *obj )
 {
     struct async *async = (struct async *)obj;
     assert( obj->ops == &async_ops );
diff --git a/server/atom.c b/server/atom.c
index 0e9f477..55fc6b7 100644
--- a/server/atom.c
+++ b/server/atom.c
@@ -54,8 +54,7 @@
     NULL,                         /* satified */
     NULL,                         /* get_poll_events */
     NULL,                         /* poll_event */
-    no_read_fd,                   /* get_read_fd */
-    no_write_fd,                  /* get_write_fd */
+    no_get_fd,                    /* get_fd */
     no_flush,                     /* flush */
     no_get_file_info,             /* get_file_info */
     atom_table_destroy            /* destroy */
diff --git a/server/change.c b/server/change.c
index 844e21b..338712e 100644
--- a/server/change.c
+++ b/server/change.c
@@ -34,8 +34,7 @@
     no_satisfied,             /* satisfied */
     NULL,                     /* get_poll_events */
     NULL,                     /* poll_event */
-    no_read_fd,               /* get_read_fd */
-    no_write_fd,              /* get_write_fd */
+    no_get_fd,                /* get_fd */
     no_flush,                 /* flush */
     no_get_file_info,         /* get_file_info */
     no_destroy                /* destroy */
diff --git a/server/console.c b/server/console.c
index e8526a2..6f72ade 100644
--- a/server/console.c
+++ b/server/console.c
@@ -58,12 +58,12 @@
 
 static void console_input_dump( struct object *obj, int verbose );
 static int console_input_get_poll_events( struct object *obj );
-static int console_input_get_read_fd( struct object *obj );
+static int console_input_get_fd( struct object *obj );
 static void console_input_destroy( struct object *obj );
 
 static void screen_buffer_dump( struct object *obj, int verbose );
 static int screen_buffer_get_poll_events( struct object *obj );
-static int screen_buffer_get_write_fd( struct object *obj );
+static int screen_buffer_get_fd( struct object *obj );
 static void screen_buffer_destroy( struct object *obj );
 
 /* common routine */
@@ -79,8 +79,7 @@
     no_satisfied,                     /* satisfied */
     console_input_get_poll_events,    /* get_poll_events */
     default_poll_event,               /* poll_event */
-    console_input_get_read_fd,        /* get_read_fd */
-    no_write_fd,                      /* get_write_fd */
+    console_input_get_fd,             /* get_fd */
     no_flush,                         /* flush */
     console_get_info,                 /* get_file_info */
     console_input_destroy             /* destroy */
@@ -96,8 +95,7 @@
     no_satisfied,                     /* satisfied */
     screen_buffer_get_poll_events,    /* get_poll_events */
     default_poll_event,               /* poll_event */
-    no_read_fd,                       /* get_read_fd */
-    screen_buffer_get_write_fd,       /* get_write_fd */
+    screen_buffer_get_fd,             /* get_fd */
     no_flush,                         /* flush */
     console_get_info,                 /* get_file_info */
     screen_buffer_destroy             /* destroy */
@@ -352,7 +350,7 @@
     return POLLIN;
 }
 
-static int console_input_get_read_fd( struct object *obj )
+static int console_input_get_fd( struct object *obj )
 {
     struct console_input *console = (struct console_input *)obj;
     assert( obj->ops == &console_input_ops );
@@ -393,7 +391,7 @@
     return POLLOUT;
 }
 
-static int screen_buffer_get_write_fd( struct object *obj )
+static int screen_buffer_get_fd( struct object *obj )
 {
     struct screen_buffer *console = (struct screen_buffer *)obj;
     assert( obj->ops == &screen_buffer_ops );
@@ -483,12 +481,12 @@
 
     if (!(obj = get_handle_obj( current->process, req->file_handle,
                                 GENERIC_READ | GENERIC_WRITE, NULL ))) return;
-    if ((fd_in = obj->ops->get_read_fd( obj )) == -1)
+    if ((fd_in = obj->ops->get_fd( obj )) == -1)
     {
         release_object( obj );
         return;
     }
-    fd_out = obj->ops->get_write_fd( obj );
+    fd_out = dup( fd_in );
     release_object( obj );
     if (fd_out != -1)
     {
diff --git a/server/debugger.c b/server/debugger.c
index 946d659..c88f82e 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -53,8 +53,7 @@
     no_satisfied,                  /* satisfied */
     NULL,                          /* get_poll_events */
     NULL,                          /* poll_event */
-    no_read_fd,                    /* get_read_fd */
-    no_write_fd,                   /* get_write_fd */
+    no_get_fd,                     /* get_fd */
     no_flush,                      /* flush */
     no_get_file_info,              /* get_file_info */
     debug_event_destroy            /* destroy */
@@ -74,8 +73,7 @@
     no_satisfied,                  /* satisfied */
     NULL,                          /* get_poll_events */
     NULL,                          /* poll_event */
-    no_read_fd,                    /* get_read_fd */
-    no_write_fd,                   /* get_write_fd */
+    no_get_fd,                     /* get_fd */
     no_flush,                      /* flush */
     no_get_file_info,              /* get_file_info */
     debug_ctx_destroy              /* destroy */
diff --git a/server/device.c b/server/device.c
index f1ab4c3..4183b75 100644
--- a/server/device.c
+++ b/server/device.c
@@ -41,8 +41,7 @@
     NULL,                     /* satisfied */
     NULL,                     /* get_poll_events */
     NULL,                     /* poll_event */
-    no_read_fd,               /* get_read_fd */
-    no_write_fd,              /* get_write_fd */
+    no_get_fd,                /* get_fd */
     no_flush,                 /* flush */
     device_get_info,          /* get_file_info */
     no_destroy                /* destroy */
diff --git a/server/event.c b/server/event.c
index f259b90..18f6b41 100644
--- a/server/event.c
+++ b/server/event.c
@@ -35,8 +35,7 @@
     event_satisfied,           /* satisfied */
     NULL,                      /* get_poll_events */
     NULL,                      /* poll_event */
-    no_read_fd,                /* get_read_fd */
-    no_write_fd,               /* get_write_fd */
+    no_get_fd,                 /* get_fd */
     no_flush,                  /* flush */
     no_get_file_info,          /* get_file_info */
     no_destroy                 /* destroy */
diff --git a/server/file.c b/server/file.c
index 61a3dd3..5c0f59a 100644
--- a/server/file.c
+++ b/server/file.c
@@ -45,8 +45,7 @@
 
 static void file_dump( struct object *obj, int verbose );
 static int file_get_poll_events( struct object *obj );
-static int file_get_read_fd( struct object *obj );
-static int file_get_write_fd( struct object *obj );
+static int file_get_fd( struct object *obj );
 static int file_flush( struct object *obj );
 static int file_get_info( struct object *obj, struct get_file_info_request *req );
 static void file_destroy( struct object *obj );
@@ -61,8 +60,7 @@
     no_satisfied,                 /* satisfied */
     file_get_poll_events,         /* get_poll_events */
     default_poll_event,           /* poll_event */
-    file_get_read_fd,             /* get_read_fd */
-    file_get_write_fd,            /* get_write_fd */
+    file_get_fd,                  /* get_fd */
     file_flush,                   /* flush */
     file_get_info,                /* get_file_info */
     file_destroy                  /* destroy */
@@ -233,14 +231,7 @@
     return events;
 }
 
-static int file_get_read_fd( struct object *obj )
-{
-    struct file *file = (struct file *)obj;
-    assert( obj->ops == &file_ops );
-    return dup( file->obj.fd );
-}
-
-static int file_get_write_fd( struct object *obj )
+static int file_get_fd( struct object *obj )
 {
     struct file *file = (struct file *)obj;
     assert( obj->ops == &file_ops );
@@ -480,26 +471,15 @@
     else set_error( STATUS_INVALID_PARAMETER );
 }
 
-/* get a Unix fd to read from a file */
-DECL_HANDLER(get_read_fd)
+/* get a Unix fd to access a file */
+DECL_HANDLER(get_handle_fd)
 {
     struct object *obj;
 
-    if ((obj = get_handle_obj( current->process, req->handle, GENERIC_READ, NULL )))
+    req->fd = -1;
+    if ((obj = get_handle_obj( current->process, req->handle, req->access, NULL )))
     {
-        set_reply_fd( current, obj->ops->get_read_fd( obj ) );
-        release_object( obj );
-    }
-}
-
-/* get a Unix fd to write to a file */
-DECL_HANDLER(get_write_fd)
-{
-    struct object *obj;
-
-    if ((obj = get_handle_obj( current->process, req->handle, GENERIC_WRITE, NULL )))
-    {
-        set_reply_fd( current, obj->ops->get_write_fd( obj ) );
+        set_reply_fd( current, obj->ops->get_fd( obj ) );
         release_object( obj );
     }
 }
diff --git a/server/handle.c b/server/handle.c
index e71c261..1d1317f 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -76,8 +76,7 @@
     NULL,                            /* satisfied */
     NULL,                            /* get_poll_events */
     NULL,                            /* poll_event */
-    no_read_fd,                      /* get_read_fd */
-    no_write_fd,                     /* get_write_fd */
+    no_get_fd,                       /* get_fd */
     no_flush,                        /* flush */
     no_get_file_info,                /* get_file_info */
     handle_table_destroy             /* destroy */
diff --git a/server/mapping.c b/server/mapping.c
index 254924e..a68e8fb 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -43,8 +43,7 @@
     NULL,                        /* satisfied */
     NULL,                        /* get_poll_events */
     NULL,                        /* poll_event */
-    no_read_fd,                  /* get_read_fd */
-    no_write_fd,                 /* get_write_fd */
+    no_get_fd,                   /* get_fd */
     no_flush,                    /* flush */
     no_get_file_info,            /* get_file_info */
     mapping_destroy              /* destroy */
diff --git a/server/mutex.c b/server/mutex.c
index 82b76c2..1adf373 100644
--- a/server/mutex.c
+++ b/server/mutex.c
@@ -39,8 +39,7 @@
     mutex_satisfied,           /* satisfied */
     NULL,                      /* get_poll_events */
     NULL,                      /* poll_event */
-    no_read_fd,                /* get_read_fd */
-    no_write_fd,               /* get_write_fd */
+    no_get_fd,                 /* get_fd */
     no_flush,                  /* flush */
     no_get_file_info,          /* get_file_info */
     mutex_destroy              /* destroy */
diff --git a/server/object.c b/server/object.c
index f2a7f1f..ba2bce8 100644
--- a/server/object.c
+++ b/server/object.c
@@ -251,13 +251,7 @@
     return 0;  /* not abandoned */
 }
 
-int no_read_fd( struct object *obj )
-{
-    set_error( STATUS_OBJECT_TYPE_MISMATCH );
-    return -1;
-}
-
-int no_write_fd( struct object *obj )
+int no_get_fd( struct object *obj )
 {
     set_error( STATUS_OBJECT_TYPE_MISMATCH );
     return -1;
diff --git a/server/object.h b/server/object.h
index 746b7f6..7a7d1a3 100644
--- a/server/object.h
+++ b/server/object.h
@@ -46,10 +46,8 @@
     int  (*get_poll_events)(struct object *);
     /* a poll() event occured */
     void (*poll_event)(struct object *,int event);
-    /* return a Unix fd that can be used to read from the object */
-    int  (*get_read_fd)(struct object *);
-    /* return a Unix fd that can be used to write to the object */
-    int  (*get_write_fd)(struct object *);
+    /* return a Unix fd that can be used to read/write from the object */
+    int  (*get_fd)(struct object *);
     /* flush the object buffers */
     int  (*flush)(struct object *);
     /* get file information */
@@ -93,8 +91,7 @@
 extern struct object *find_object( const WCHAR *name, size_t len );
 extern int no_add_queue( struct object *obj, struct wait_queue_entry *entry );
 extern int no_satisfied( struct object *obj, struct thread *thread );
-extern int no_read_fd( struct object *obj );
-extern int no_write_fd( struct object *obj );
+extern int no_get_fd( struct object *obj );
 extern int no_flush( struct object *obj );
 extern int no_get_file_info( struct object *obj, struct get_file_info_request *info );
 extern void no_destroy( struct object *obj );
diff --git a/server/pipe.c b/server/pipe.c
index d86fde8..5c830c0 100644
--- a/server/pipe.c
+++ b/server/pipe.c
@@ -37,8 +37,7 @@
 
 static void pipe_dump( struct object *obj, int verbose );
 static int pipe_get_poll_events( struct object *obj );
-static int pipe_get_read_fd( struct object *obj );
-static int pipe_get_write_fd( struct object *obj );
+static int pipe_get_fd( struct object *obj );
 static int pipe_get_info( struct object *obj, struct get_file_info_request *req );
 static void pipe_destroy( struct object *obj );
 
@@ -52,8 +51,7 @@
     no_satisfied,                 /* satisfied */
     pipe_get_poll_events,         /* get_poll_events */
     default_poll_event,           /* poll_event */
-    pipe_get_read_fd,             /* get_read_fd */
-    pipe_get_write_fd,            /* get_write_fd */
+    pipe_get_fd,                  /* get_fd */
     no_flush,                     /* flush */
     pipe_get_info,                /* get_file_info */
     pipe_destroy                  /* destroy */
@@ -114,7 +112,7 @@
     return (pipe->side == READ_SIDE) ? POLLIN : POLLOUT;
 }
 
-static int pipe_get_read_fd( struct object *obj )
+static int pipe_get_fd( struct object *obj )
 {
     struct pipe *pipe = (struct pipe *)obj;
     assert( obj->ops == &pipe_ops );
@@ -124,29 +122,6 @@
         set_error( STATUS_PIPE_BROKEN );
         return -1;
     }
-    if (pipe->side != READ_SIDE)  /* FIXME: should not be necessary */
-    {
-        set_error( STATUS_ACCESS_DENIED );
-        return -1;
-    }
-    return dup( pipe->obj.fd );
-}
-
-static int pipe_get_write_fd( struct object *obj )
-{
-    struct pipe *pipe = (struct pipe *)obj;
-    assert( obj->ops == &pipe_ops );
-
-    if (!pipe->other)
-    {
-        set_error( STATUS_PIPE_BROKEN );
-        return -1;
-    }
-    if (pipe->side != WRITE_SIDE)  /* FIXME: should not be necessary */
-    {
-        set_error( STATUS_ACCESS_DENIED );
-        return -1;
-    }
     return dup( pipe->obj.fd );
 }
 
diff --git a/server/process.c b/server/process.c
index bdf4be6..c88bd40 100644
--- a/server/process.c
+++ b/server/process.c
@@ -48,8 +48,7 @@
     no_satisfied,                /* satisfied */
     NULL,                        /* get_poll_events */
     NULL,                        /* poll_event */
-    no_read_fd,                  /* get_read_fd */
-    no_write_fd,                 /* get_write_fd */
+    no_get_fd,                   /* get_fd */
     no_flush,                    /* flush */
     no_get_file_info,            /* get_file_info */
     process_destroy              /* destroy */
@@ -87,8 +86,7 @@
     no_satisfied,                  /* satisfied */
     NULL,                          /* get_poll_events */
     NULL,                          /* poll_event */
-    no_read_fd,                    /* get_read_fd */
-    no_write_fd,                   /* get_write_fd */
+    no_get_fd,                     /* get_fd */
     no_flush,                      /* flush */
     no_get_file_info,              /* get_file_info */
     startup_info_destroy           /* destroy */
@@ -716,7 +714,6 @@
 {
     size_t len = get_req_data_size( req );
     struct startup_info *info;
-    int sock[2];
 
     if (current->info)
     {
@@ -752,24 +749,6 @@
     }
     memcpy( info->filename, get_req_data(req), len );
     info->filename[len] = 0;
-
-    if (req->alloc_fd)
-    {
-        if (socketpair( AF_UNIX, SOCK_STREAM, 0, sock ) == -1)
-        {
-            file_set_error();
-            release_object( info );
-            return;
-        }
-        if (!create_process( sock[0] ))
-        {
-            release_object( info );
-            close( sock[1] );
-            return;
-        }
-        /* thread object will be released when the thread gets killed */
-        set_reply_fd( current, sock[1] );
-    }
     current->info = info;
 }
 
diff --git a/server/queue.c b/server/queue.c
index 80cfda6..8d63e7b 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -36,8 +36,7 @@
     msg_queue_satisfied,       /* satisfied */
     NULL,                      /* get_poll_events */
     NULL,                      /* poll_event */
-    no_read_fd,                /* get_read_fd */
-    no_write_fd,               /* get_write_fd */
+    no_get_fd,                 /* get_fd */
     no_flush,                  /* flush */
     no_get_file_info,          /* get_file_info */
     no_destroy                 /* destroy */
diff --git a/server/registry.c b/server/registry.c
index 3c1d57c..af7ba8a 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -137,8 +137,7 @@
     NULL,                    /* satisfied */
     NULL,                    /* get_poll_events */
     NULL,                    /* poll_event */
-    no_read_fd,              /* get_read_fd */
-    no_write_fd,             /* get_write_fd */
+    no_get_fd,               /* get_fd */
     no_flush,                /* flush */
     no_get_file_info,        /* get_file_info */
     key_destroy              /* destroy */
@@ -1341,7 +1340,7 @@
     int fd;
 
     if (!(obj = get_handle_obj( current->process, handle, GENERIC_READ, NULL ))) return;
-    fd = obj->ops->get_read_fd( obj );
+    fd = obj->ops->get_fd( obj );
     release_object( obj );
     if (fd != -1)
     {
@@ -1436,7 +1435,7 @@
         return;
     }
     if (!(obj = get_handle_obj( current->process, handle, GENERIC_WRITE, NULL ))) return;
-    fd = obj->ops->get_write_fd( obj );
+    fd = obj->ops->get_fd( obj );
     release_object( obj );
     if (fd != -1)
     {
diff --git a/server/request.c b/server/request.c
index 5ad899a..c3928e5 100644
--- a/server/request.c
+++ b/server/request.c
@@ -64,8 +64,7 @@
     NULL,                          /* satisfied */
     NULL,                          /* get_poll_events */
     master_socket_poll_event,      /* poll_event */
-    no_read_fd,                    /* get_read_fd */
-    no_write_fd,                   /* get_write_fd */
+    no_get_fd,                     /* get_fd */
     no_flush,                      /* flush */
     no_get_file_info,              /* get_file_info */
     master_socket_destroy          /* destroy */
diff --git a/server/request.h b/server/request.h
index ec32edf..ef856f3 100644
--- a/server/request.h
+++ b/server/request.h
@@ -106,8 +106,7 @@
 DECL_HANDLER(open_semaphore);
 DECL_HANDLER(create_file);
 DECL_HANDLER(alloc_file_handle);
-DECL_HANDLER(get_read_fd);
-DECL_HANDLER(get_write_fd);
+DECL_HANDLER(get_handle_fd);
 DECL_HANDLER(set_file_pointer);
 DECL_HANDLER(truncate_file);
 DECL_HANDLER(set_file_time);
@@ -222,8 +221,7 @@
     (req_handler)req_open_semaphore,
     (req_handler)req_create_file,
     (req_handler)req_alloc_file_handle,
-    (req_handler)req_get_read_fd,
-    (req_handler)req_get_write_fd,
+    (req_handler)req_get_handle_fd,
     (req_handler)req_set_file_pointer,
     (req_handler)req_truncate_file,
     (req_handler)req_set_file_time,
diff --git a/server/semaphore.c b/server/semaphore.c
index 25c0c51..710f6ab 100644
--- a/server/semaphore.c
+++ b/server/semaphore.c
@@ -35,8 +35,7 @@
     semaphore_satisfied,           /* satisfied */
     NULL,                          /* get_poll_events */
     NULL,                          /* poll_event */
-    no_read_fd,                    /* get_read_fd */
-    no_write_fd,                   /* get_write_fd */
+    no_get_fd,                     /* get_fd */
     no_flush,                      /* flush */
     no_get_file_info,              /* get_file_info */
     no_destroy                     /* destroy */
diff --git a/server/serial.c b/server/serial.c
index c549bec..7d30d4d 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -37,8 +37,7 @@
 #include "request.h"
 
 static void serial_dump( struct object *obj, int verbose );
-static int serial_get_read_fd( struct object *obj );
-static int serial_get_write_fd( struct object *obj );
+static int serial_get_fd( struct object *obj );
 static int serial_get_info( struct object *obj, struct get_file_info_request *req );
 static int serial_get_poll_events( struct object *obj );
 
@@ -72,8 +71,7 @@
     no_satisfied,                 /* satisfied */
     serial_get_poll_events,       /* get_poll_events */
     default_poll_event,           /* poll_event */
-    serial_get_read_fd,           /* get_read_fd */
-    serial_get_write_fd,          /* get_write_fd */
+    serial_get_fd,                /* get_fd */
     no_flush,                     /* flush */
     serial_get_info,              /* get_file_info */
     no_destroy                    /* destroy */
@@ -152,14 +150,7 @@
     return events;
 }
 
-static int serial_get_read_fd( struct object *obj )
-{
-    struct serial *serial = (struct serial *)obj;
-    assert( obj->ops == &serial_ops );
-    return dup( serial->obj.fd );
-}
-
-static int serial_get_write_fd( struct object *obj )
+static int serial_get_fd( struct object *obj )
 {
     struct serial *serial = (struct serial *)obj;
     assert( obj->ops == &serial_ops );
diff --git a/server/snapshot.c b/server/snapshot.c
index 0a690eb..ae4eb49 100644
--- a/server/snapshot.c
+++ b/server/snapshot.c
@@ -47,8 +47,7 @@
     NULL,                         /* satisfied */
     NULL,                         /* get_poll_events */
     NULL,                         /* poll_event */
-    no_read_fd,                   /* get_read_fd */
-    no_write_fd,                  /* get_write_fd */
+    no_get_fd,                    /* get_fd */
     no_flush,                     /* flush */
     no_get_file_info,             /* get_file_info */
     snapshot_destroy              /* destroy */
diff --git a/server/sock.c b/server/sock.c
index 72cea89..c5f41e4 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -69,8 +69,7 @@
     no_satisfied,                 /* satisfied */
     sock_get_poll_events,         /* get_poll_events */
     sock_poll_event,              /* poll_event */
-    sock_get_fd,                  /* get_read_fd */
-    sock_get_fd,                  /* get_write_fd */
+    sock_get_fd,                  /* get_fd */
     no_flush,                     /* flush */
     no_get_file_info,             /* get_file_info */
     sock_destroy                  /* destroy */
diff --git a/server/thread.c b/server/thread.c
index d21cdd7..7cfacdc 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -76,8 +76,7 @@
     no_satisfied,               /* satisfied */
     NULL,                       /* get_poll_events */
     thread_poll_event,          /* poll_event */
-    no_read_fd,                 /* get_read_fd */
-    no_write_fd,                /* get_write_fd */
+    no_get_fd,                  /* get_fd */
     no_flush,                   /* flush */
     no_get_file_info,           /* get_file_info */
     destroy_thread              /* destroy */
diff --git a/server/timer.c b/server/timer.c
index d74fc72..198b0f5 100644
--- a/server/timer.c
+++ b/server/timer.c
@@ -42,8 +42,7 @@
     timer_satisfied,           /* satisfied */
     NULL,                      /* get_poll_events */
     NULL,                      /* poll_event */
-    no_read_fd,                /* get_read_fd */
-    no_write_fd,               /* get_write_fd */
+    no_get_fd,                 /* get_fd */
     no_flush,                  /* flush */
     no_get_file_info,          /* get_file_info */
     timer_destroy              /* destroy */
diff --git a/server/trace.c b/server/trace.c
index 6b6f3ab..bad07e8 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -256,7 +256,6 @@
     fprintf( stderr, " hstdout=%d,", req->hstdout );
     fprintf( stderr, " hstderr=%d,", req->hstderr );
     fprintf( stderr, " cmd_show=%d,", req->cmd_show );
-    fprintf( stderr, " alloc_fd=%d,", req->alloc_fd );
     fprintf( stderr, " filename=" );
     cur_pos += dump_varargs_string( req );
 }
@@ -657,14 +656,15 @@
     fprintf( stderr, " handle=%d", req->handle );
 }
 
-static void dump_get_read_fd_request( const struct get_read_fd_request *req )
+static void dump_get_handle_fd_request( const struct get_handle_fd_request *req )
 {
-    fprintf( stderr, " handle=%d", req->handle );
+    fprintf( stderr, " handle=%d,", req->handle );
+    fprintf( stderr, " access=%08x", req->access );
 }
 
-static void dump_get_write_fd_request( const struct get_write_fd_request *req )
+static void dump_get_handle_fd_reply( const struct get_handle_fd_request *req )
 {
-    fprintf( stderr, " handle=%d", req->handle );
+    fprintf( stderr, " fd=%d", req->fd );
 }
 
 static void dump_set_file_pointer_request( const struct set_file_pointer_request *req )
@@ -1487,8 +1487,7 @@
     (dump_func)dump_open_semaphore_request,
     (dump_func)dump_create_file_request,
     (dump_func)dump_alloc_file_handle_request,
-    (dump_func)dump_get_read_fd_request,
-    (dump_func)dump_get_write_fd_request,
+    (dump_func)dump_get_handle_fd_request,
     (dump_func)dump_set_file_pointer_request,
     (dump_func)dump_truncate_file_request,
     (dump_func)dump_set_file_time_request,
@@ -1600,8 +1599,7 @@
     (dump_func)dump_open_semaphore_reply,
     (dump_func)dump_create_file_reply,
     (dump_func)dump_alloc_file_handle_reply,
-    (dump_func)0,
-    (dump_func)0,
+    (dump_func)dump_get_handle_fd_reply,
     (dump_func)dump_set_file_pointer_reply,
     (dump_func)0,
     (dump_func)0,
@@ -1713,8 +1711,7 @@
     "open_semaphore",
     "create_file",
     "alloc_file_handle",
-    "get_read_fd",
-    "get_write_fd",
+    "get_handle_fd",
     "set_file_pointer",
     "truncate_file",
     "set_file_time",