mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
Issue #13757: Change os.fdlistdir() so that it duplicates the passed file
descriptor (instead of closing it).
This commit is contained in:
parent
bda7a80194
commit
76961faaa0
3 changed files with 8 additions and 11 deletions
|
@ -772,7 +772,7 @@ as internal buffering of data.
|
||||||
.. function:: fdlistdir(fd)
|
.. function:: fdlistdir(fd)
|
||||||
|
|
||||||
Like :func:`listdir`, but uses a file descriptor instead and always returns
|
Like :func:`listdir`, but uses a file descriptor instead and always returns
|
||||||
strings. After execution of this function, *fd* will be closed.
|
strings.
|
||||||
|
|
||||||
Availability: Unix.
|
Availability: Unix.
|
||||||
|
|
||||||
|
|
|
@ -455,20 +455,14 @@ class PosixTester(unittest.TestCase):
|
||||||
def test_fdlistdir(self):
|
def test_fdlistdir(self):
|
||||||
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
||||||
self.addCleanup(posix.close, f)
|
self.addCleanup(posix.close, f)
|
||||||
f1 = posix.dup(f)
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
sorted(posix.listdir('.')),
|
sorted(posix.listdir('.')),
|
||||||
sorted(posix.fdlistdir(f1))
|
sorted(posix.fdlistdir(f))
|
||||||
)
|
)
|
||||||
# Check the fd was closed by fdlistdir
|
|
||||||
with self.assertRaises(OSError) as ctx:
|
|
||||||
posix.close(f1)
|
|
||||||
self.assertEqual(ctx.exception.errno, errno.EBADF)
|
|
||||||
# Check that the fd offset was reset (issue #13739)
|
# Check that the fd offset was reset (issue #13739)
|
||||||
f2 = posix.dup(f)
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
sorted(posix.listdir('.')),
|
sorted(posix.listdir('.')),
|
||||||
sorted(posix.fdlistdir(f2))
|
sorted(posix.fdlistdir(f))
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_access(self):
|
def test_access(self):
|
||||||
|
|
|
@ -2869,8 +2869,7 @@ posix_listdir(PyObject *self, PyObject *args)
|
||||||
#ifdef HAVE_FDOPENDIR
|
#ifdef HAVE_FDOPENDIR
|
||||||
PyDoc_STRVAR(posix_fdlistdir__doc__,
|
PyDoc_STRVAR(posix_fdlistdir__doc__,
|
||||||
"fdlistdir(fd) -> list_of_strings\n\n\
|
"fdlistdir(fd) -> list_of_strings\n\n\
|
||||||
Like listdir(), but uses a file descriptor instead.\n\
|
Like listdir(), but uses a file descriptor instead.");
|
||||||
After succesful execution of this function, fd will be closed.");
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
posix_fdlistdir(PyObject *self, PyObject *args)
|
posix_fdlistdir(PyObject *self, PyObject *args)
|
||||||
|
@ -2883,6 +2882,10 @@ posix_fdlistdir(PyObject *self, PyObject *args)
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (!PyArg_ParseTuple(args, "i:fdlistdir", &fd))
|
if (!PyArg_ParseTuple(args, "i:fdlistdir", &fd))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
/* closedir() closes the FD, so we duplicate it */
|
||||||
|
fd = dup(fd);
|
||||||
|
if (fd < 0)
|
||||||
|
return posix_error();
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
dirp = fdopendir(fd);
|
dirp = fdopendir(fd);
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue