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
*/
no_ppp_msg =
"This system lacks kernel support for PPP. This could be because\n"
- "the PPP kernel module is not loaded, or because the kernel is\n"
- "not configured for PPP. See the README.linux file in the\n"
- "ppp-2.3.7 distribution.\n";
+ "the PPP kernel module could not be loaded, or because PPP was not\n"
+ "included in the kernel configuration. If PPP was included as a\n"
+ "module, try `/sbin/modprobe -v ppp'. If that fails, check that\n"
+ "ppp.o exists in /lib/modules/`uname -r`/net.\n"
+ "See README.linux file in the ppp distribution for more details.\n";
/*
* Open a socket for doing the ioctl operations.