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.
This commit is contained in:
parent
d3973b578f
commit
10168f25ad
|
@ -920,6 +920,8 @@ Return a string representing the path to which the symbolic link
|
||||||
points. The result may be either an absolute or relative pathname; if
|
points. The result may be either an absolute or relative pathname; if
|
||||||
it is relative, it may be converted to an absolute pathname using
|
it is relative, it may be converted to an absolute pathname using
|
||||||
\code{os.path.join(os.path.dirname(\var{path}), \var{result})}.
|
\code{os.path.join(os.path.dirname(\var{path}), \var{result})}.
|
||||||
|
\versionchanged [If the \var{path} is a Unicode object the result will also
|
||||||
|
be a Unicode object]{2.6}
|
||||||
Availability: Macintosh, \UNIX.
|
Availability: Macintosh, \UNIX.
|
||||||
\end{funcdesc}
|
\end{funcdesc}
|
||||||
|
|
||||||
|
|
|
@ -5687,17 +5687,53 @@ Return a string representing the path to which the symbolic link points.");
|
||||||
static PyObject *
|
static PyObject *
|
||||||
posix_readlink(PyObject *self, PyObject *args)
|
posix_readlink(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
|
PyObject* v;
|
||||||
char buf[MAXPATHLEN];
|
char buf[MAXPATHLEN];
|
||||||
char *path;
|
char *path;
|
||||||
int n;
|
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;
|
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
|
Py_BEGIN_ALLOW_THREADS
|
||||||
n = readlink(path, buf, (int) sizeof buf);
|
n = readlink(path, buf, (int) sizeof buf);
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return posix_error_with_filename(path);
|
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 */
|
#endif /* HAVE_READLINK */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue