From b9c0292271ea5e4dc583137d6c74dda605d1ae04 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Sat, 6 Sep 2003 06:09:51 +0000 Subject: Running ltp 20030905 showed that tcsendbreak was broken. This fixes it. --- libc/termios/termios.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'libc/termios') diff --git a/libc/termios/termios.c b/libc/termios/termios.c index c6d74f2b3..cf3bd9bc6 100644 --- a/libc/termios/termios.c +++ b/libc/termios/termios.c @@ -70,21 +70,23 @@ int tcflush ( int fd, int queue_selector) /* Send zero bits on FD. */ int tcsendbreak( int fd, int duration) { - /* - * The break lasts 0.25 to 0.5 seconds if DURATION is zero, and an - * implementation-defined period if DURATION is nonzero. We define a - * positive DURATION to be number of milliseconds to break. - */ + /* The break lasts 0.25 to 0.5 seconds if DURATION is zero, + and an implementation-defined period if DURATION is nonzero. + We define a positive DURATION to be number of milliseconds to break. */ if (duration <= 0) return ioctl(fd, TCSBRK, 0); - /* - * ioctl can't send a break of any other duration for us. This could be - * changed to use trickery (e.g. lower speed and send a '\0') to send - * the break, but for now just return an error. - */ - __set_errno(EINVAL); +#ifdef TCSBRKP + /* Probably Linux-specific: a positive third TCSBRKP ioctl argument is + defined to be the number of 100ms units to break. */ + return ioctl(fd, TCSBRKP, (duration + 99) / 100); +#else + /* ioctl can't send a break of any other duration for us. + This could be changed to use trickery (e.g. lower speed and + send a '\0') to send the break, but for now just return an error. */ + __set_errno (EINVAL); return -1; +#endif } #endif -- cgit v1.2.3