summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorBrian Curtin <brian.curtin@gmail.com>2010-11-24 20:24:31 (GMT)
committerBrian Curtin <brian.curtin@gmail.com>2010-11-24 20:24:31 (GMT)
commit1b9df3962088142300728724c485425a93eb5f2a (patch)
tree39ab274a95dec2ba74005f8baee2ba6354525aa5 /Modules
parentf21c7ed39d026fea90d87a82290e677c6b4c5002 (diff)
downloadcpython-1b9df3962088142300728724c485425a93eb5f2a.zip
cpython-1b9df3962088142300728724c485425a93eb5f2a.tar.gz
cpython-1b9df3962088142300728724c485425a93eb5f2a.tar.bz2
Fix #8879. Add os.link support to Windows.
Additionally, the st_ino attribute of stat structures was not being filled in. This was left out of the fix to #10027 and was noticed due to test_tarfile failing when applying the patch for this issue. An earlier version of the fix to #10027 included st_ino, but that attribute got lost in the shuffle of a few review/fix cycles. All tests pass.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/posixmodule.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index cba8a9d..8b7d7e9 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1035,6 +1035,7 @@ attribute_data_to_stat(BY_HANDLE_FILE_INFORMATION *info, struct win32_stat *resu
FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
result->st_nlink = info->nNumberOfLinks;
+ result->st_ino = (((__int64)info->nFileIndexHigh)<<32) + info->nFileIndexLow;
return 0;
}
@@ -2239,6 +2240,36 @@ posix_link(PyObject *self, PyObject *args)
}
#endif /* HAVE_LINK */
+#ifdef MS_WINDOWS
+PyDoc_STRVAR(win32_link__doc__,
+"link(src, dst)\n\n\
+Create a hard link to a file.");
+
+static PyObject *
+win32_link(PyObject *self, PyObject *args)
+{
+ PyObject *osrc, *odst;
+ char *src, *dst;
+ BOOL rslt;
+
+ if (!PyArg_ParseTuple(args, "O&O&:link", PyUnicode_FSConverter, &osrc,
+ PyUnicode_FSConverter, &odst))
+ return NULL;
+
+ src = PyBytes_AsString(osrc);
+ dst = PyBytes_AsString(odst);
+
+ Py_BEGIN_ALLOW_THREADS
+ rslt = CreateHardLink(dst, src, NULL);
+ Py_END_ALLOW_THREADS
+
+ if (rslt == 0)
+ return posix_error();
+
+ Py_RETURN_NONE;
+}
+#endif /* MS_WINDOWS */
+
PyDoc_STRVAR(posix_listdir__doc__,
"listdir([path]) -> list_of_strings\n\n\
@@ -7808,6 +7839,7 @@ static PyMethodDef posix_methods[] = {
#ifdef MS_WINDOWS
{"startfile", win32_startfile, METH_VARARGS, win32_startfile__doc__},
{"kill", win32_kill, METH_VARARGS, win32_kill__doc__},
+ {"link", win32_link, METH_VARARGS, win32_link__doc__},
#endif
#ifdef HAVE_SETUID
{"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},