summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-12 09:25:03 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-13 11:36:37 +0100
commitb0da5796089191f85daac8ebca957cd0a104fde1 (patch)
tree1f1cf3bcfad1ede2377142e88d6062eb3df0c9db
parenttermios: Fix tcflow() error status (diff)
downloadrtems-b0da5796089191f85daac8ebca957cd0a104fde1.tar.bz2
termios: Implement tcflush()
New IO control RTEMS_IO_TCFLUSH.
-rw-r--r--cpukit/libcsupport/include/sys/ioccom.h1
-rw-r--r--cpukit/libcsupport/src/tcflush.c35
-rw-r--r--cpukit/libcsupport/src/termios.c40
-rw-r--r--testsuites/libtests/termios02/init.c22
-rw-r--r--testsuites/libtests/termios02/termios02.scn6
5 files changed, 61 insertions, 43 deletions
diff --git a/cpukit/libcsupport/include/sys/ioccom.h b/cpukit/libcsupport/include/sys/ioccom.h
index 7f6ff26cf4..04e82fbb80 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 d528c2aeb7..1cf5eb61f5 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 bcf8d8acb3..16dd754a0e 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 92e37add1c..e944bca9af 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 5e29a9cc65..9b38d69ba1 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