OSDN Git Service

Running ltp 20030905 showed that tcsendbreak was broken.
authorEric Andersen <andersen@codepoet.org>
Sat, 6 Sep 2003 06:09:51 +0000 (06:09 -0000)
committerEric Andersen <andersen@codepoet.org>
Sat, 6 Sep 2003 06:09:51 +0000 (06:09 -0000)
This fixes it.

libc/termios/termios.c

index c6d74f2..cf3bd9b 100644 (file)
@@ -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