[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