Alexandre Julliard : server: Add read and write requests on file objects.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 6 09:29:04 CDT 2015


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May  5 12:50:51 2015 +0900

server: Add read and write requests on file objects.

---

 include/wine/server_protocol.h | 44 +++++++++++++++++++++++++++++++++++++++++-
 server/fd.c                    | 26 +++++++++++++++++++++++++
 server/protocol.def            | 25 ++++++++++++++++++++++++
 server/request.h               | 19 ++++++++++++++++++
 server/trace.c                 | 35 +++++++++++++++++++++++++++++++++
 5 files changed, 148 insertions(+), 1 deletion(-)

diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index fabd3b4..b838f0b 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -3110,6 +3110,42 @@ struct cancel_async_reply
 
 
 
+struct read_request
+{
+    struct request_header __header;
+    int            blocking;
+    async_data_t   async;
+    file_pos_t     pos;
+};
+struct read_reply
+{
+    struct reply_header __header;
+    obj_handle_t   wait;
+    unsigned int   options;
+    /* VARARG(data,bytes); */
+};
+
+
+
+struct write_request
+{
+    struct request_header __header;
+    int            blocking;
+    async_data_t   async;
+    file_pos_t     pos;
+    /* VARARG(data,bytes); */
+};
+struct write_reply
+{
+    struct reply_header __header;
+    obj_handle_t   wait;
+    unsigned int   options;
+    data_size_t    size;
+    char __pad_20[4];
+};
+
+
+
 struct ioctl_request
 {
     struct request_header __header;
@@ -5319,6 +5355,8 @@ enum request
     REQ_set_serial_info,
     REQ_register_async,
     REQ_cancel_async,
+    REQ_read,
+    REQ_write,
     REQ_ioctl,
     REQ_set_irp_result,
     REQ_get_irp_result,
@@ -5588,6 +5626,8 @@ union generic_request
     struct set_serial_info_request set_serial_info_request;
     struct register_async_request register_async_request;
     struct cancel_async_request cancel_async_request;
+    struct read_request read_request;
+    struct write_request write_request;
     struct ioctl_request ioctl_request;
     struct set_irp_result_request set_irp_result_request;
     struct get_irp_result_request get_irp_result_request;
@@ -5855,6 +5895,8 @@ union generic_reply
     struct set_serial_info_reply set_serial_info_reply;
     struct register_async_reply register_async_reply;
     struct cancel_async_reply cancel_async_reply;
+    struct read_reply read_reply;
+    struct write_reply write_reply;
     struct ioctl_reply ioctl_reply;
     struct set_irp_result_reply set_irp_result_reply;
     struct get_irp_result_reply get_irp_result_reply;
@@ -5978,6 +6020,6 @@ union generic_reply
     struct terminate_job_reply terminate_job_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 472
+#define SERVER_PROTOCOL_VERSION 473
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/fd.c b/server/fd.c
index c5340ff..e7f151a 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -2303,6 +2303,32 @@ DECL_HANDLER(get_handle_fd)
     }
 }
 
+/* perform a read on a file object */
+DECL_HANDLER(read)
+{
+    struct fd *fd = get_handle_fd_obj( current->process, req->async.handle, FILE_READ_DATA );
+
+    if (fd)
+    {
+        reply->wait    = fd->fd_ops->read( fd, &req->async, req->blocking, req->pos );
+        reply->options = fd->options;
+        release_object( fd );
+    }
+}
+
+/* perform a write on a file object */
+DECL_HANDLER(write)
+{
+    struct fd *fd = get_handle_fd_obj( current->process, req->async.handle, FILE_WRITE_DATA );
+
+    if (fd)
+    {
+        reply->wait    = fd->fd_ops->write( fd, &req->async, req->blocking, req->pos, &reply->size );
+        reply->options = fd->options;
+        release_object( fd );
+    }
+}
+
 /* perform an ioctl on a file */
 DECL_HANDLER(ioctl)
 {
diff --git a/server/protocol.def b/server/protocol.def
index 3c03977..b2c417d 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2250,6 +2250,31 @@ enum message_type
 @END
 
 
+/* Perform a read on a file object */
+ at REQ(read)
+    int            blocking;      /* whether it's a blocking read */
+    async_data_t   async;         /* async I/O parameters */
+    file_pos_t     pos;           /* read position */
+ at REPLY
+    obj_handle_t   wait;          /* handle to wait on for blocking read */
+    unsigned int   options;       /* device open options */
+    VARARG(data,bytes);           /* read data */
+ at END
+
+
+/* Perform a write on a file object */
+ at REQ(write)
+    int            blocking;      /* whether it's a blocking write */
+    async_data_t   async;         /* async I/O parameters */
+    file_pos_t     pos;           /* write position */
+    VARARG(data,bytes);           /* write data */
+ at REPLY
+    obj_handle_t   wait;          /* handle to wait on for blocking write */
+    unsigned int   options;       /* device open options */
+    data_size_t    size;          /* size written */
+ at END
+
+
 /* Perform an ioctl on a file */
 @REQ(ioctl)
     ioctl_code_t   code;          /* ioctl code */
diff --git a/server/request.h b/server/request.h
index 9ed815e..6d43e9f 100644
--- a/server/request.h
+++ b/server/request.h
@@ -247,6 +247,8 @@ DECL_HANDLER(get_serial_info);
 DECL_HANDLER(set_serial_info);
 DECL_HANDLER(register_async);
 DECL_HANDLER(cancel_async);
+DECL_HANDLER(read);
+DECL_HANDLER(write);
 DECL_HANDLER(ioctl);
 DECL_HANDLER(set_irp_result);
 DECL_HANDLER(get_irp_result);
@@ -515,6 +517,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_set_serial_info,
     (req_handler)req_register_async,
     (req_handler)req_cancel_async,
+    (req_handler)req_read,
+    (req_handler)req_write,
     (req_handler)req_ioctl,
     (req_handler)req_set_irp_result,
     (req_handler)req_get_irp_result,
@@ -1521,6 +1525,21 @@ C_ASSERT( FIELD_OFFSET(struct cancel_async_request, handle) == 12 );
 C_ASSERT( FIELD_OFFSET(struct cancel_async_request, iosb) == 16 );
 C_ASSERT( FIELD_OFFSET(struct cancel_async_request, only_thread) == 24 );
 C_ASSERT( sizeof(struct cancel_async_request) == 32 );
+C_ASSERT( FIELD_OFFSET(struct read_request, blocking) == 12 );
+C_ASSERT( FIELD_OFFSET(struct read_request, async) == 16 );
+C_ASSERT( FIELD_OFFSET(struct read_request, pos) == 56 );
+C_ASSERT( sizeof(struct read_request) == 64 );
+C_ASSERT( FIELD_OFFSET(struct read_reply, wait) == 8 );
+C_ASSERT( FIELD_OFFSET(struct read_reply, options) == 12 );
+C_ASSERT( sizeof(struct read_reply) == 16 );
+C_ASSERT( FIELD_OFFSET(struct write_request, blocking) == 12 );
+C_ASSERT( FIELD_OFFSET(struct write_request, async) == 16 );
+C_ASSERT( FIELD_OFFSET(struct write_request, pos) == 56 );
+C_ASSERT( sizeof(struct write_request) == 64 );
+C_ASSERT( FIELD_OFFSET(struct write_reply, wait) == 8 );
+C_ASSERT( FIELD_OFFSET(struct write_reply, options) == 12 );
+C_ASSERT( FIELD_OFFSET(struct write_reply, size) == 16 );
+C_ASSERT( sizeof(struct write_reply) == 24 );
 C_ASSERT( FIELD_OFFSET(struct ioctl_request, code) == 12 );
 C_ASSERT( FIELD_OFFSET(struct ioctl_request, async) == 16 );
 C_ASSERT( FIELD_OFFSET(struct ioctl_request, blocking) == 56 );
diff --git a/server/trace.c b/server/trace.c
index 8d888d3..e8d19de 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2726,6 +2726,35 @@ static void dump_cancel_async_request( const struct cancel_async_request *req )
     fprintf( stderr, ", only_thread=%d", req->only_thread );
 }
 
+static void dump_read_request( const struct read_request *req )
+{
+    fprintf( stderr, " blocking=%d", req->blocking );
+    dump_async_data( ", async=", &req->async );
+    dump_uint64( ", pos=", &req->pos );
+}
+
+static void dump_read_reply( const struct read_reply *req )
+{
+    fprintf( stderr, " wait=%04x", req->wait );
+    fprintf( stderr, ", options=%08x", req->options );
+    dump_varargs_bytes( ", data=", cur_size );
+}
+
+static void dump_write_request( const struct write_request *req )
+{
+    fprintf( stderr, " blocking=%d", req->blocking );
+    dump_async_data( ", async=", &req->async );
+    dump_uint64( ", pos=", &req->pos );
+    dump_varargs_bytes( ", data=", cur_size );
+}
+
+static void dump_write_reply( const struct write_reply *req )
+{
+    fprintf( stderr, " wait=%04x", req->wait );
+    fprintf( stderr, ", options=%08x", req->options );
+    fprintf( stderr, ", size=%u", req->size );
+}
+
 static void dump_ioctl_request( const struct ioctl_request *req )
 {
     dump_ioctl_code( " code=", &req->code );
@@ -4292,6 +4321,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_set_serial_info_request,
     (dump_func)dump_register_async_request,
     (dump_func)dump_cancel_async_request,
+    (dump_func)dump_read_request,
+    (dump_func)dump_write_request,
     (dump_func)dump_ioctl_request,
     (dump_func)dump_set_irp_result_request,
     (dump_func)dump_get_irp_result_request,
@@ -4557,6 +4588,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     NULL,
     NULL,
     NULL,
+    (dump_func)dump_read_reply,
+    (dump_func)dump_write_reply,
     (dump_func)dump_ioctl_reply,
     NULL,
     (dump_func)dump_get_irp_result_reply,
@@ -4822,6 +4855,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "set_serial_info",
     "register_async",
     "cancel_async",
+    "read",
+    "write",
     "ioctl",
     "set_irp_result",
     "get_irp_result",




More information about the wine-cvs mailing list