Fix for #8879.
authorBrian Curtin <brian.curtin@gmail.com>
Sun, 28 Nov 2010 23:59:46 +0000 (23:59 +0000)
committerBrian Curtin <brian.curtin@gmail.com>
Sun, 28 Nov 2010 23:59:46 +0000 (23:59 +0000)
Amaury noticed that this was originally written in a way that would fail on
names that can't be encoded with the mbcs codec. Restructured the function
to work with wide names first then narrow names second, to fall in line
with the way other functions are written in posixmodule.c.

Lib/test/test_os.py
Modules/posixmodule.c

index 978364c4789b719e7579414cc95287f29ba9496e..5a37522ad82e3a03464d2a0bbdd5551399a3ef02 100644 (file)
@@ -887,6 +887,11 @@ class LinkTests(unittest.TestCase):
         self._test_link(bytes(self.file1, sys.getfilesystemencoding()),
                         bytes(self.file2, sys.getfilesystemencoding()))
 
+    def test_mbcs_name(self):
+        self.file1 += "\u65e5\u672c"
+        self.file2 = self.file1 + "2"
+        self._test_link(self.file1, self.file2)
+
 if sys.platform != 'win32':
     class Win32ErrorTests(unittest.TestCase):
         pass
index 3197a0d2d8dfb8ebaf439738788fd85a0214b8ce..48dbaa515c41937644b952df76a05771f6bd5502 100644 (file)
@@ -2252,6 +2252,22 @@ win32_link(PyObject *self, PyObject *args)
     char *src, *dst;
     BOOL rslt;
 
+    PyUnicodeObject *usrc, *udst;
+    if (PyArg_ParseTuple(args, "UU:link", &usrc, &udst)) {
+        Py_BEGIN_ALLOW_THREADS
+        rslt = CreateHardLinkW(PyUnicode_AS_UNICODE(udst),
+                               PyUnicode_AS_UNICODE(usrc), NULL);
+        Py_END_ALLOW_THREADS
+
+        if (rslt == 0)
+            return win32_error("link", NULL);
+
+        Py_RETURN_NONE;
+    }
+
+    /* Narrow strings also valid. */
+    PyErr_Clear();
+
     if (!PyArg_ParseTuple(args, "O&O&:link", PyUnicode_FSConverter, &osrc,
                           PyUnicode_FSConverter, &odst))
         return NULL;
@@ -2260,13 +2276,13 @@ win32_link(PyObject *self, PyObject *args)
     dst = PyBytes_AsString(odst);
 
     Py_BEGIN_ALLOW_THREADS
-    rslt = CreateHardLink(dst, src, NULL);
+    rslt = CreateHardLinkA(dst, src, NULL);
     Py_END_ALLOW_THREADS
 
     Py_DECREF(osrc);
     Py_DECREF(odst);
     if (rslt == 0)
-        return posix_error();
+        return win32_error("link", NULL);
 
     Py_RETURN_NONE;
 }