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:
Ronald Oussoren 2006-10-22 10:45:18 +00:00
parent d3973b578f
commit 10168f25ad
2 changed files with 40 additions and 2 deletions

View File

@ -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}

View File

@ -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 */