diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 8601687227f..06f1452f665 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -769,7 +769,7 @@ as internal buffering of data. .. versionadded:: 3.3 -.. function:: fdlistdir(fd) +.. function:: flistdir(fd) Like :func:`listdir`, but uses a file descriptor instead and always returns strings. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst index c20c889550b..d3044b3f99a 100644 --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -571,7 +571,7 @@ os * Other new functions: - * :func:`~os.fdlistdir` (:issue:`10755`) + * :func:`~os.flistdir` (:issue:`10755`) * :func:`~os.getgrouplist` (:issue:`9344`) diff --git a/Lib/os.py b/Lib/os.py index ad5d5381c04..301870cb487 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -357,7 +357,7 @@ if _exists("openat"): # whether to follow symlinks flag = 0 if followlinks else AT_SYMLINK_NOFOLLOW - names = fdlistdir(topfd) + names = flistdir(topfd) dirs, nondirs = [], [] for name in names: # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 7f955d1e90f..8b07c773468 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -611,8 +611,8 @@ class FwalkTests(WalkTests): for root, dirs, files, rootfd in os.fwalk(*args): # check that the FD is valid os.fstat(rootfd) - # check that fdlistdir() returns consistent information - self.assertEqual(set(os.fdlistdir(rootfd)), set(dirs) | set(files)) + # check that flistdir() returns consistent information + self.assertEqual(set(os.flistdir(rootfd)), set(dirs) | set(files)) def test_fd_leak(self): # Since we're opening a lot of FDs, we must be careful to avoid leaks: diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index f8c6baa0830..c3dfffb1784 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -451,18 +451,18 @@ class PosixTester(unittest.TestCase): if hasattr(posix, 'listdir'): self.assertTrue(support.TESTFN in posix.listdir()) - @unittest.skipUnless(hasattr(posix, 'fdlistdir'), "test needs posix.fdlistdir()") - def test_fdlistdir(self): + @unittest.skipUnless(hasattr(posix, 'flistdir'), "test needs posix.flistdir()") + def test_flistdir(self): f = posix.open(posix.getcwd(), posix.O_RDONLY) self.addCleanup(posix.close, f) self.assertEqual( sorted(posix.listdir('.')), - sorted(posix.fdlistdir(f)) + sorted(posix.flistdir(f)) ) # Check that the fd offset was reset (issue #13739) self.assertEqual( sorted(posix.listdir('.')), - sorted(posix.fdlistdir(f)) + sorted(posix.flistdir(f)) ) def test_access(self): diff --git a/Misc/NEWS b/Misc/NEWS index 84b16d3e0fc..70f1bfb9d5d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Core and Builtins Library ------- +- Issue #10811: Fix recursive usage of cursors. Instead of crashing, + raise a ProgrammingError now. + - Issue #10881: Fix test_site failure with OS X framework builds. - Issue #964437 Make IDLE help window non-modal. @@ -1745,7 +1748,7 @@ Library - Issue #11297: Add collections.ChainMap(). -- Issue #10755: Add the posix.fdlistdir() function. Patch by Ross Lagerwall. +- Issue #10755: Add the posix.flistdir() function. Patch by Ross Lagerwall. - Issue #4761: Add the *at() family of functions (openat(), etc.) to the posix module. Patch by Ross Lagerwall. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 2269fe90218..2251a626d6b 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2867,12 +2867,12 @@ posix_listdir(PyObject *self, PyObject *args) } /* end of posix_listdir */ #ifdef HAVE_FDOPENDIR -PyDoc_STRVAR(posix_fdlistdir__doc__, -"fdlistdir(fd) -> list_of_strings\n\n\ +PyDoc_STRVAR(posix_flistdir__doc__, +"flistdir(fd) -> list_of_strings\n\n\ Like listdir(), but uses a file descriptor instead."); static PyObject * -posix_fdlistdir(PyObject *self, PyObject *args) +posix_flistdir(PyObject *self, PyObject *args) { PyObject *d, *v; DIR *dirp; @@ -2880,7 +2880,7 @@ posix_fdlistdir(PyObject *self, PyObject *args) int fd; errno = 0; - if (!PyArg_ParseTuple(args, "i:fdlistdir", &fd)) + if (!PyArg_ParseTuple(args, "i:flistdir", &fd)) return NULL; /* closedir() closes the FD, so we duplicate it */ fd = dup(fd); @@ -10555,7 +10555,7 @@ static PyMethodDef posix_methods[] = { #endif /* HAVE_LINK */ {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__}, #ifdef HAVE_FDOPENDIR - {"fdlistdir", posix_fdlistdir, METH_VARARGS, posix_fdlistdir__doc__}, + {"flistdir", posix_flistdir, METH_VARARGS, posix_flistdir__doc__}, #endif {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__}, {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},