diff options
author | Ronald Oussoren <ronaldoussoren@mac.com> | 2006-10-22 10:45:18 (GMT) |
---|---|---|
committer | Ronald Oussoren <ronaldoussoren@mac.com> | 2006-10-22 10:45:18 (GMT) |
commit | 10168f25ad7d9ea3b4726912584076c4cf05f8cd (patch) | |
tree | 8627daf8ee0f887154c890f0758a6be3e2bb03f5 /Modules | |
parent | d3973b578ff3eba31b001be0ea5ab466265d22fd (diff) | |
download | cpython-10168f25ad7d9ea3b4726912584076c4cf05f8cd.zip cpython-10168f25ad7d9ea3b4726912584076c4cf05f8cd.tar.gz cpython-10168f25ad7d9ea3b4726912584076c4cf05f8cd.tar.bz2 |
Patch #1580674: with this patch os.readlink uses the filesystem encoding to
decode unicode objects and returns an unicode object when the argument is one.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/posixmodule.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index b02388c..3260c3d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5687,17 +5687,53 @@ Return a string representing the path to which the symbolic link points."); static PyObject * posix_readlink(PyObject *self, PyObject *args) { + PyObject* v; char buf[MAXPATHLEN]; char *path; int n; - if (!PyArg_ParseTuple(args, "s:readlink", &path)) +#ifdef Py_USING_UNICODE + int arg_is_unicode = 0; +#endif + + if (!PyArg_ParseTuple(args, "et:readlink", + Py_FileSystemDefaultEncoding, &path)) return NULL; +#ifdef Py_USING_UNICODE + v = PySequence_GetItem(args, 0); + if (v == NULL) return NULL; + + if (PyUnicode_Check(v)) { + arg_is_unicode = 1; + } + Py_DECREF(v); +#endif + Py_BEGIN_ALLOW_THREADS n = readlink(path, buf, (int) sizeof buf); Py_END_ALLOW_THREADS if (n < 0) return posix_error_with_filename(path); - return PyString_FromStringAndSize(buf, n); + + v = PyString_FromStringAndSize(buf, n); +#ifdef Py_USING_UNICODE + if (arg_is_unicode) { + PyObject *w; + + w = PyUnicode_FromEncodedObject(v, + Py_FileSystemDefaultEncoding, + "strict"); + if (w != NULL) { + Py_DECREF(v); + v = w; + } + else { + /* fall back to the original byte string, as + discussed in patch #683592 */ + PyErr_Clear(); + } + } +#endif + return v; } #endif /* HAVE_READLINK */ |