[Python-checkins] cpython: Issue #13757: Change os.fdlistdir() so that it duplicates the passed file

charles-francois.natali python-checkins at python.org
Tue Jan 10 20:25:45 CET 2012


http://hg.python.org/cpython/rev/6d395ed03f95
changeset:   74325:6d395ed03f95
parent:      74323:eb028b3c62c9
user:        Charles-François Natali <neologix at free.fr>
date:        Tue Jan 10 20:25:09 2012 +0100
summary:
  Issue #13757: Change os.fdlistdir() so that it duplicates the passed file
descriptor (instead of closing it).

files:
  Doc/library/os.rst     |   2 +-
  Lib/test/test_posix.py |  10 ++--------
  Modules/posixmodule.c  |   7 +++++--
  3 files changed, 8 insertions(+), 11 deletions(-)


diff --git a/Doc/library/os.rst b/Doc/library/os.rst
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -772,7 +772,7 @@
 .. function:: fdlistdir(fd)
 
    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.
 
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -455,20 +455,14 @@
     def test_fdlistdir(self):
         f = posix.open(posix.getcwd(), posix.O_RDONLY)
         self.addCleanup(posix.close, f)
-        f1 = posix.dup(f)
         self.assertEqual(
             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)
-        f2 = posix.dup(f)
         self.assertEqual(
             sorted(posix.listdir('.')),
-            sorted(posix.fdlistdir(f2))
+            sorted(posix.fdlistdir(f))
             )
 
     def test_access(self):
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -2869,8 +2869,7 @@
 #ifdef HAVE_FDOPENDIR
 PyDoc_STRVAR(posix_fdlistdir__doc__,
 "fdlistdir(fd) -> list_of_strings\n\n\
-Like listdir(), but uses a file descriptor instead.\n\
-After succesful execution of this function, fd will be closed.");
+Like listdir(), but uses a file descriptor instead.");
 
 static PyObject *
 posix_fdlistdir(PyObject *self, PyObject *args)
@@ -2883,6 +2882,10 @@
     errno = 0;
     if (!PyArg_ParseTuple(args, "i:fdlistdir", &fd))
         return NULL;
+    /* closedir() closes the FD, so we duplicate it */
+    fd = dup(fd);
+    if (fd < 0)
+        return posix_error();
     Py_BEGIN_ALLOW_THREADS
     dirp = fdopendir(fd);
     Py_END_ALLOW_THREADS

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list