[pypy-commit] pypy more-rposix: Move many functions at the same time...

amauryfa noreply at buildbot.pypy.org
Sat Nov 8 23:44:53 CET 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: more-rposix
Changeset: r74406:a3131c39081f
Date: 2014-11-08 22:16 +0100
http://bitbucket.org/pypy/pypy/changeset/a3131c39081f/

Log:	Move many functions at the same time...

diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -270,44 +270,10 @@
 def lstat(path):
     return os.lstat(_as_bytes(path))
 
-
 @specialize.argtype(0)
 def statvfs(path):
     return os.statvfs(_as_bytes(path))
 
-
- at specialize.argtype(0)
-def unlink(path):
-    return os.unlink(_as_bytes(path))
-
- at specialize.argtype(0, 1)
-def rename(path1, path2):
-    return os.rename(_as_bytes(path1), _as_bytes(path2))
-
- at specialize.argtype(0)
-def chmod(path, mode):
-    return os.chmod(_as_bytes(path), mode)
-
- at specialize.argtype(0)
-def chdir(path):
-    return os.chdir(_as_bytes(path))
-
- at specialize.argtype(0)
-def mkdir(path, mode=0777):
-    return os.mkdir(_as_bytes(path), mode)
-
- at specialize.argtype(0)
-def rmdir(path):
-    return os.rmdir(_as_bytes(path))
-
- at specialize.argtype(0)
-def mkfifo(path, mode):
-    os.mkfifo(_as_bytes(path), mode)
-
- at specialize.argtype(0)
-def mknod(path, mode, device):
-    os.mknod(_as_bytes(path), mode, device)
-
 @specialize.argtype(0, 1)
 def symlink(src, dest):
     os.symlink(_as_bytes(src), _as_bytes(dest))
@@ -431,12 +397,63 @@
 
 #___________________________________________________________________
 
+c_chdir = external('chdir', [rffi.CCHARP], rffi.INT)
 c_fchdir = external('fchdir', [rffi.INT], rffi.INT)
 c_access = external(UNDERSCORE_ON_WIN32 + 'access',
                     [rffi.CCHARP, rffi.INT], rffi.INT)
 c_waccess = external(UNDERSCORE_ON_WIN32 + 'waccess',
                      [rffi.CWCHARP, rffi.INT], rffi.INT)
 
+ at replace_os_function('chdir')
+ at specialize.argtype(0)
+def chdir(path):
+    if not _WIN32:
+        handle_posix_error('chdir', c_chdir(_as_bytes0(path)))
+    else:
+        traits = _preferred_traits(path)
+        from rpython.rlib.rwin32file import make_win32_traits
+        win32traits = make_win32_traits(traits)
+        path = traits._as_str0(path)
+
+        # This is a reimplementation of the C library's chdir
+        # function, but one that produces Win32 errors instead of DOS
+        # error codes.
+        # chdir is essentially a wrapper around SetCurrentDirectory;
+        # however, it also needs to set "magic" environment variables
+        # indicating the per-drive current directory, which are of the
+        # form =<drive>:
+        if not win32traits.SetCurrentDirectory(path):
+            raise rwin32.lastWindowsError()
+        MAX_PATH = rwin32.MAX_PATH
+        assert MAX_PATH > 0
+
+        with traits.scoped_alloc_buffer(MAX_PATH) as path:
+            res = win32traits.GetCurrentDirectory(MAX_PATH + 1, path.raw)
+            if not res:
+                raise rwin32.lastWindowsError()
+            res = rffi.cast(lltype.Signed, res)
+            assert res > 0
+            if res <= MAX_PATH + 1:
+                new_path = path.str(res)
+            else:
+                with traits.scoped_alloc_buffer(res) as path:
+                    res = win32traits.GetCurrentDirectory(res, path.raw)
+                    if not res:
+                        raise rwin32.lastWindowsError()
+                    res = rffi.cast(lltype.Signed, res)
+                    assert res > 0
+                    new_path = path.str(res)
+        if traits.str is unicode:
+            if new_path[0] == u'\\' or new_path[0] == u'/':  # UNC path
+                return
+            magic_envvar = u'=' + new_path[0] + u':'
+        else:
+            if new_path[0] == '\\' or new_path[0] == '/':  # UNC path
+                return
+            magic_envvar = '=' + new_path[0] + ':'
+        if not win32traits.SetEnvironmentVariable(magic_envvar, new_path):
+            raise rwin32.lastWindowsError()
+
 @replace_os_function('fchdir')
 def fchdir(fd):
     validate_fd(fd)
@@ -800,6 +817,152 @@
 
 #___________________________________________________________________
 
+c_readlink = external('readlink',
+                      [rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T], rffi.SSIZE_T)
+
+ at replace_os_function('readlink')
+def readlink(path):
+    path = _as_bytes0(path)
+    bufsize = 1023
+    while True:
+        buf = lltype.malloc(rffi.CCHARP.TO, bufsize, flavor='raw')
+        res = widen(c_readlink(path, buf, bufsize))
+        if res < 0:
+            lltype.free(buf, flavor='raw')
+            error = get_errno()    # failed
+            raise OSError(error, "readlink failed")
+        elif res < bufsize:
+            break                       # ok
+        else:
+            # buf too small, try again with a larger buffer
+            lltype.free(buf, flavor='raw')
+            bufsize *= 4
+    # convert the result to a string
+    result = rffi.charp2strn(buf, res)
+    lltype.free(buf, flavor='raw')
+    return result
+
+c_isatty = external(UNDERSCORE_ON_WIN32 + 'isatty', [rffi.INT], rffi.INT)
+
+ at replace_os_function('isatty')
+def isatty(fd):
+    if not is_valid_fd(fd):
+        return False
+    return c_isatty(fd) != 0
+    
+c_strerror = external('strerror', [rffi.INT], rffi.CCHARP,
+                      releasegil=False)
+
+ at replace_os_function('strerror')
+def strerror(errnum):
+    res = c_strerror(errnum)
+    if not res:
+        raise ValueError("os_strerror failed")
+    return rffi.charp2str(res)
+
+c_system = external('system', [rffi.CCHARP], rffi.INT)
+
+ at replace_os_function('system')
+def system(command):
+    return widen(c_system(command))
+
+c_unlink = external('unlink', [rffi.CCHARP], rffi.INT)
+c_mkdir = external('mkdir', [rffi.CCHARP, rffi.MODE_T], rffi.INT)
+c_rmdir = external(UNDERSCORE_ON_WIN32 + 'rmdir', [rffi.CCHARP], rffi.INT)
+c_wrmdir = external(UNDERSCORE_ON_WIN32 + 'wrmdir', [rffi.CWCHARP], rffi.INT)
+
+ at replace_os_function('unlink')
+ at specialize.argtype(0)
+def unlink(path):
+    if not _WIN32:
+        handle_posix_error('unlink', c_unlink(_as_bytes0(path)))
+    else:
+        traits = _preferred_traits(path)
+        win32traits = make_win32_traits(traits)
+        if not win32traits.DeleteFile(traits.as_str0(path)):
+            raise rwin32.lastWindowsError()
+
+ at replace_os_function('mkdir')
+ at specialize.argtype(0)
+def mkdir(path, mode=0o777):
+    if not _WIN32:
+        handle_posix_error('mkdir', c_mkdir(_as_bytes0(path), mode))
+    else:
+        traits = _preferred_traits(path)
+        win32traits = make_win32_traits(traits)
+        if not win32traits.CreateDirectory(traits.as_str0(path), None):
+            raise rwin32.lastWindowsError()
+
+ at replace_os_function('rmdir')
+ at specialize.argtype(0)
+def rmdir(path):
+    if _prefer_unicode(path):
+        handle_posix_error('wrmdir', c_wrmdir(_as_unicode0(path)))
+    else:
+        handle_posix_error('rmdir', c_rmdir(_as_bytes0(path)))
+
+c_chmod = external('chmod', [rffi.CCHARP, rffi.MODE_T], rffi.INT)
+c_fchmod = external('fchmod', [rffi.INT, rffi.MODE_T], rffi.INT)
+c_rename = external('rename', [rffi.CCHARP, rffi.CCHARP], rffi.INT)
+
+ at replace_os_function('chmod')
+ at specialize.argtype(0)
+def chmod(path, mode):
+    if not _WIN32:
+        handle_posix_error('chmod', c_chmod(_as_bytes0(path), mode))
+    else:
+        traits = _preferred_traits(path)
+        win32traits = make_win32_traits(traits)
+        path = traits.as_str0(path)
+        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()
+
+ at replace_os_function('fchmod')
+def fchmod(fd, mode):
+    handle_posix_error('fchmod', c_fchmod(fd, mode))
+
+ at replace_os_function('rename')
+ at specialize.argtype(0, 1)
+def rename(path1, path2):
+    if not _WIN32:
+        handle_posix_error('rename',
+                           c_rename(_as_bytes0(path1), _as_bytes0(path2)))
+    else:
+        traits = _preferred_traits(path)
+        win32traits = make_win32_traits(traits)
+        path1 = traits.as_str0(path1)
+        path2 = traits.as_str0(path2)
+        if not win32traits.MoveFile(path1, path2):
+            raise rwin32.lastWindowsError()
+
+c_mkfifo = external('mkfifo', [rffi.CCHARP, rffi.MODE_T], rffi.INT)
+c_mknod = external('mknod', [rffi.CCHARP, rffi.MODE_T, rffi.INT], rffi.INT,
+                   macro=True)
+#                                           # xxx: actually ^^^ dev_t
+
+ at replace_os_function('mkfifo')
+ at specialize.argtype(0)
+def mkfifo(path, mode):
+    handle_posix_error('mkfifo', c_mkfifo(_as_bytes0(path), mode))
+
+ at replace_os_function('mknod')
+ at specialize.argtype(0)
+def mknod(path, mode, dev):
+    handle_posix_error('mknod', c_mknod(_as_bytes0(path), mode, dev))
+
+c_umask = external(UNDERSCORE_ON_WIN32 + 'umask', [rffi.MODE_T], rffi.MODE_T)
+
+ at replace_os_function('umask')
+def umask(newmask):
+    return widen(c_umask(newmask))
+
 c_chown = external('chown', [rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT)
 c_lchown = external('lchown', [rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT)
 c_fchown = external('fchown', [rffi.INT, rffi.INT, rffi.INT], rffi.INT)
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -173,246 +173,6 @@
                 separate_module_sources = ["\n".join(defs)]
             ))
 
-    @registering_if(os, 'readlink')
-    def register_os_readlink(self):
-        os_readlink = self.llexternal('readlink',
-                                   [rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T],
-                                   rffi.INT)
-        # XXX SSIZE_T in POSIX.1-2001
-
-        def os_readlink_llimpl(path):
-            bufsize = 1023
-            while True:
-                l_path = rffi.str2charp(path)
-                buf = lltype.malloc(rffi.CCHARP.TO, bufsize,
-                                    flavor='raw')
-                res = rffi.cast(lltype.Signed, os_readlink(l_path, buf, bufsize))
-                lltype.free(l_path, flavor='raw')
-                if res < 0:
-                    error = rposix.get_errno()    # failed
-                    lltype.free(buf, flavor='raw')
-                    raise OSError(error, "readlink failed")
-                elif res < bufsize:
-                    break                       # ok
-                else:
-                    # buf too small, try again with a larger buffer
-                    lltype.free(buf, flavor='raw')
-                    bufsize *= 4
-            # convert the result to a string
-            result = rffi.charp2strn(buf, res)
-            lltype.free(buf, flavor='raw')
-            return result
-
-        return extdef([str0], str0,
-                      "ll_os.ll_os_readlink",
-                      llimpl=os_readlink_llimpl)
-
-    @registering(os.isatty)
-    def register_os_isatty(self):
-        os_isatty = self.llexternal(UNDERSCORE_ON_WIN32 + 'isatty',
-                                    [rffi.INT], rffi.INT)
-
-        def isatty_llimpl(fd):
-            if not rposix.is_valid_fd(fd):
-                return False
-            res = rffi.cast(lltype.Signed, os_isatty(rffi.cast(rffi.INT, fd)))
-            return res != 0
-
-        return extdef([int], bool, llimpl=isatty_llimpl,
-                      export_name="ll_os.ll_os_isatty")
-
-    @registering(os.strerror)
-    def register_os_strerror(self):
-        os_strerror = self.llexternal('strerror', [rffi.INT], rffi.CCHARP, releasegil=False)
-
-        def strerror_llimpl(errnum):
-            res = os_strerror(rffi.cast(rffi.INT, errnum))
-            if not res:
-                raise ValueError("os_strerror failed")
-            return rffi.charp2str(res)
-
-        return extdef([int], str, llimpl=strerror_llimpl,
-                      export_name="ll_os.ll_os_strerror")
-
-    @registering(os.system)
-    def register_os_system(self):
-        os_system = self.llexternal('system', [rffi.CCHARP], rffi.INT)
-
-        def system_llimpl(command):
-            res = os_system(command)
-            return rffi.cast(lltype.Signed, res)
-
-        return extdef([str0], int, llimpl=system_llimpl,
-                      export_name="ll_os.ll_os_system")
-
-    @registering_str_unicode(os.unlink)
-    def register_os_unlink(self, traits):
-        os_unlink = self.llexternal(traits.posix_function_name('unlink'),
-                                    [traits.CCHARP], rffi.INT)
-
-        def unlink_llimpl(pathname):
-            res = rffi.cast(lltype.Signed, os_unlink(pathname))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_unlink failed")
-
-        if sys.platform == 'win32':
-            from rpython.rlib.rwin32file import make_win32_traits
-            win32traits = make_win32_traits(traits)
-
-            @func_renamer('unlink_llimpl_%s' % traits.str.__name__)
-            def unlink_llimpl(path):
-                if not win32traits.DeleteFile(path):
-                    raise rwin32.lastWindowsError()
-
-        return extdef([traits.str0], s_None, llimpl=unlink_llimpl,
-                      export_name=traits.ll_os_name('unlink'))
-
-    @registering_str_unicode(os.chdir)
-    def register_os_chdir(self, traits):
-        os_chdir = self.llexternal(traits.posix_function_name('chdir'),
-                                   [traits.CCHARP], rffi.INT)
-
-        def os_chdir_llimpl(path):
-            res = rffi.cast(lltype.Signed, os_chdir(path))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_chdir failed")
-
-        # On Windows, use an implementation that will produce Win32 errors
-        if sys.platform == 'win32':
-            from rpython.rtyper.module.ll_win32file import make_chdir_impl
-            os_chdir_llimpl = make_chdir_impl(traits)
-
-        return extdef([traits.str0], s_None, llimpl=os_chdir_llimpl,
-                      export_name=traits.ll_os_name('chdir'))
-
-    @registering_str_unicode(os.mkdir)
-    def register_os_mkdir(self, traits):
-        os_mkdir = self.llexternal(traits.posix_function_name('mkdir'),
-                                   [traits.CCHARP, rffi.MODE_T], rffi.INT)
-
-        if sys.platform == 'win32':
-            from rpython.rlib.rwin32file import make_win32_traits
-            win32traits = make_win32_traits(traits)
-
-            @func_renamer('mkdir_llimpl_%s' % traits.str.__name__)
-            def os_mkdir_llimpl(path, mode):
-                if not win32traits.CreateDirectory(path, None):
-                    raise rwin32.lastWindowsError()
-        else:
-            def os_mkdir_llimpl(pathname, mode):
-                res = os_mkdir(pathname, mode)
-                res = rffi.cast(lltype.Signed, res)
-                if res < 0:
-                    raise OSError(rposix.get_errno(), "os_mkdir failed")
-
-        return extdef([traits.str0, int], s_None, llimpl=os_mkdir_llimpl,
-                      export_name=traits.ll_os_name('mkdir'))
-
-    @registering_str_unicode(os.rmdir)
-    def register_os_rmdir(self, traits):
-        os_rmdir = self.llexternal(traits.posix_function_name('rmdir'),
-                                   [traits.CCHARP], rffi.INT)
-
-        def rmdir_llimpl(pathname):
-            res = rffi.cast(lltype.Signed, os_rmdir(pathname))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_rmdir failed")
-
-        return extdef([traits.str0], s_None, llimpl=rmdir_llimpl,
-                      export_name=traits.ll_os_name('rmdir'))
-
-    @registering_str_unicode(os.chmod)
-    def register_os_chmod(self, traits):
-        os_chmod = self.llexternal(traits.posix_function_name('chmod'),
-                                   [traits.CCHARP, rffi.MODE_T], rffi.INT)
-
-        def chmod_llimpl(path, mode):
-            res = rffi.cast(lltype.Signed, os_chmod(path, rffi.cast(rffi.MODE_T, mode)))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_chmod failed")
-
-        if sys.platform == 'win32':
-            from rpython.rtyper.module.ll_win32file import make_chmod_impl
-            chmod_llimpl = make_chmod_impl(traits)
-
-        return extdef([traits.str0, int], s_None, llimpl=chmod_llimpl,
-                      export_name=traits.ll_os_name('chmod'))
-
-    @registering_if(os, 'fchmod')
-    def register_os_fchmod(self):
-        os_fchmod = self.llexternal('fchmod', [rffi.INT, rffi.MODE_T],
-                                    rffi.INT)
-
-        def fchmod_llimpl(fd, mode):
-            mode = rffi.cast(rffi.MODE_T, mode)
-            res = rffi.cast(lltype.Signed, os_fchmod(fd, mode))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_fchmod failed")
-
-        return extdef([int, int], s_None, "ll_os.ll_os_fchmod",
-                      llimpl=fchmod_llimpl)
-
-    @registering_str_unicode(os.rename)
-    def register_os_rename(self, traits):
-        os_rename = self.llexternal(traits.posix_function_name('rename'),
-                                    [traits.CCHARP, traits.CCHARP], rffi.INT)
-
-        def rename_llimpl(oldpath, newpath):
-            res = rffi.cast(lltype.Signed, os_rename(oldpath, newpath))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_rename failed")
-
-        if sys.platform == 'win32':
-            from rpython.rlib.rwin32file import make_win32_traits
-            win32traits = make_win32_traits(traits)
-
-            @func_renamer('rename_llimpl_%s' % traits.str.__name__)
-            def rename_llimpl(oldpath, newpath):
-                if not win32traits.MoveFile(oldpath, newpath):
-                    raise rwin32.lastWindowsError()
-
-        return extdef([traits.str0, traits.str0], s_None, llimpl=rename_llimpl,
-                      export_name=traits.ll_os_name('rename'))
-
-    @registering_str_unicode(getattr(os, 'mkfifo', None))
-    def register_os_mkfifo(self, traits):
-        os_mkfifo = self.llexternal(traits.posix_function_name('mkfifo'),
-                                    [traits.CCHARP, rffi.MODE_T], rffi.INT)
-
-        def mkfifo_llimpl(path, mode):
-            res = rffi.cast(lltype.Signed, os_mkfifo(path, mode))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_mkfifo failed")
-
-        return extdef([traits.str0, int], s_None, llimpl=mkfifo_llimpl,
-                      export_name=traits.ll_os_name('mkfifo'))
-
-    @registering_str_unicode(getattr(os, 'mknod', None))
-    def register_os_mknod(self, traits):
-        os_mknod = self.llexternal(traits.posix_function_name('mknod'),
-                                   [traits.CCHARP, rffi.MODE_T, rffi.INT],
-                                   rffi.INT)      # xxx: actually ^^^ dev_t
-
-        def mknod_llimpl(path, mode, dev):
-            res = rffi.cast(lltype.Signed, os_mknod(path, mode, dev))
-            if res < 0:
-                raise OSError(rposix.get_errno(), "os_mknod failed")
-
-        return extdef([traits.str0, int, int], s_None, llimpl=mknod_llimpl,
-                      export_name=traits.ll_os_name('mknod'))
-
-    @registering(os.umask)
-    def register_os_umask(self):
-        os_umask = self.llexternal(UNDERSCORE_ON_WIN32 + 'umask',
-                                   [rffi.MODE_T], rffi.MODE_T)
-
-        def umask_llimpl(newmask):
-            res = os_umask(rffi.cast(rffi.MODE_T, newmask))
-            return rffi.cast(lltype.Signed, res)
-
-        return extdef([int], int, llimpl=umask_llimpl,
-                      export_name="ll_os.ll_os_umask")
-
     @registering_if(os, 'kill', sys.platform != 'win32')
     def register_os_kill(self):
         os_kill = self.llexternal('kill', [rffi.PID_T, rffi.INT],
diff --git a/rpython/rtyper/module/ll_win32file.py b/rpython/rtyper/module/ll_win32file.py
deleted file mode 100644
--- a/rpython/rtyper/module/ll_win32file.py
+++ /dev/null
@@ -1,115 +0,0 @@
-"""
-The Windows implementation of some posix modules,
-based on the Win32 API.
-"""
-from __future__ import with_statement
-
-from rpython.rtyper.lltypesystem import lltype, rffi
-from rpython.translator.tool.cbuild import ExternalCompilationInfo
-from rpython.rtyper.tool import rffi_platform as platform
-from rpython.tool.sourcetools import func_renamer
-from rpython.rlib.objectmodel import specialize
-
-
-#_______________________________________________________________
-# chdir
-
-def make_chdir_impl(traits):
-    from rpython.rlib import rwin32
-    from rpython.rlib.rwin32file import make_win32_traits
-
-    win32traits = make_win32_traits(traits)
-
-    if traits.str is unicode:
-        def isUNC(path):
-            return path[0] == u'\\' or path[0] == u'/'
-        def magic_envvar(path):
-            return u'=' + path[0] + u':'
-    else:
-        def isUNC(path):
-            return path[0] == '\\' or path[0] == '/'
-        def magic_envvar(path):
-            return '=' + path[0] + ':'
-
-    @func_renamer('chdir_llimpl_%s' % traits.str.__name__)
-    def chdir_llimpl(path):
-        """This is a reimplementation of the C library's chdir function,
-        but one that produces Win32 errors instead of DOS error codes.
-        chdir is essentially a wrapper around SetCurrentDirectory; however,
-        it also needs to set "magic" environment variables indicating
-        the per-drive current directory, which are of the form =<drive>:
-        """
-        if not win32traits.SetCurrentDirectory(path):
-            raise rwin32.lastWindowsError()
-        MAX_PATH = rwin32.MAX_PATH
-        assert MAX_PATH > 0
-
-        with traits.scoped_alloc_buffer(MAX_PATH) as path:
-            res = win32traits.GetCurrentDirectory(MAX_PATH + 1, path.raw)
-            if not res:
-                raise rwin32.lastWindowsError()
-            res = rffi.cast(lltype.Signed, res)
-            assert res > 0
-            if res <= MAX_PATH + 1:
-                new_path = path.str(res)
-            else:
-                with traits.scoped_alloc_buffer(res) as path:
-                    res = win32traits.GetCurrentDirectory(res, path.raw)
-                    if not res:
-                        raise rwin32.lastWindowsError()
-                    res = rffi.cast(lltype.Signed, res)
-                    assert res > 0
-                    new_path = path.str(res)
-        if isUNC(new_path):
-            return
-        if not win32traits.SetEnvironmentVariable(magic_envvar(new_path), new_path):
-            raise rwin32.lastWindowsError()
-
-    return chdir_llimpl
-
-#_______________________________________________________________
-# chmod
-
-def make_chmod_impl(traits):
-    from rpython.rlib import rwin32
-    from rpython.rlib.rwin32file import make_win32_traits
-
-    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):
-    from rpython.rlib import rwin32
-    win32traits = make_win32_traits(traits)
-
-    @func_renamer('getfullpathname_llimpl_%s' % traits.str.__name__)
-    def getfullpathname_llimpl(path):
-        nBufferLength = rwin32.MAX_PATH + 1
-        lpBuffer = lltype.malloc(traits.CCHARP.TO, nBufferLength, flavor='raw')
-        try:
-            res = win32traits.GetFullPathName(
-                path, rffi.cast(rwin32.DWORD, nBufferLength),
-                lpBuffer, lltype.nullptr(win32traits.LPSTRP.TO))
-            if res == 0:
-                raise rwin32.lastWindowsError("_getfullpathname failed")
-            result = traits.charp2str(lpBuffer)
-            return result
-        finally:
-            lltype.free(lpBuffer, flavor='raw')
-
-    return getfullpathname_llimpl


More information about the pypy-commit mailing list