43 lines
1.2 KiB
Diff
43 lines
1.2 KiB
Diff
--- a/telnetd/telnetd.c
|
|
+++ b/telnetd/telnetd.c
|
|
@@ -772,7 +772,6 @@ void telnet(int f, int p)
|
|
int on = 1;
|
|
char *HE;
|
|
const char *IM;
|
|
- int pty_read_ok = 0; /* track whether the pty read has worked yet */
|
|
|
|
/*
|
|
* Initialize the slc mapping table.
|
|
@@ -1086,19 +1085,24 @@ void telnet(int f, int p)
|
|
* Something to read from the pty...
|
|
*/
|
|
if (FD_ISSET(p, &ibits)) {
|
|
+ int eio = 0;
|
|
+read_pty:
|
|
pcc = read(p, ptyibuf, BUFSIZ);
|
|
- /*
|
|
- * On some systems, if we try to read something
|
|
- * off the master side before the slave side is
|
|
- * opened, we get EIO.
|
|
- */
|
|
- if (pcc < 0 && (errno == EWOULDBLOCK || (errno == EIO && pty_read_ok == 0))) {
|
|
+ if (pcc < 0 && errno == EWOULDBLOCK) {
|
|
pcc = 0;
|
|
}
|
|
+ /*
|
|
+ * If we try to read something off the master side while the slave
|
|
+ * side is temporarily closed by login process, we get EIO.
|
|
+ */
|
|
+ else if (pcc < 0 && errno == EIO && eio < 1000) {
|
|
+ eio++;
|
|
+ poll(NULL, 0, 10);
|
|
+ goto read_pty;
|
|
+ }
|
|
else {
|
|
if (pcc <= 0)
|
|
break;
|
|
- pty_read_ok = 1; /* mark connection up for read */
|
|
#ifdef LINEMODE
|
|
/*
|
|
* If ioctl from pty, pass it through net
|