[rtems commit] termios: Implement tcflush()

Sebastian Huber sebh at rtems.org
Thu Dec 13 10:33:37 UTC 2012


Module:    rtems
Branch:    master
Commit:    b0da5796089191f85daac8ebca957cd0a104fde1
Changeset: http://git.rtems.org/rtems/commit/?id=b0da5796089191f85daac8ebca957cd0a104fde1

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Dec 12 09:25:03 2012 +0100

termios: Implement tcflush()

New IO control RTEMS_IO_TCFLUSH.

---

 cpukit/libcsupport/include/sys/ioccom.h     |    1 +
 cpukit/libcsupport/src/tcflush.c            |   35 +++--------------------
 cpukit/libcsupport/src/termios.c            |   40 +++++++++++++++++++++++++++
 testsuites/libtests/termios02/init.c        |   22 ++++++++-------
 testsuites/libtests/termios02/termios02.scn |    6 ++--
 5 files changed, 61 insertions(+), 43 deletions(-)

diff --git a/cpukit/libcsupport/include/sys/ioccom.h b/cpukit/libcsupport/include/sys/ioccom.h
index 7f6ff26..04e82fb 100644
--- a/cpukit/libcsupport/include/sys/ioccom.h
+++ b/cpukit/libcsupport/include/sys/ioccom.h
@@ -73,6 +73,7 @@
 #define       RTEMS_IO_TCDRAIN        3
 #define       RTEMS_IO_RCVWAKEUP      4
 #define       RTEMS_IO_SNDWAKEUP      5
+#define       RTEMS_IO_TCFLUSH        6
 
 /* copied from libnetworking/sys/filio.h and commented out there */
 /* Generic file-descriptor ioctl's. */
diff --git a/cpukit/libcsupport/src/tcflush.c b/cpukit/libcsupport/src/tcflush.c
index d528c2a..1cf5eb6 100644
--- a/cpukit/libcsupport/src/tcflush.c
+++ b/cpukit/libcsupport/src/tcflush.c
@@ -10,39 +10,14 @@
  */
 
 #if HAVE_CONFIG_H
-#include "config.h"
+  #include "config.h"
 #endif
 
-#include <rtems.h>
-#if defined(RTEMS_NEWLIB)
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
 #include <termios.h>
-/* #include <sys/ioctl.h> */
-
-#include <rtems/seterr.h>
-#include <rtems/libio.h>
+#include <stdint.h>
+#include <sys/ioccom.h>
 
-int tcflush (
-  int fd __attribute__((unused)),
-  int queue
-)
+int tcflush( int fd, int queue )
 {
-  switch (queue) {
-    case TCIFLUSH:
-    case TCOFLUSH:
-    case TCIOFLUSH:
-    default:
-      rtems_set_errno_and_return_minus_one( EINVAL );
-  }
-
-  /* fd is not validated */
-
-  /* When this is supported, implement it here */
-  rtems_set_errno_and_return_minus_one( ENOTSUP );
-  return 0;
+  return ioctl( fd, RTEMS_IO_TCFLUSH, (intptr_t) queue );
 }
-
-#endif
diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c
index bcf8d8a..16dd754 100644
--- a/cpukit/libcsupport/src/termios.c
+++ b/cpukit/libcsupport/src/termios.c
@@ -354,6 +354,28 @@ drainOutput (struct rtems_termios_tty *tty)
   }
 }
 
+static void
+flushOutput (struct rtems_termios_tty *tty)
+{
+  rtems_interrupt_level level;
+
+  rtems_interrupt_disable (level);
+  tty->rawOutBuf.Tail = 0;
+  tty->rawOutBuf.Head = 0;
+  rtems_interrupt_enable (level);
+}
+
+static void
+flushInput (struct rtems_termios_tty *tty)
+{
+  rtems_interrupt_level level;
+
+  rtems_interrupt_disable (level);
+  tty->rawInBuf.Tail = 0;
+  tty->rawInBuf.Head = 0;
+  rtems_interrupt_enable (level);
+}
+
 rtems_status_code
 rtems_termios_close (void *arg)
 {
@@ -572,6 +594,24 @@ rtems_termios_ioctl (void *arg)
     drainOutput (tty);
     break;
 
+  case RTEMS_IO_TCFLUSH:
+    switch ((intptr_t) args->buffer) {
+      case TCIFLUSH:
+        flushInput (tty);
+        break;
+      case TCOFLUSH:
+        flushOutput (tty);
+        break;
+      case TCIOFLUSH:
+        flushOutput (tty);
+        flushInput (tty);
+        break;
+      default:
+        sc = RTEMS_INVALID_NAME;
+        break;
+    }
+    break;
+
   case RTEMS_IO_SNDWAKEUP:
     tty->tty_snd = *wakeup;
     break;
diff --git a/testsuites/libtests/termios02/init.c b/testsuites/libtests/termios02/init.c
index 92e37ad..e944bca 100644
--- a/testsuites/libtests/termios02/init.c
+++ b/testsuites/libtests/termios02/init.c
@@ -83,25 +83,27 @@ rtems_task Init(
   puts( "" );
 
   /***** TEST TCFLUSH *****/
-  puts( "tcflush(stdin, TCIFLUSH) - ENOTSUP" );
+  puts( "tcflush(stdin, TCIFLUSH) - OK" );
+  errno = 0;
   sc = tcflush( 0, TCIFLUSH );
-  rtems_test_assert( sc == -1 );
-  rtems_test_assert( errno = ENOTSUP );
+  rtems_test_assert( sc == 0 );
+  rtems_test_assert( errno == 0 );
 
-  puts( "tcflush(stdin, TCOFLUSH) - ENOTSUP" );
+  puts( "tcflush(stdin, TCOFLUSH) - OK" );
   sc = tcflush( 0, TCOFLUSH );
-  rtems_test_assert( sc == -1 );
-  rtems_test_assert( errno = ENOTSUP );
+  rtems_test_assert( sc == 0 );
+  rtems_test_assert( errno == 0 );
 
-  puts( "tcflush(stdin, TCIOFLUSH) - ENOTSUP" );
+  puts( "tcflush(stdin, TCIOFLUSH) - OK" );
   sc = tcflush( 0, TCIOFLUSH );
-  rtems_test_assert( sc == -1 );
-  rtems_test_assert( errno = ENOTSUP );
+  rtems_test_assert( sc == 0 );
+  rtems_test_assert( errno == 0 );
 
   puts( "tcflush(stdin, 22) - EINVAL" );
+  errno = 0;
   sc = tcflush( 0, 22 );
   rtems_test_assert( sc == -1 );
-  rtems_test_assert( errno = EINVAL );
+  rtems_test_assert( errno == EINVAL );
 
   puts( "" );
 
diff --git a/testsuites/libtests/termios02/termios02.scn b/testsuites/libtests/termios02/termios02.scn
index 5e29a9c..9b38d69 100644
--- a/testsuites/libtests/termios02/termios02.scn
+++ b/testsuites/libtests/termios02/termios02.scn
@@ -10,9 +10,9 @@ tcflow(stdin, TCIOFF) - ENOTSUP
 tcflow(stdin, TCION) - ENOTSUP
 tcflow(stdin, 22) - EINVAL
 
-tcflush(stdin, TCIFLUSH) - ENOTSUP
-tcflush(stdin, TCOFLUSH) - ENOTSUP
-tcflush(stdin, TCIOFLUSH) - ENOTSUP
+tcflush(stdin, TCIFLUSH) - OK
+tcflush(stdin, TCOFLUSH) - OK
+tcflush(stdin, TCIOFLUSH) - OK
 tcflush(stdin, 22) - EINVAL
 
 tcgetpgrp( 1 ) - OK




More information about the vc mailing list