Mercurial > emacs
diff src/process.c @ 27705:2c53eb482802
(send_process) [BROKEN_PTY_READ_AFTER_EAGAIN]:
Workaround for FreeBSD bug. Flush output queue after EAGAIN in
write(2).
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Tue, 15 Feb 2000 10:27:23 +0000 |
parents | 5fddc840c29c |
children | ef7c1ba652b2 |
line wrap: on
line diff
--- a/src/process.c Tue Feb 15 09:58:41 2000 +0000 +++ b/src/process.c Tue Feb 15 10:27:23 2000 +0000 @@ -3431,6 +3431,32 @@ Lisp_Object zero; int offset; +#ifdef BROKEN_PTY_READ_AFTER_EAGAIN + /* A gross hack to work around a bug in FreeBSD. + In the following sequence, read(2) returns + bogus data: + + write(2) 1022 bytes + write(2) 954 bytes, get EAGAIN + read(2) 1024 bytes in process_read_output + read(2) 11 bytes in process_read_output + + That is, read(2) returns more bytes than have + ever been written successfully. The 1033 bytes + read are the 1022 bytes written successfully + after processing (for example with CRs added if + the terminal is set up that way which it is + here). The same bytes will be seen again in a + later read(2), without the CRs. */ + + if (errno == EAGAIN) + { + int flags = FWRITE; + ioctl (XINT (XPROCESS (proc)->outfd), TIOCFLUSH, + &flags); + } +#endif /* BROKEN_PTY_READ_AFTER_EAGAIN */ + /* Running filters might relocate buffers or strings. Arrange to relocate BUF. */ if (BUFFERP (object))