[pypy-svn] pypy default: win32 implementation of os.chmod()

amauryfa commits-noreply at bitbucket.org
Thu Jan 20 19:36:52 CET 2011


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: 
Changeset: r41071:3250c64db5e5
Date: 2011-01-20 18:32 +0100
http://bitbucket.org/pypy/pypy/changeset/3250c64db5e5/

Log:	win32 implementation of os.chmod()

diff --git a/pypy/rpython/module/ll_os.py b/pypy/rpython/module/ll_os.py
--- a/pypy/rpython/module/ll_os.py
+++ b/pypy/rpython/module/ll_os.py
@@ -1338,6 +1338,10 @@
             if res < 0:
                 raise OSError(rposix.get_errno(), "os_chmod failed")
 
+        if sys.platform == 'win32':
+            from pypy.rpython.module.ll_win32file import make_chmod_impl
+            chmod_llimpl = make_chmod_impl(traits)
+
         return extdef([traits.str, int], s_None, llimpl=chmod_llimpl,
                       export_name=traits.ll_os_name('chmod'))
 

diff --git a/pypy/rpython/module/ll_win32file.py b/pypy/rpython/module/ll_win32file.py
--- a/pypy/rpython/module/ll_win32file.py
+++ b/pypy/rpython/module/ll_win32file.py
@@ -42,6 +42,8 @@
             'FILE_ATTRIBUTE_DIRECTORY')
         FILE_ATTRIBUTE_READONLY = platform.ConstantInteger(
             'FILE_ATTRIBUTE_READONLY')
+        INVALID_FILE_ATTRIBUTES = platform.ConstantInteger(
+            'INVALID_FILE_ATTRIBUTES')
         ERROR_SHARING_VIOLATION = platform.ConstantInteger(
             'ERROR_SHARING_VIOLATION')
         _S_IFDIR = platform.ConstantInteger('_S_IFDIR')
@@ -86,6 +88,7 @@
         for name in '''WIN32_FIND_DATA WIN32_FILE_ATTRIBUTE_DATA BY_HANDLE_FILE_INFORMATION
                        GetFileExInfoStandard
                        FILE_ATTRIBUTE_DIRECTORY FILE_ATTRIBUTE_READONLY
+                       INVALID_FILE_ATTRIBUTES
                        _S_IFDIR _S_IFREG _S_IFCHR _S_IFIFO
                        FILE_TYPE_UNKNOWN FILE_TYPE_CHAR FILE_TYPE_PIPE
                        ERROR_FILE_NOT_FOUND ERROR_NO_MORE_FILES
@@ -105,6 +108,16 @@
                              [rwin32.HANDLE],
                              rwin32.BOOL)
 
+        GetFileAttributes = external(
+            'GetFileAttributes' + suffix,
+            [traits.CCHARP],
+            rwin32.DWORD)
+
+        SetFileAttributes = external(
+            'SetFileAttributes' + suffix,
+            [traits.CCHARP, rwin32.DWORD],
+            rwin32.BOOL)
+
         GetFileAttributesEx = external(
             'GetFileAttributesEx' + suffix,
             [traits.CCHARP, GET_FILEEX_INFO_LEVELS,
@@ -257,6 +270,27 @@
     return chdir_llimpl
 
 #_______________________________________________________________
+# chmod
+
+def make_chmod_impl(traits):
+    from pypy.rlib import rwin32
+    win32traits = make_win32_traits(traits)
+
+    @func_renamer('chmod_llimpl_%s' % traits.str.__name__)
+    def chmod_llimpl(path, mode):
+        attr = win32traits.GetFileAttributes(path)
+        if attr == win32traits.INVALID_FILE_ATTRIBUTES:
+            raise rwin32.lastWindowsError()
+        if mode & 0200: # _S_IWRITE
+            attr &= ~win32traits.FILE_ATTRIBUTE_READONLY
+        else:
+            attr |= win32traits.FILE_ATTRIBUTE_READONLY
+        if not win32traits.SetFileAttributes(path, attr):
+            raise rwin32.lastWindowsError()
+
+    return chmod_llimpl
+
+#_______________________________________________________________
 # getfullpathname
 
 def make_getfullpathname_impl(traits):


More information about the Pypy-commit mailing list