# HG changeset patch # User Gerd Moellmann # Date 950610443 0 # Node ID 2c53eb482802137c140ff0b57e58fbbb28226c13 # Parent e809aae28ae60a6b02d057dcfc9fd935807ee894 (send_process) [BROKEN_PTY_READ_AFTER_EAGAIN]: Workaround for FreeBSD bug. Flush output queue after EAGAIN in write(2). diff -r e809aae28ae6 -r 2c53eb482802 src/process.c --- 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))