]> granicus.if.org Git - python/commitdiff
Patch #1580674: with this patch os.readlink uses the filesystem encoding to
authorRonald Oussoren <ronaldoussoren@mac.com>
Sun, 22 Oct 2006 10:45:18 +0000 (10:45 +0000)
committerRonald Oussoren <ronaldoussoren@mac.com>
Sun, 22 Oct 2006 10:45:18 +0000 (10:45 +0000)
decode unicode objects and returns an unicode object when the argument is one.

Doc/lib/libos.tex
Modules/posixmodule.c

index 9ded3ae0ca5f8bb56a3da487e71e66f0a11d9ae5..beb6eff93765385bf05d205ec5d4c7833f65a478 100644 (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
 it is relative, it may be converted to an absolute pathname using
 \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.
 \end{funcdesc}
 
index b02388c8287b5ddb0017e972e0132a6d318f77a2..3260c3d9092d0ea7d54565fad1f347988c51772d 100644 (file)
@@ -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 */