mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
Issue #15478: Use path_error() in more posix functions, especially in Windows
implementation
This commit is contained in:
parent
7e4f122560
commit
b024e84597
1 changed files with 24 additions and 69 deletions
|
@ -1034,17 +1034,6 @@ win32_error(char* function, const char* filename)
|
||||||
return PyErr_SetFromWindowsErr(errno);
|
return PyErr_SetFromWindowsErr(errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
win32_error_unicode(char* function, wchar_t* filename)
|
|
||||||
{
|
|
||||||
/* XXX - see win32_error for comments on 'function' */
|
|
||||||
errno = GetLastError();
|
|
||||||
if (filename)
|
|
||||||
return PyErr_SetFromWindowsErrWithUnicodeFilename(errno, filename);
|
|
||||||
else
|
|
||||||
return PyErr_SetFromWindowsErr(errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
win32_error_object(char* function, PyObject* filename)
|
win32_error_object(char* function, PyObject* filename)
|
||||||
{
|
{
|
||||||
|
@ -1119,44 +1108,6 @@ posix_1str(const char *func_name, PyObject *args, char *format,
|
||||||
|
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
static PyObject*
|
|
||||||
win32_1str(PyObject* args, char* func,
|
|
||||||
char* format, BOOL (__stdcall *funcA)(LPCSTR),
|
|
||||||
char* wformat, BOOL (__stdcall *funcW)(LPWSTR))
|
|
||||||
{
|
|
||||||
PyObject *uni;
|
|
||||||
const char *ansi;
|
|
||||||
BOOL result;
|
|
||||||
|
|
||||||
if (PyArg_ParseTuple(args, wformat, &uni))
|
|
||||||
{
|
|
||||||
wchar_t *wstr = PyUnicode_AsUnicode(uni);
|
|
||||||
if (wstr == NULL)
|
|
||||||
return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
result = funcW(wstr);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if (!result)
|
|
||||||
return win32_error_object(func, uni);
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
return Py_None;
|
|
||||||
}
|
|
||||||
PyErr_Clear();
|
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, format, &ansi))
|
|
||||||
return NULL;
|
|
||||||
if (win32_warn_bytes_api())
|
|
||||||
return NULL;
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
|
||||||
result = funcA(ansi);
|
|
||||||
Py_END_ALLOW_THREADS
|
|
||||||
if (!result)
|
|
||||||
return win32_error(func, ansi);
|
|
||||||
Py_INCREF(Py_None);
|
|
||||||
return Py_None;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is a reimplementation of the C library's chdir function,
|
/* This is a reimplementation of the C library's chdir function,
|
||||||
but one that produces Win32 errors instead of DOS error codes.
|
but one that produces Win32 errors instead of DOS error codes.
|
||||||
chdir is essentially a wrapper around SetCurrentDirectory; however,
|
chdir is essentially a wrapper around SetCurrentDirectory; however,
|
||||||
|
@ -2533,7 +2484,7 @@ posix_chmod(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return_value = win32_error_object("chmod", path.object);
|
return_value = path_error(&path);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
#else /* MS_WINDOWS */
|
#else /* MS_WINDOWS */
|
||||||
|
@ -2989,11 +2940,13 @@ posix_getcwd(int use_bytes)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!len) {
|
if (!len) {
|
||||||
if (wbuf2 != wbuf) free(wbuf2);
|
if (wbuf2 != wbuf)
|
||||||
return win32_error("getcwdu", NULL);
|
free(wbuf2);
|
||||||
|
return PyErr_SetFromWindowsErr(0);
|
||||||
}
|
}
|
||||||
resobj = PyUnicode_FromWideChar(wbuf2, len);
|
resobj = PyUnicode_FromWideChar(wbuf2, len);
|
||||||
if (wbuf2 != wbuf) free(wbuf2);
|
if (wbuf2 != wbuf)
|
||||||
|
free(wbuf2);
|
||||||
return resobj;
|
return resobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3101,7 +3054,7 @@ posix_link(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return_value = win32_error_object("link", dst.object);
|
return_value = path_error(&dst);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -3225,8 +3178,7 @@ posix_listdir(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 = NULL;
|
list = path_error(&path);
|
||||||
win32_error_unicode("FindFirstFileW", wnamebuf);
|
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
@ -3255,7 +3207,7 @@ posix_listdir(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 = win32_error_unicode("FindNextFileW", wnamebuf);
|
list = path_error(&path);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
} while (result == TRUE);
|
} while (result == TRUE);
|
||||||
|
@ -3282,7 +3234,8 @@ posix_listdir(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 = win32_error("FindFirstFile", namebuf);
|
path.func = "FindFirstFile";
|
||||||
|
list = path_error(&path);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
|
@ -3310,7 +3263,8 @@ posix_listdir(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 = win32_error("FindNextFile", namebuf);
|
path.func = "FindNextFile";
|
||||||
|
list = path_error(&path);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
} while (result == TRUE);
|
} while (result == TRUE);
|
||||||
|
@ -3320,7 +3274,7 @@ exit:
|
||||||
if (FindClose(hFindFile) == FALSE) {
|
if (FindClose(hFindFile) == FALSE) {
|
||||||
if (list != NULL) {
|
if (list != NULL) {
|
||||||
Py_DECREF(list);
|
Py_DECREF(list);
|
||||||
list = win32_error_object("FindClose", path.object);
|
list = path_error(&path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3569,7 +3523,7 @@ posix__getfileinformation(PyObject *self, PyObject *args)
|
||||||
return posix_error();
|
return posix_error();
|
||||||
|
|
||||||
if (!GetFileInformationByHandle(hFile, &info))
|
if (!GetFileInformationByHandle(hFile, &info))
|
||||||
return win32_error("_getfileinformation", NULL);
|
return PyErr_SetFromWindowsErr(0);
|
||||||
|
|
||||||
return Py_BuildValue("iii", info.dwVolumeSerialNumber,
|
return Py_BuildValue("iii", info.dwVolumeSerialNumber,
|
||||||
info.nFileIndexHigh,
|
info.nFileIndexHigh,
|
||||||
|
@ -3658,7 +3612,7 @@ posix_mkdir(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return_value = win32_error_object("mkdir", path.object);
|
return_value = path_error(&path);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -3828,7 +3782,7 @@ internal_rename(PyObject *args, PyObject *kwargs, int is_replace)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return_value = win32_error_object(function_name, dst.object);
|
return_value = path_error(&dst);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4396,6 +4350,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
PyObject *return_value = NULL;
|
PyObject *return_value = NULL;
|
||||||
|
|
||||||
memset(&path, 0, sizeof(path));
|
memset(&path, 0, sizeof(path));
|
||||||
|
path.function_name = "utime";
|
||||||
#if UTIME_HAVE_FD
|
#if UTIME_HAVE_FD
|
||||||
path.allow_fd = 1;
|
path.allow_fd = 1;
|
||||||
#endif
|
#endif
|
||||||
|
@ -4484,7 +4439,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
if (hFile == INVALID_HANDLE_VALUE) {
|
if (hFile == INVALID_HANDLE_VALUE) {
|
||||||
win32_error_object("utime", path.object);
|
path_error(&path);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4493,7 +4448,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
GetSystemTime(&now);
|
GetSystemTime(&now);
|
||||||
if (!SystemTimeToFileTime(&now, &mtime) ||
|
if (!SystemTimeToFileTime(&now, &mtime) ||
|
||||||
!SystemTimeToFileTime(&now, &atime)) {
|
!SystemTimeToFileTime(&now, &atime)) {
|
||||||
win32_error("utime", NULL);
|
PyErr_SetFromWindowsErr(0);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4506,7 +4461,7 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
as that may confuse the user into believing that
|
as that may confuse the user into believing that
|
||||||
something is wrong with the file, when it also
|
something is wrong with the file, when it also
|
||||||
could be the time stamp that gives a problem. */
|
could be the time stamp that gives a problem. */
|
||||||
win32_error("utime", NULL);
|
PyErr_SetFromWindowsErr(0);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
#else /* MS_WINDOWS */
|
#else /* MS_WINDOWS */
|
||||||
|
@ -6736,7 +6691,7 @@ posix_symlink(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return_value = win32_error_object("symlink", src.object);
|
return_value = path_error(&src);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7648,7 +7603,7 @@ posix_fstat(PyObject *self, PyObject *args)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
if (res != 0) {
|
if (res != 0) {
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
return win32_error("fstat", NULL);
|
return PyErr_SetFromWindowsErr(0);
|
||||||
#else
|
#else
|
||||||
return posix_error();
|
return posix_error();
|
||||||
#endif
|
#endif
|
||||||
|
@ -7694,7 +7649,7 @@ posix_pipe(PyObject *self, PyObject *noargs)
|
||||||
BOOL ok;
|
BOOL ok;
|
||||||
ok = CreatePipe(&read, &write, NULL, 0);
|
ok = CreatePipe(&read, &write, NULL, 0);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
return win32_error("CreatePipe", NULL);
|
return PyErr_SetFromWindowsErr(0);
|
||||||
read_fd = _open_osfhandle((Py_intptr_t)read, 0);
|
read_fd = _open_osfhandle((Py_intptr_t)read, 0);
|
||||||
write_fd = _open_osfhandle((Py_intptr_t)write, 1);
|
write_fd = _open_osfhandle((Py_intptr_t)write, 1);
|
||||||
return Py_BuildValue("(ii)", read_fd, write_fd);
|
return Py_BuildValue("(ii)", read_fd, write_fd);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue