From 1e54c1f0884cb197cc71cce7606a546d2cccbd17 Mon Sep 17 00:00:00 2001
From: Marcus Meissner <marcus@jet.franken.de>
Date: Tue, 16 Jul 2002 01:20:38 +0000
Subject: [PATCH] Implemented FlushFileBuffers for serial devices.

---
 server/serial.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/server/serial.c b/server/serial.c
index 486b5abb477..f2672349046 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -55,6 +55,7 @@ static int serial_get_poll_events( struct object *obj );
 static void serial_queue_async(struct object *obj, void *ptr, unsigned int status, int type, int count);
 static void destroy_serial(struct object *obj);
 static void serial_poll_event( struct object *obj, int event );
+static int serial_flush( struct object *obj );
 
 struct serial
 {
@@ -92,7 +93,7 @@ static const struct object_ops serial_ops =
     serial_get_poll_events,       /* get_poll_events */
     serial_poll_event,            /* poll_event */
     serial_get_fd,                /* get_fd */
-    no_flush,                     /* flush */
+    serial_flush,                 /* flush */
     serial_get_info,              /* get_file_info */
     serial_queue_async,           /* queue_async */
     destroy_serial                /* destroy */
@@ -316,6 +317,21 @@ static void serial_queue_async(struct object *obj, void *ptr, unsigned int statu
     set_select_events ( obj, serial_get_poll_events ( obj ));
 }
 
+static int serial_flush( struct object *obj )
+{
+    int ret;
+    struct serial *serial = (struct serial *)grab_object(obj);
+    assert( obj->ops == &serial_ops );
+
+    /* MSDN says: If hFile is a handle to a communications device,
+     * the function only flushes the transmit buffer.
+     */
+    ret = (tcflush( serial->obj.fd, TCOFLUSH ) != -1);
+    if (!ret) file_set_error();
+    release_object( serial );
+    return ret;
+}
+
 /* create a serial */
 DECL_HANDLER(create_serial)
 {
@@ -391,4 +407,3 @@ DECL_HANDLER(set_serial_info)
         release_object( serial );
     }
 }
-
-- 
GitLab