diff options
Diffstat (limited to 'libc/termios/termios.c')
-rw-r--r-- | libc/termios/termios.c | 24 |
1 files changed, 13 insertions, 11 deletions
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 |