mirror of https://github.com/python/cpython
Revert temporary commit in r79937
This commit is contained in:
parent
16e026cc94
commit
bba8f2d10a
|
@ -2394,47 +2394,6 @@ class MiscIOTest(unittest.TestCase):
|
|||
# baseline "io" module.
|
||||
self._check_abc_inheritance(io)
|
||||
|
||||
# Issue #5380: reading all available bytes from a pipe or a PTY when
|
||||
# the other end has been closed.
|
||||
|
||||
def check_pipe_func(self, pipe_func, buffered):
|
||||
master_fd, slave_fd = pipe_func()
|
||||
# Simulate a subprocess writing some data to the
|
||||
# slave end of the pipe, and then exiting.
|
||||
data = b'TEST DATA'
|
||||
try:
|
||||
os.write(slave_fd, data)
|
||||
finally:
|
||||
os.close(slave_fd)
|
||||
with self.open(master_fd, "rb", buffering=-1 if buffered else 0) as f:
|
||||
# Request more data than available
|
||||
gotdata = f.read(len(data) + 1)
|
||||
self.assertEqual(gotdata, data)
|
||||
# Trying to read again returns an empty string
|
||||
self.assertEqual(b'', f.read())
|
||||
self.assertEqual(b'', f.read(1))
|
||||
|
||||
def test_pipe_read_buffered(self):
|
||||
if not hasattr(os, 'pipe'):
|
||||
self.skipTest("os.pipe not available")
|
||||
self.check_pipe_func(os.pipe, True)
|
||||
|
||||
def test_pipe_read_raw(self):
|
||||
if not hasattr(os, 'pipe'):
|
||||
self.skipTest("os.pipe not available")
|
||||
self.check_pipe_func(os.pipe, False)
|
||||
|
||||
def test_openpty_read_buffered(self):
|
||||
if not hasattr(os, 'openpty'):
|
||||
self.skipTest("os.openpty not available")
|
||||
self.check_pipe_func(os.openpty, True)
|
||||
|
||||
def test_openpty_read_raw(self):
|
||||
if not hasattr(os, 'openpty'):
|
||||
self.skipTest("os.openpty not available")
|
||||
self.check_pipe_func(os.openpty, False)
|
||||
|
||||
|
||||
class CMiscIOTest(MiscIOTest):
|
||||
io = io
|
||||
|
||||
|
|
|
@ -280,29 +280,11 @@ class PosixTester(unittest.TestCase):
|
|||
if hasattr(posix, 'strerror'):
|
||||
self.assertTrue(posix.strerror(0))
|
||||
|
||||
def check_pipe_func(self, pipe_func):
|
||||
master_fd, slave_fd = pipe_func()
|
||||
try:
|
||||
# Simulate a subprocess writing some data to the
|
||||
# slave end of the pipe, and then exiting.
|
||||
data = b'TEST DATA'
|
||||
try:
|
||||
os.write(slave_fd, data)
|
||||
finally:
|
||||
os.close(slave_fd)
|
||||
# Request more data than available
|
||||
gotdata = os.read(master_fd, len(data) + 1)
|
||||
self.assertEqual(gotdata, data)
|
||||
finally:
|
||||
os.close(master_fd)
|
||||
|
||||
def test_pipe(self):
|
||||
if hasattr(posix, 'pipe'):
|
||||
self.check_pipe_func(posix.pipe)
|
||||
|
||||
def test_openpty(self):
|
||||
if hasattr(posix, 'openpty'):
|
||||
self.check_pipe_func(posix.openpty)
|
||||
reader, writer = posix.pipe()
|
||||
os.close(reader)
|
||||
os.close(writer)
|
||||
|
||||
def test_tempnam(self):
|
||||
if hasattr(posix, 'tempnam'):
|
||||
|
|
|
@ -464,34 +464,6 @@ fileio_seekable(fileio *self)
|
|||
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)
|
||||
{
|
||||
|
@ -506,9 +478,12 @@ fileio_readinto(fileio *self, PyObject *args)
|
|||
if (!PyArg_ParseTuple(args, "w*", &pbuf))
|
||||
return NULL;
|
||||
|
||||
if (_PyVerify_fd(self->fd))
|
||||
n = internal_read(self->fd, pbuf.buf, pbuf.len);
|
||||
else
|
||||
if (_PyVerify_fd(self->fd)) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
errno = 0;
|
||||
n = read(self->fd, pbuf.buf, pbuf.len);
|
||||
Py_END_ALLOW_THREADS
|
||||
} else
|
||||
n = -1;
|
||||
PyBuffer_Release(&pbuf);
|
||||
if (n < 0) {
|
||||
|
@ -585,9 +560,12 @@ fileio_readall(fileio *self)
|
|||
break;
|
||||
}
|
||||
}
|
||||
n = internal_read(self->fd,
|
||||
PyBytes_AS_STRING(result) + total,
|
||||
newsize - total);
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
errno = 0;
|
||||
n = read(self->fd,
|
||||
PyBytes_AS_STRING(result) + total,
|
||||
newsize - total);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (n == 0)
|
||||
break;
|
||||
if (n < 0) {
|
||||
|
@ -639,9 +617,12 @@ fileio_read(fileio *self, PyObject *args)
|
|||
return NULL;
|
||||
ptr = PyBytes_AS_STRING(bytes);
|
||||
|
||||
if (_PyVerify_fd(self->fd))
|
||||
n = internal_read(self->fd, ptr, size);
|
||||
else
|
||||
if (_PyVerify_fd(self->fd)) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
errno = 0;
|
||||
n = read(self->fd, ptr, size);
|
||||
Py_END_ALLOW_THREADS
|
||||
} else
|
||||
n = -1;
|
||||
|
||||
if (n < 0) {
|
||||
|
|
Loading…
Reference in New Issue