~petersanchez/st

e52319cc7d153e4f59b38c4fb4c0556e118d4775 — Roberto E. Vargas Caballero 4 years ago 21e0d6e
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.
1 files changed, 16 insertions(+), 9 deletions(-)

M st.c
M st.c => st.c +16 -9
@@ 823,17 823,24 @@ ttyread(void)
	int ret;

	/* append read bytes to unprocessed bytes */
	if ((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0)
		die("couldn't read from shell: %s\n", strerror(errno));
	buflen += ret;
	ret = read(cmdfd, buf+buflen, LEN(buf)-buflen);

	written = twrite(buf, buflen, 0);
	buflen -= written;
	/* keep any uncomplete utf8 char for the next call */
	if (buflen > 0)
		memmove(buf, buf + written, 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));
	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;

	return ret;
	}
}

void