summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Curtin <brian.curtin@gmail.com>2010-11-28 23:59:46 +0000
committerBrian Curtin <brian.curtin@gmail.com>2010-11-28 23:59:46 +0000
commitb73affc57bc3afebe9abe641ca306773691cdb3e (patch)
tree0734e70d234522e4b7582bb2e46cd2e50a3add30
parent1077749652d3edd7519f9f88cbd804449b95e5d6 (diff)
downloadcpython-b73affc57bc3afebe9abe641ca306773691cdb3e.tar.gz
Fix for #8879.
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.
-rw-r--r--Lib/test/test_os.py5
-rw-r--r--Modules/posixmodule.c20
2 files changed, 23 insertions, 2 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 978364c478..5a37522ad8 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 3197a0d2d8..48dbaa515c 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;
}