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.
|
# baseline "io" module.
|
||||||
self._check_abc_inheritance(io)
|
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):
|
class CMiscIOTest(MiscIOTest):
|
||||||
io = io
|
io = io
|
||||||
|
|
||||||
|
|
|
@ -280,29 +280,11 @@ class PosixTester(unittest.TestCase):
|
||||||
if hasattr(posix, 'strerror'):
|
if hasattr(posix, 'strerror'):
|
||||||
self.assertTrue(posix.strerror(0))
|
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):
|
def test_pipe(self):
|
||||||
if hasattr(posix, 'pipe'):
|
if hasattr(posix, 'pipe'):
|
||||||
self.check_pipe_func(posix.pipe)
|
reader, writer = posix.pipe()
|
||||||
|
os.close(reader)
|
||||||
def test_openpty(self):
|
os.close(writer)
|
||||||
if hasattr(posix, 'openpty'):
|
|
||||||
self.check_pipe_func(posix.openpty)
|
|
||||||
|
|
||||||
def test_tempnam(self):
|
def test_tempnam(self):
|
||||||
if hasattr(posix, 'tempnam'):
|
if hasattr(posix, 'tempnam'):
|
||||||
|
|
|
@ -464,34 +464,6 @@ fileio_seekable(fileio *self)
|
||||||
return PyBool_FromLong((long) self->seekable);
|
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 *
|
static PyObject *
|
||||||
fileio_readinto(fileio *self, PyObject *args)
|
fileio_readinto(fileio *self, PyObject *args)
|
||||||
{
|
{
|
||||||
|
@ -506,9 +478,12 @@ fileio_readinto(fileio *self, PyObject *args)
|
||||||
if (!PyArg_ParseTuple(args, "w*", &pbuf))
|
if (!PyArg_ParseTuple(args, "w*", &pbuf))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (_PyVerify_fd(self->fd))
|
if (_PyVerify_fd(self->fd)) {
|
||||||
n = internal_read(self->fd, pbuf.buf, pbuf.len);
|
Py_BEGIN_ALLOW_THREADS
|
||||||
else
|
errno = 0;
|
||||||
|
n = read(self->fd, pbuf.buf, pbuf.len);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
} else
|
||||||
n = -1;
|
n = -1;
|
||||||
PyBuffer_Release(&pbuf);
|
PyBuffer_Release(&pbuf);
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
|
@ -585,9 +560,12 @@ fileio_readall(fileio *self)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n = internal_read(self->fd,
|
Py_BEGIN_ALLOW_THREADS
|
||||||
PyBytes_AS_STRING(result) + total,
|
errno = 0;
|
||||||
newsize - total);
|
n = read(self->fd,
|
||||||
|
PyBytes_AS_STRING(result) + total,
|
||||||
|
newsize - total);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
break;
|
break;
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
|
@ -639,9 +617,12 @@ fileio_read(fileio *self, PyObject *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
ptr = PyBytes_AS_STRING(bytes);
|
ptr = PyBytes_AS_STRING(bytes);
|
||||||
|
|
||||||
if (_PyVerify_fd(self->fd))
|
if (_PyVerify_fd(self->fd)) {
|
||||||
n = internal_read(self->fd, ptr, size);
|
Py_BEGIN_ALLOW_THREADS
|
||||||
else
|
errno = 0;
|
||||||
|
n = read(self->fd, ptr, size);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
} else
|
||||||
n = -1;
|
n = -1;
|
||||||
|
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
|
|
Loading…
Reference in New Issue