Commit 40a2160a authored by Gregory P. Smith's avatar Gregory P. Smith

Refactor the common code out of the posix and windows listdir

implementations from my previous commit into the higher level
function.
parent 16ea14a6
...@@ -3251,12 +3251,9 @@ On some platforms, path may also be specified as an open file descriptor;\n\ ...@@ -3251,12 +3251,9 @@ On some platforms, path may also be specified as an open file descriptor;\n\
#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR) #if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
static PyObject * static PyObject *
_listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs) _listdir_windows_no_opendir(path_t *path, PyObject *list)
{ {
path_t path;
PyObject *list = NULL;
static char *keywords[] = {"path", NULL}; static char *keywords[] = {"path", NULL};
int fd = -1;
PyObject *v; PyObject *v;
HANDLE hFindFile = INVALID_HANDLE_VALUE; HANDLE hFindFile = INVALID_HANDLE_VALUE;
BOOL result; BOOL result;
...@@ -3268,25 +3265,16 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3268,25 +3265,16 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs)
PyObject *po = NULL; PyObject *po = NULL;
wchar_t *wnamebuf = NULL; wchar_t *wnamebuf = NULL;
memset(&path, 0, sizeof(path)); if (!path->narrow) {
path.function_name = "listdir";
path.nullable = 1;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords,
path_converter, &path)) {
return NULL;
}
if (!path.narrow) {
WIN32_FIND_DATAW wFileData; WIN32_FIND_DATAW wFileData;
wchar_t *po_wchars; wchar_t *po_wchars;
if (!path.wide) { /* Default arg: "." */ if (!path->wide) { /* Default arg: "." */
po_wchars = L"."; po_wchars = L".";
len = 1; len = 1;
} else { } else {
po_wchars = path.wide; po_wchars = path->wide;
len = wcslen(path.wide); len = wcslen(path->wide);
} }
/* The +5 is so we can append "\\*.*\0" */ /* The +5 is so we can append "\\*.*\0" */
wnamebuf = malloc((len + 5) * sizeof(wchar_t)); wnamebuf = malloc((len + 5) * sizeof(wchar_t));
...@@ -3312,7 +3300,7 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3312,7 +3300,7 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs)
if (error == ERROR_FILE_NOT_FOUND) if (error == ERROR_FILE_NOT_FOUND)
goto exit; goto exit;
Py_DECREF(list); Py_DECREF(list);
list = path_error(&path); list = path_error(path);
goto exit; goto exit;
} }
do { do {
...@@ -3341,15 +3329,15 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3341,15 +3329,15 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs)
it got to the end of the directory. */ it got to the end of the directory. */
if (!result && GetLastError() != ERROR_NO_MORE_FILES) { if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
Py_DECREF(list); Py_DECREF(list);
list = path_error(&path); list = path_error(path);
goto exit; goto exit;
} }
} while (result == TRUE); } while (result == TRUE);
goto exit; goto exit;
} }
strcpy(namebuf, path.narrow); strcpy(namebuf, path->narrow);
len = path.length; len = path->length;
if (len > 0) { if (len > 0) {
char ch = namebuf[len-1]; char ch = namebuf[len-1];
if (ch != SEP && ch != ALTSEP && ch != ':') if (ch != SEP && ch != ALTSEP && ch != ':')
...@@ -3368,7 +3356,7 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3368,7 +3356,7 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs)
if (error == ERROR_FILE_NOT_FOUND) if (error == ERROR_FILE_NOT_FOUND)
goto exit; goto exit;
Py_DECREF(list); Py_DECREF(list);
list = path_error(&path); list = path_error(path);
goto exit; goto exit;
} }
do { do {
...@@ -3396,7 +3384,7 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3396,7 +3384,7 @@ _listdir_windows_no_opendir(PyObject *self, PyObject *args, PyObject *kwargs)
it got to the end of the directory. */ it got to the end of the directory. */
if (!result && GetLastError() != ERROR_NO_MORE_FILES) { if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
Py_DECREF(list); Py_DECREF(list);
list = path_error(&path); list = path_error(path);
goto exit; goto exit;
} }
} while (result == TRUE); } while (result == TRUE);
...@@ -3406,26 +3394,21 @@ exit: ...@@ -3406,26 +3394,21 @@ exit:
if (FindClose(hFindFile) == FALSE) { if (FindClose(hFindFile) == FALSE) {
if (list != NULL) { if (list != NULL) {
Py_DECREF(list); Py_DECREF(list);
list = path_error(&path); list = path_error(path);
} }
} }
} }
if (wnamebuf) if (wnamebuf)
free(wnamebuf); free(wnamebuf);
path_cleanup(&path);
return list; return list;
} /* end of _listdir_windows_no_opendir */ } /* end of _listdir_windows_no_opendir */
#else /* thus POSIX, ie: not (MS_WINDOWS and not HAVE_OPENDIR) */ #else /* thus POSIX, ie: not (MS_WINDOWS and not HAVE_OPENDIR) */
static PyObject * static PyObject *
_posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) _posix_listdir(path_t *path, PyObject *list)
{ {
path_t path;
PyObject *list = NULL;
static char *keywords[] = {"path", NULL};
int fd = -1; int fd = -1;
PyObject *v; PyObject *v;
...@@ -3433,24 +3416,12 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3433,24 +3416,12 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
struct dirent *ep; struct dirent *ep;
int return_str; /* if false, return bytes */ int return_str; /* if false, return bytes */
memset(&path, 0, sizeof(path));
path.function_name = "listdir";
path.nullable = 1;
#ifdef HAVE_FDOPENDIR
path.allow_fd = 1;
path.fd = -1;
#endif
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords,
path_converter, &path)) {
return NULL;
}
errno = 0; errno = 0;
#ifdef HAVE_FDOPENDIR #ifdef HAVE_FDOPENDIR
if (path.fd != -1) { if (path->fd != -1) {
/* closedir() closes the FD, so we duplicate it */ /* closedir() closes the FD, so we duplicate it */
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
fd = dup(path.fd); fd = dup(path->fd);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (fd == -1) { if (fd == -1) {
...@@ -3468,10 +3439,10 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3468,10 +3439,10 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
#endif #endif
{ {
char *name; char *name;
if (path.narrow) { if (path->narrow) {
name = path.narrow; name = path->narrow;
/* only return bytes if they specified a bytes object */ /* only return bytes if they specified a bytes object */
return_str = !(PyBytes_Check(path.object)); return_str = !(PyBytes_Check(path->object));
} }
else { else {
name = "."; name = ".";
...@@ -3484,7 +3455,7 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3484,7 +3455,7 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
} }
if (dirp == NULL) { if (dirp == NULL) {
list = path_error(&path); list = path_error(path);
goto exit; goto exit;
} }
if ((list = PyList_New(0)) == NULL) { if ((list = PyList_New(0)) == NULL) {
...@@ -3500,7 +3471,7 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -3500,7 +3471,7 @@ _posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
break; break;
} else { } else {
Py_DECREF(list); Py_DECREF(list);
list = path_error(&path); list = path_error(path);
goto exit; goto exit;
} }
} }
...@@ -3533,8 +3504,6 @@ exit: ...@@ -3533,8 +3504,6 @@ exit:
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
} }
path_cleanup(&path);
return list; return list;
} /* end of _posix_listdir */ } /* end of _posix_listdir */
#endif /* which OS */ #endif /* which OS */
...@@ -3542,11 +3511,31 @@ exit: ...@@ -3542,11 +3511,31 @@ exit:
static PyObject * static PyObject *
posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs) posix_listdir(PyObject *self, PyObject *args, PyObject *kwargs)
{ {
path_t path;
PyObject *list = NULL;
static char *keywords[] = {"path", NULL};
PyObject *return_value;
memset(&path, 0, sizeof(path));
path.function_name = "listdir";
path.nullable = 1;
#ifdef HAVE_FDOPENDIR
path.allow_fd = 1;
path.fd = -1;
#endif
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:listdir", keywords,
path_converter, &path)) {
return NULL;
}
#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR) #if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
return _listdir_windows_no_opendir(self, args, kwargs); return_value = _listdir_windows_no_opendir(&path, list);
#else #else
return _posix_listdir(self, args, kwargs); return_value = _posix_listdir(&path, list);
#endif #endif
path_cleanup(&path);
return return_value;
} }
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
......
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