diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 978364c4789..5a37522ad82 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -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 diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3197a0d2d8d..48dbaa515c4 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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; }