Commit 3433b6bd authored by Gerd Moellmann's avatar Gerd Moellmann
Browse files

(send_process) [BROKEN_PTY_READ_AFTER_EAGAIN]:

Workaround for FreeBSD bug.  Flush output queue after EAGAIN in
write(2).
parent 27a6c729
......@@ -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))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment