diff options
author | Brian Curtin <brian.curtin@gmail.com> | 2010-11-24 20:24:31 (GMT) |
---|---|---|
committer | Brian Curtin <brian.curtin@gmail.com> | 2010-11-24 20:24:31 (GMT) |
commit | 1b9df3962088142300728724c485425a93eb5f2a (patch) | |
tree | 39ab274a95dec2ba74005f8baee2ba6354525aa5 /Modules | |
parent | f21c7ed39d026fea90d87a82290e677c6b4c5002 (diff) | |
download | cpython-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.c | 32 |
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__}, |