try harder to flush the tty output buffer in disestablish_ppp
authorPaul Mackerras <paulus@samba.org>
Wed, 28 Apr 1999 02:46:44 +0000 (02:46 +0000)
committerPaul Mackerras <paulus@samba.org>
Wed, 28 Apr 1999 02:46:44 +0000 (02:46 +0000)
pppd/sys-linux.c

index c63ac9a5d9a0cf8a9918b1941b5f6f653adaea39..70ba2fa4d34b1f679a044bebc2dc769bcb90f0ee 100644 (file)
@@ -381,14 +381,23 @@ int establish_ppp (int tty_fd)
 
 void disestablish_ppp(int tty_fd)
 {
+    int nout;
+
+    if (!hungup) {
 /*
- * Attempt to restore the previous tty settings
+ * Flush the tty output buffer so that the TIOCSETD doesn't hang.
+ * We may have to do this several times because the tcflush only
+ * affects the serial driver, and may trigger the ppp driver to
+ * supply more data to the serial driver.
  */
-    if (!hungup) {
+       do {
+           if (tcflush(tty_fd, TCIOFLUSH) < 0)
+               break;
+           nout = 0;
+       } while (ioctl(tty_fd, TIOCOUTQ, &nout) >= 0 && nout > 0);
 /*
  * Restore the previous line discipline
  */
-       tcflush(tty_fd, TCIOFLUSH);
        if (ioctl(tty_fd, TIOCSETD, &tty_disc) < 0) {
            if ( ! ok_error (errno))
                error("ioctl(TIOCSETD, N_TTY): %m");