ttyread: test for EOF while reading tty
When a read operation returns 0 then it means that we arrived to the end of the file, and new reads will return 0 unless you do some other operation such as lseek(). This case happens with USB-232 adapters when they are unplugged.
This commit is contained in:
parent
21e0d6e8b8
commit
e52319cc7d
1 changed files with 16 additions and 9 deletions
25
st.c
25
st.c
|
@ -823,17 +823,24 @@ ttyread(void)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* append read bytes to unprocessed bytes */
|
/* append read bytes to unprocessed bytes */
|
||||||
if ((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0)
|
ret = read(cmdfd, buf+buflen, LEN(buf)-buflen);
|
||||||
|
|
||||||
|
switch (ret) {
|
||||||
|
case 0:
|
||||||
|
fputs("Found EOF in input\n", stderr);
|
||||||
|
exit(0);
|
||||||
|
case -1:
|
||||||
die("couldn't read from shell: %s\n", strerror(errno));
|
die("couldn't read from shell: %s\n", strerror(errno));
|
||||||
buflen += ret;
|
default:
|
||||||
|
buflen += ret;
|
||||||
|
written = twrite(buf, buflen, 0);
|
||||||
|
buflen -= written;
|
||||||
|
/* keep any uncomplete utf8 char for the next call */
|
||||||
|
if (buflen > 0)
|
||||||
|
memmove(buf, buf + written, buflen);
|
||||||
|
return ret;
|
||||||
|
|
||||||
written = twrite(buf, buflen, 0);
|
}
|
||||||
buflen -= written;
|
|
||||||
/* keep any uncomplete utf8 char for the next call */
|
|
||||||
if (buflen > 0)
|
|
||||||
memmove(buf, buf + written, buflen);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue