summaryrefslogtreecommitdiffstats
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
authorMark Hammond <mhammond@skippinet.com.au>2003-12-03 01:22:38 (GMT)
committerMark Hammond <mhammond@skippinet.com.au>2003-12-03 01:22:38 (GMT)
commit817c929bba3971a452c86c55ea6103491fdd450d (patch)
treeed4059a85317e23f67040de24fdf3c5a18589260 /Modules/posixmodule.c
parent7d0a609e6f43b82f3aeeefcb0574f3c1e4b09ad4 (diff)
downloadcpython-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/posixmodule.c')
-rw-r--r--Modules/posixmodule.c53
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);