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))