Temporary commit of fix to issue #5380 (in order to watch buildbot response)
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index ec320f7..8f174a7 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -464,6 +464,34 @@
 	return PyBool_FromLong((long) self->seekable);
 }
 
+static Py_ssize_t
+internal_read(int fd, void *buf, size_t count)
+{
+	Py_ssize_t n;
+
+	Py_BEGIN_ALLOW_THREADS
+	errno = 0;
+	n = read(fd, buf, count);
+#ifdef EIO
+	/* Issue #5380: when reading past the end of a pipe created by
+	   openpty(), EIO can be set.  Make it an EOF instead, so that
+	   the normal technique of testing for an empty string can be used.
+	 */
+	if (n == -1 && errno == EIO) {
+		if (isatty(fd)) {
+			n = 0;
+			errno = 0;
+		}
+		else {
+			/* isatty() set errno, restore its value */
+			errno = EIO;
+		}
+	}
+#endif
+	Py_END_ALLOW_THREADS
+	return n;
+}
+
 static PyObject *
 fileio_readinto(fileio *self, PyObject *args)
 {
@@ -478,12 +506,9 @@
 	if (!PyArg_ParseTuple(args, "w*", &pbuf))
 		return NULL;
 
-	if (_PyVerify_fd(self->fd)) {
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		n = read(self->fd, pbuf.buf, pbuf.len);
-		Py_END_ALLOW_THREADS
-	} else
+	if (_PyVerify_fd(self->fd))
+		n = internal_read(self->fd, pbuf.buf, pbuf.len);
+	else
 		n = -1;
 	PyBuffer_Release(&pbuf);
 	if (n < 0) {
@@ -560,12 +585,9 @@
 				break;
 			}
 		}
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		n = read(self->fd,
-			 PyBytes_AS_STRING(result) + total,
-			 newsize - total);
-		Py_END_ALLOW_THREADS
+		n = internal_read(self->fd,
+				  PyBytes_AS_STRING(result) + total,
+				  newsize - total);
 		if (n == 0)
 			break;
 		if (n < 0) {
@@ -617,12 +639,9 @@
 		return NULL;
 	ptr = PyBytes_AS_STRING(bytes);
 
-	if (_PyVerify_fd(self->fd)) {
-		Py_BEGIN_ALLOW_THREADS
-		errno = 0;
-		n = read(self->fd, ptr, size);
-		Py_END_ALLOW_THREADS
-	} else
+	if (_PyVerify_fd(self->fd))
+		n = internal_read(self->fd, ptr, size);
+	else
 		n = -1;
 
 	if (n < 0) {