microcode/uxio.c (OS_channel_read): Return 0 for EIO from pty master
authorMatt Birkholz <matt@birchwood-abbey.net>
Mon, 16 Jul 2018 23:05:24 +0000 (16:05 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Mon, 16 Jul 2018 23:05:24 +0000 (16:05 -0700)
src/microcode/uxio.c

index a18ecdfc219f64dcd5a8b1889af03dc60d4d6db5..72a3a02f75edb9d0534abb8f888248eba0830708 100644 (file)
@@ -268,6 +268,16 @@ OS_channel_read (Tchannel channel, void * buffer, size_t nbytes)
        if (errno == ERRNO_NONBLOCK)
          return (-1);
 #endif
+       /* From Emacs v25.2 src/process.c: On some OSs with ptys, when
+          the process on one end of a pty exits, the other end gets
+          an error reading with errno = EIO instead of getting an EOF
+          (0 bytes read)...
+
+          Thus, if a pty master and errno=EIO, return 0 bytes read. */
+       if (CHANNEL_TYPE (channel) == channel_type_unix_pty_master
+           && errno == EIO)
+         return (0);
+
 #endif /* not _ULTRIX */
          UX_prim_check_errno (syscall_read);
          continue;