[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