Fix [ 846133 ] os.chmod/os.utime/shutil do not work with unicode filenames
This commit is contained in:
parent
7d0a609e6f
commit
817c929bba
|
@ -1162,7 +1162,25 @@ posix_chmod(PyObject *self, PyObject *args)
|
||||||
char *path = NULL;
|
char *path = NULL;
|
||||||
int i;
|
int i;
|
||||||
int res;
|
int res;
|
||||||
if (!PyArg_ParseTuple(args, "eti", Py_FileSystemDefaultEncoding,
|
#ifdef Py_WIN_WIDE_FILENAMES
|
||||||
|
if (unicode_file_names()) {
|
||||||
|
PyUnicodeObject *po;
|
||||||
|
if (PyArg_ParseTuple(args, "Ui|:chmod", &po, &i)) {
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
res = _wchmod(PyUnicode_AS_UNICODE(po), i);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
if (res < 0)
|
||||||
|
return posix_error_with_unicode_filename(
|
||||||
|
PyUnicode_AS_UNICODE(po));
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
/* Drop the argument parsing error as narrow strings
|
||||||
|
are also valid. */
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
#endif /* Py_WIN_WIDE_FILENAMES */
|
||||||
|
if (!PyArg_ParseTuple(args, "eti:chmod", Py_FileSystemDefaultEncoding,
|
||||||
&path, &i))
|
&path, &i))
|
||||||
return NULL;
|
return NULL;
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
@ -1934,11 +1952,32 @@ posix_utime(PyObject *self, PyObject *args)
|
||||||
#define UTIME_ARG buf
|
#define UTIME_ARG buf
|
||||||
#endif /* HAVE_UTIMES */
|
#endif /* HAVE_UTIMES */
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
|
int have_unicode_filename = 0;
|
||||||
|
#ifdef Py_WIN_WIDE_FILENAMES
|
||||||
|
PyUnicodeObject *obwpath;
|
||||||
|
wchar_t *wpath;
|
||||||
|
if (unicode_file_names()) {
|
||||||
|
if (PyArg_ParseTuple(args, "UO|:utime", &obwpath, &arg)) {
|
||||||
|
wpath = PyUnicode_AS_UNICODE(obwpath);
|
||||||
|
have_unicode_filename = 1;
|
||||||
|
} else
|
||||||
|
/* Drop the argument parsing error as narrow strings
|
||||||
|
are also valid. */
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
#endif /* Py_WIN_WIDE_FILENAMES */
|
||||||
|
|
||||||
|
if (!have_unicode_filename && \
|
||||||
|
!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (arg == Py_None) {
|
if (arg == Py_None) {
|
||||||
/* optional time values not given */
|
/* optional time values not given */
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
#ifdef Py_WIN_WIDE_FILENAMES
|
||||||
|
if (have_unicode_filename)
|
||||||
|
res = _wutime(wpath, NULL);
|
||||||
|
else
|
||||||
|
#endif /* Py_WIN_WIDE_FILENAMES */
|
||||||
res = utime(path, NULL);
|
res = utime(path, NULL);
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
}
|
}
|
||||||
|
@ -1964,9 +2003,17 @@ posix_utime(PyObject *self, PyObject *args)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
#else
|
#else
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
#ifdef Py_WIN_WIDE_FILENAMES
|
||||||
|
if (have_unicode_filename)
|
||||||
|
/* utime is OK with utimbuf, but _wutime insists
|
||||||
|
on _utimbuf (the msvc headers assert the
|
||||||
|
underscore version is ansi) */
|
||||||
|
res = _wutime(wpath, (struct _utimbuf *)UTIME_ARG);
|
||||||
|
else
|
||||||
|
#endif /* Py_WIN_WIDE_FILENAMES */
|
||||||
res = utime(path, UTIME_ARG);
|
res = utime(path, UTIME_ARG);
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
#endif
|
#endif /* HAVE_UTIMES */
|
||||||
}
|
}
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
return posix_error_with_filename(path);
|
return posix_error_with_filename(path);
|
||||||
|
|
Loading…
Reference in New Issue