diff options
author | Mark Hammond <mhammond@skippinet.com.au> | 2003-12-03 01:22:38 (GMT) |
---|---|---|
committer | Mark Hammond <mhammond@skippinet.com.au> | 2003-12-03 01:22:38 (GMT) |
commit | 817c929bba3971a452c86c55ea6103491fdd450d (patch) | |
tree | ed4059a85317e23f67040de24fdf3c5a18589260 /Modules | |
parent | 7d0a609e6f43b82f3aeeefcb0574f3c1e4b09ad4 (diff) | |
download | cpython-817c929bba3971a452c86c55ea6103491fdd450d.zip cpython-817c929bba3971a452c86c55ea6103491fdd450d.tar.gz cpython-817c929bba3971a452c86c55ea6103491fdd450d.tar.bz2 |
Fix [ 846133 ] os.chmod/os.utime/shutil do not work with unicode filenames
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/posixmodule.c | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 4b3d825..52977fe 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1162,7 +1162,25 @@ posix_chmod(PyObject *self, PyObject *args) char *path = NULL; int i; 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)) return NULL; Py_BEGIN_ALLOW_THREADS @@ -1934,11 +1952,32 @@ posix_utime(PyObject *self, PyObject *args) #define UTIME_ARG buf #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; if (arg == Py_None) { /* optional time values not given */ 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); Py_END_ALLOW_THREADS } @@ -1964,9 +2003,17 @@ posix_utime(PyObject *self, PyObject *args) Py_END_ALLOW_THREADS #else 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); Py_END_ALLOW_THREADS -#endif +#endif /* HAVE_UTIMES */ } if (res < 0) return posix_error_with_filename(path); |