Commit c9e1c7d9 authored by Martin v. Löwis's avatar Martin v. Löwis

Issue #6095: Make directory argument to os.listdir optional.

Patch by Virgil Dupras.
parent e186e384
...@@ -1049,10 +1049,10 @@ Files and Directories ...@@ -1049,10 +1049,10 @@ Files and Directories
Availability: Unix. Availability: Unix.
.. function:: listdir(path) .. function:: listdir([path])
Return a list containing the names of the entries in the directory given by Return a list containing the names of the entries in the directory given by
*path*. The list is in arbitrary order. It does not include the special *path* (default: '.'). The list is in arbitrary order. It does not include the special
entries ``'.'`` and ``'..'`` even if they are present in the directory. entries ``'.'`` and ``'..'`` even if they are present in the directory.
This function can be called with a bytes or string argument, and returns This function can be called with a bytes or string argument, and returns
...@@ -1060,6 +1060,8 @@ Files and Directories ...@@ -1060,6 +1060,8 @@ Files and Directories
Availability: Unix, Windows. Availability: Unix, Windows.
.. versionchanged:: 3.2
The *path* parameter became optional.
.. function:: lstat(path) .. function:: lstat(path)
......
...@@ -252,9 +252,14 @@ class PosixTester(unittest.TestCase): ...@@ -252,9 +252,14 @@ class PosixTester(unittest.TestCase):
posix.chdir(os.curdir) posix.chdir(os.curdir)
self.assertRaises(OSError, posix.chdir, support.TESTFN) self.assertRaises(OSError, posix.chdir, support.TESTFN)
def test_lsdir(self): def test_listdir(self):
if hasattr(posix, 'lsdir'): if hasattr(posix, 'listdir'):
self.assertIn(support.TESTFN, posix.lsdir(os.curdir)) self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
def test_listdir_default(self):
# When listdir is called without argument, it's the same as listdir(os.curdir)
if hasattr(posix, 'listdir'):
self.assertTrue(support.TESTFN in posix.listdir())
def test_access(self): def test_access(self):
if hasattr(posix, 'access'): if hasattr(posix, 'access'):
......
...@@ -1440,6 +1440,8 @@ Library ...@@ -1440,6 +1440,8 @@ Library
Extension Modules Extension Modules
----------------- -----------------
- Issue #6095: Make directory argument to os.listdir optional.
- Issue #9277: Fix bug in struct.pack for bools in standard mode - Issue #9277: Fix bug in struct.pack for bools in standard mode
(e.g., struct.pack('>?')): if conversion to bool raised an exception (e.g., struct.pack('>?')): if conversion to bool raised an exception
then that exception wasn't properly propagated on machines where then that exception wasn't properly propagated on machines where
......
...@@ -2291,10 +2291,10 @@ posix_link(PyObject *self, PyObject *args) ...@@ -2291,10 +2291,10 @@ posix_link(PyObject *self, PyObject *args)
PyDoc_STRVAR(posix_listdir__doc__, PyDoc_STRVAR(posix_listdir__doc__,
"listdir(path) -> list_of_strings\n\n\ "listdir([path]) -> list_of_strings\n\n\
Return a list containing the names of the entries in the directory.\n\ Return a list containing the names of the entries in the directory.\n\
\n\ \n\
path: path of directory to list\n\ path: path of directory to list (default: '.')\n\
\n\ \n\
The list is in arbitrary order. It does not include the special\n\ The list is in arbitrary order. It does not include the special\n\
entries '.' and '..' even if they are present in the directory."); entries '.' and '..' even if they are present in the directory.");
...@@ -2315,18 +2315,25 @@ posix_listdir(PyObject *self, PyObject *args) ...@@ -2315,18 +2315,25 @@ posix_listdir(PyObject *self, PyObject *args)
char *bufptr = namebuf; char *bufptr = namebuf;
Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */ Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */
PyObject *po; PyObject *po = NULL;
if (PyArg_ParseTuple(args, "U:listdir", &po)) { if (PyArg_ParseTuple(args, "|U:listdir", &po)) {
WIN32_FIND_DATAW wFileData; WIN32_FIND_DATAW wFileData;
Py_UNICODE *wnamebuf; Py_UNICODE *wnamebuf, *po_wchars;
/* Overallocate for \\*.*\0 */
if (po == NULL) { // Default arg: "."
po_wchars = L".";
len = 1;
} else {
po_wchars = PyUnicode_AS_UNICODE(po);
len = PyUnicode_GET_SIZE(po); len = PyUnicode_GET_SIZE(po);
}
/* Overallocate for \\*.*\0 */
wnamebuf = malloc((len + 5) * sizeof(wchar_t)); wnamebuf = malloc((len + 5) * sizeof(wchar_t));
if (!wnamebuf) { if (!wnamebuf) {
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; return NULL;
} }
wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po)); wcscpy(wnamebuf, po_wchars);
if (len > 0) { if (len > 0) {
Py_UNICODE wch = wnamebuf[len-1]; Py_UNICODE wch = wnamebuf[len-1];
if (wch != L'/' && wch != L'\\' && wch != L':') if (wch != L'/' && wch != L'\\' && wch != L':')
...@@ -2548,12 +2555,17 @@ posix_listdir(PyObject *self, PyObject *args) ...@@ -2548,12 +2555,17 @@ posix_listdir(PyObject *self, PyObject *args)
int arg_is_unicode = 1; int arg_is_unicode = 1;
errno = 0; errno = 0;
if (!PyArg_ParseTuple(args, "U:listdir", &v)) { /* v is never read, so it does not need to be initialized yet. */
if (!PyArg_ParseTuple(args, "|U:listdir", &v)) {
arg_is_unicode = 0; arg_is_unicode = 0;
PyErr_Clear(); PyErr_Clear();
} }
if (!PyArg_ParseTuple(args, "O&:listdir", PyUnicode_FSConverter, &oname)) oname = NULL;
if (!PyArg_ParseTuple(args, "|O&:listdir", PyUnicode_FSConverter, &oname))
return NULL; return NULL;
if (oname == NULL) { // Default arg: "."
oname = PyBytes_FromString(".");
}
name = PyBytes_AsString(oname); name = PyBytes_AsString(oname);
if ((dirp = opendir(name)) == NULL) { if ((dirp = opendir(name)) == NULL) {
return posix_error_with_allocated_filename(oname); return posix_error_with_allocated_filename(oname);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment