diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-12-12 09:25:03 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-12-13 11:36:37 +0100 |
commit | b0da5796089191f85daac8ebca957cd0a104fde1 (patch) | |
tree | 1f1cf3bcfad1ede2377142e88d6062eb3df0c9db /cpukit/libcsupport | |
parent | termios: Fix tcflow() error status (diff) | |
download | rtems-b0da5796089191f85daac8ebca957cd0a104fde1.tar.bz2 |
termios: Implement tcflush()
New IO control RTEMS_IO_TCFLUSH.
Diffstat (limited to 'cpukit/libcsupport')
-rw-r--r-- | cpukit/libcsupport/include/sys/ioccom.h | 1 | ||||
-rw-r--r-- | cpukit/libcsupport/src/tcflush.c | 35 | ||||
-rw-r--r-- | cpukit/libcsupport/src/termios.c | 40 |
3 files changed, 46 insertions, 30 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; |