[pypy-commit] pypy py3.5: As os.link() implementation on Windows
amauryfa
pypy.commits at gmail.com
Tue Jun 27 17:38:56 EDT 2017
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3.5
Changeset: r91654:16f97608b715
Date: 2017-05-06 11:46 +0200
http://bitbucket.org/pypy/pypy/changeset/16f97608b715/
Log: As os.link() implementation on Windows
diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -69,6 +69,7 @@
'chmod': 'interp_posix.chmod',
'rename': 'interp_posix.rename',
'replace': 'interp_posix.replace',
+ 'link': 'interp_posix.link',
'umask': 'interp_posix.umask',
'_exit': 'interp_posix._exit',
'utime': 'interp_posix.utime',
@@ -109,8 +110,6 @@
interpleveldefs['killpg'] = 'interp_posix.killpg'
if hasattr(os, 'getpid'):
interpleveldefs['getpid'] = 'interp_posix.getpid'
- if hasattr(os, 'link'):
- interpleveldefs['link'] = 'interp_posix.link'
if hasattr(os, 'symlink'):
interpleveldefs['symlink'] = 'interp_posix.symlink'
if hasattr(os, 'readlink'):
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1296,9 +1296,17 @@
@replace_os_function('link')
@specialize.argtype(0, 1)
def link(oldpath, newpath):
- oldpath = _as_bytes0(oldpath)
- newpath = _as_bytes0(newpath)
- handle_posix_error('link', c_link(oldpath, newpath))
+ if not _WIN32:
+ oldpath = _as_bytes0(oldpath)
+ newpath = _as_bytes0(newpath)
+ handle_posix_error('link', c_link(oldpath, newpath))
+ else:
+ traits = _preferred_traits(path1)
+ win32traits = make_win32_traits(traits)
+ oldpath = traits.as_str0(oldpath)
+ newpath = traits.as_str0(newpath)
+ if not win32traits.CreateHardLink(newpath, oldpath, None):
+ raise rwin32.lastSavedWindowsError()
@replace_os_function('symlink')
@specialize.argtype(0, 1)
diff --git a/rpython/rlib/rwin32file.py b/rpython/rlib/rwin32file.py
--- a/rpython/rlib/rwin32file.py
+++ b/rpython/rlib/rwin32file.py
@@ -234,6 +234,12 @@
rwin32.BOOL,
save_err=rffi.RFFI_SAVE_LASTERROR)
+ CreateHardLink = external(
+ 'CreateHardLink' + suffix,
+ [traits.CCHARP, traits.CCHARP, rwin32.LPSECURITY_ATTRIBUTES],
+ rwin32.BOOL,
+ save_err=rffi.RFFI_SAVE_LASTERROR)
+
return Win32Traits
def make_longlong(high, low):
More information about the pypy-commit
mailing list