From: Gerd Moellmann Date: Tue, 15 Feb 2000 10:27:23 +0000 (+0000) Subject: (send_process) [BROKEN_PTY_READ_AFTER_EAGAIN]: X-Git-Tag: emacs-pretest-21.0.90~5012 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3433b6bdab2a6a42228d3515b57e41b16e4c3cb3;p=emacs.git (send_process) [BROKEN_PTY_READ_AFTER_EAGAIN]: Workaround for FreeBSD bug. Flush output queue after EAGAIN in write(2). --- diff --git a/src/process.c b/src/process.c index dab701a9e7f..aa83422f8c1 100644 --- a/src/process.c +++ b/src/process.c @@ -3431,6 +3431,32 @@ send_process (proc, buf, len, object) 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))