From d122daf52ade4a713510db6cb118caca791dd12d Mon Sep 17 00:00:00 2001 From: Daniel Reinhold Date: Sun, 4 May 2003 03:25:10 +0000 Subject: [PATCH] initial support for termios in libroot git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3171 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/libroot/posix/termios/Jamfile | 16 +++++ src/kernel/libroot/posix/termios/termios.c | 77 ++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 src/kernel/libroot/posix/termios/Jamfile create mode 100644 src/kernel/libroot/posix/termios/termios.c diff --git a/src/kernel/libroot/posix/termios/Jamfile b/src/kernel/libroot/posix/termios/Jamfile new file mode 100644 index 0000000000..14604e3274 --- /dev/null +++ b/src/kernel/libroot/posix/termios/Jamfile @@ -0,0 +1,16 @@ +SubDir OBOS_TOP src kernel libroot posix termios ; + +KernelMergeObject posix_termios.o : + <$(SOURCE_GRIST)>termios.c + : + -fPIC -DPIC + ; + + +# there are no files in the kernel + +#MergeObjectFromObjects kernel_posix_termios.o : +# : +# -fPIC -DPIC +# ; + diff --git a/src/kernel/libroot/posix/termios/termios.c b/src/kernel/libroot/posix/termios/termios.c new file mode 100644 index 0000000000..81bfe48a27 --- /dev/null +++ b/src/kernel/libroot/posix/termios/termios.c @@ -0,0 +1,77 @@ +/* +** Copyright 2003, Daniel Reinhold, danielre@users.sf.net. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ + +#include +#include +#include +#include +#include + + +/* tcdrain - wait for all output to be transmitted */ +int +tcdrain(int fd) +{ + /* Some termios implementations have a TIOCDRAIN command + * expressly for this purpose (e.g. ioctl(fd, TIOCDRAIN, 0). + * However, the BeOS implementation adheres to another + * interface which uses a non-zero last parameter to the + * TCSBRK ioctl to signify this functionality. + */ + return ioctl(fd, TCSBRK, 1); +} + + +/* tcflow - suspend or restart transmission */ +int +tcflow(int fd, int action) +{ + /* action will be one of the following: + * TCIOFF - input off (stops input) + * TCION - input on (restart input) + * TCOOFF - output off (stops output) + * TCOON - output on (restart output) + */ + return ioctl(fd, TCXONC, action); +} + + +/* tcflush - flush all pending data (input or output) */ +int +tcflush(int fd, int queue_selector) +{ + return ioctl(fd, TCFLSH, queue_selector); +} + + +/* tcsendbreak - send zero bits for the specified duration */ +int +tcsendbreak(int fd, int duration) +{ + if (duration == 0) + // Posix spec says this should take ~ 0.25 to 0.5 seconds + return ioctl(fd, TCSBRK, 0); + + /* Posix does not specify how long the transmission time + * should last if 'duration' is non-zero -- i.e. it is up + * to each implementation to decide what to do... + * + * For simplicity, here is it assumed that a positive duration + * of N will mean "N time intervals" where each interval lasts + * from 0.25 to 0.5 seconds. A negative duration will be treated + * as an error. + */ + if (duration < 0) { + errno = EINVAL; + return -1; + } + + while (duration-- > 0) + if (ioctl(fd, TCSBRK, 0) < 0) + return -1; + + return 0; +} +