Author: Amaury Forgeot d'Arc <[email protected]>
Branch: more-rposix
Changeset: r74363:586ee1f92428
Date: 2014-11-06 23:51 +0100
http://bitbucket.org/pypy/pypy/changeset/586ee1f92428/
Log: Port os.utime.
A lot of changes, but it's actually 30 lines less than before.
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1,7 +1,8 @@
import os
import sys
from rpython.rtyper.lltypesystem.rffi import CConstant, CExternVariable, INT
-from rpython.rtyper.lltypesystem import ll2ctypes, rffi
+from rpython.rtyper.lltypesystem import lltype, ll2ctypes, rffi
+from rpython.rtyper.tool import rffi_platform
from rpython.translator.tool.cbuild import ExternalCompilationInfo
from rpython.rlib.rarithmetic import intmask
from rpython.rlib.objectmodel import (
@@ -135,13 +136,22 @@
pass
if _WIN32:
- includes = ['io.h']
+ includes = ['io.h', 'sys/utime.h', 'sys/types.h']
else:
- includes = ['unistd.h']
+ includes = ['unistd.h', 'utime.h', 'sys/time.h', 'sys/types.h']
eci = ExternalCompilationInfo(
includes=includes,
)
+class CConfig:
+ _compilation_info_ = eci
+ HAVE_UTIMES = rffi_platform.Has('utimes')
+ UTIMBUF = rffi_platform.Struct('struct %sutimbuf' % UNDERSCORE_ON_WIN32,
+ [('actime', rffi.INT),
+ ('modtime', rffi.INT)])
+config = rffi_platform.configure(CConfig)
+globals().update(config)
+
def external(name, args, result, **kwds):
return rffi.llexternal(name, args, result, compilation_info=eci, **kwds)
@@ -257,10 +267,6 @@
def chmod(path, mode):
return os.chmod(_as_bytes(path), mode)
[email protected](0, 1)
-def utime(path, times):
- return os.utime(_as_bytes(path), times)
-
@specialize.argtype(0)
def chdir(path):
return os.chdir(_as_bytes(path))
@@ -398,3 +404,116 @@
if not result:
raise OSError(get_errno(), "getlogin failed")
return rffi.charp2str(result)
+
+
+#_______________________________________________________________
+
+UTIMBUFP = lltype.Ptr(UTIMBUF)
+c_utime = external('utime', [rffi.CCHARP, UTIMBUFP], rffi.INT)
+if HAVE_UTIMES:
+ class CConfig:
+ _compilation_info_ = eci
+ TIMEVAL = rffi_platform.Struct('struct timeval', [
+ ('tv_sec', rffi.LONG),
+ ('tv_usec', rffi.LONG)])
+ config = rffi_platform.configure(CConfig)
+ TIMEVAL = config['TIMEVAL']
+ TIMEVAL2P = rffi.CArrayPtr(TIMEVAL)
+ c_utimes = external('utimes', [rffi.CCHARP, TIMEVAL2P], rffi.INT)
+
+if _WIN32:
+ from rpython.rlib.rposix import rwin32
+ GetSystemTime = external(
+ 'GetSystemTime',
+ [lltype.Ptr(rwin32.SYSTEMTIME)],
+ lltype.Void,
+ calling_conv='win')
+
+ SystemTimeToFileTime = external(
+ 'SystemTimeToFileTime',
+ [lltype.Ptr(rwin32.SYSTEMTIME),
+ lltype.Ptr(rwin32.FILETIME)],
+ rwin32.BOOL,
+ calling_conv='win')
+
+ SetFileTime = external(
+ 'SetFileTime',
+ [rwin32.HANDLE,
+ lltype.Ptr(rwin32.FILETIME),
+ lltype.Ptr(rwin32.FILETIME),
+ lltype.Ptr(rwin32.FILETIME)],
+ rwin32.BOOL,
+ calling_conv='win')
+
+
+@register_replacement_for(getattr(os, 'utime', None),
+ sandboxed_name='ll_os.ll_os_utime')
[email protected](0, 1)
+def utime(path, times):
+ if not _WIN32:
+ path = _as_bytes0(path)
+ if times is None:
+ error = c_utime(path, lltype.nullptr(UTIMBUFP.TO))
+ else:
+ actime, modtime = times
+ if HAVE_UTIMES:
+ import math
+ l_times = lltype.malloc(TIMEVAL2P.TO, 2, flavor='raw')
+ fracpart, intpart = math.modf(actime)
+ rffi.setintfield(l_times[0], 'c_tv_sec', int(intpart))
+ rffi.setintfield(l_times[0], 'c_tv_usec', int(fracpart * 1e6))
+ fracpart, intpart = math.modf(modtime)
+ rffi.setintfield(l_times[1], 'c_tv_sec', int(intpart))
+ rffi.setintfield(l_times[1], 'c_tv_usec', int(fracpart * 1e6))
+ error = c_utimes(path, l_times)
+ lltype.free(l_times, flavor='raw')
+ else:
+ l_utimbuf = lltype.malloc(UTIMBUFP.TO, flavor='raw')
+ l_utimbuf.c_actime = rffi.r_time_t(actime)
+ l_utimbuf.c_modtime = rffi.r_time_t(modtime)
+ error = c_utime(path, l_utimbuf)
+ lltype.free(l_utimbuf, flavor='raw')
+ if error < 0:
+ raise OSError(get_errno(), "os_utime failed")
+ else: # _WIN32 case
+ from rpython.rlib.rwin32file import make_win32_traits
+ if _prefer_unicode(path):
+ # XXX remove dependency on rtyper.module. The "traits"
+ # are just used for CreateFile anyway.
+ from rpython.rtyper.module.support import UnicodeTraits
+ win32traits = make_win32_traits(UnicodeTraits())
+ path = _as_unicode0(path)
+ else:
+ from rpython.rtyper.module.support import StringTraits
+ win32traits = make_win32_traits(StringTraits())
+ path = _as_bytes0(path)
+ hFile = win32traits.CreateFile(path,
+ win32traits.FILE_WRITE_ATTRIBUTES, 0,
+ None, win32traits.OPEN_EXISTING,
+ win32traits.FILE_FLAG_BACKUP_SEMANTICS,
+ rwin32.NULL_HANDLE)
+ if hFile == rwin32.INVALID_HANDLE_VALUE:
+ raise rwin32.lastWindowsError()
+ ctime = lltype.nullptr(rwin32.FILETIME)
+ atime = lltype.malloc(rwin32.FILETIME, flavor='raw')
+ mtime = lltype.malloc(rwin32.FILETIME, flavor='raw')
+ try:
+ if tp is None:
+ now = lltype.malloc(rwin32.SYSTEMTIME, flavor='raw')
+ try:
+ GetSystemTime(now)
+ if (not SystemTimeToFileTime(now, atime) or
+ not SystemTimeToFileTime(now, mtime)):
+ raise rwin32.lastWindowsError()
+ finally:
+ lltype.free(now, flavor='raw')
+ else:
+ actime, modtime = tp
+ time_t_to_FILE_TIME(actime, atime)
+ time_t_to_FILE_TIME(modtime, mtime)
+ if not SetFileTime(hFile, ctime, atime, mtime):
+ raise rwin32.lastWindowsError()
+ finally:
+ rwin32.CloseHandle(hFile)
+ lltype.free(atime, flavor='raw')
+ lltype.free(mtime, flavor='raw')
diff --git a/rpython/rlib/rwin32file.py b/rpython/rlib/rwin32file.py
new file mode 100644
--- /dev/null
+++ b/rpython/rlib/rwin32file.py
@@ -0,0 +1,192 @@
+"""
+Win32 API functions around files.
+"""
+
+from rpython.rtyper.lltypesystem import lltype, rffi
+from rpython.translator.tool.cbuild import ExternalCompilationInfo
+from rpython.rtyper.tool import rffi_platform as platform
+
+
+def make_win32_traits(traits):
+ from rpython.rlib import rwin32
+
+ if traits.str is unicode:
+ suffix = 'W'
+ else:
+ suffix = 'A'
+
+ class CConfig:
+ _compilation_info_ = ExternalCompilationInfo(
+ includes = ['windows.h', 'winbase.h', 'sys/stat.h'],
+ )
+ WIN32_FIND_DATA = platform.Struct(
+ 'struct _WIN32_FIND_DATA' + suffix,
+ # Only interesting fields
+ [('dwFileAttributes', rwin32.DWORD),
+ ('nFileSizeHigh', rwin32.DWORD),
+ ('nFileSizeLow', rwin32.DWORD),
+ ('ftCreationTime', rwin32.FILETIME),
+ ('ftLastAccessTime', rwin32.FILETIME),
+ ('ftLastWriteTime', rwin32.FILETIME),
+ ('cFileName', lltype.FixedSizeArray(traits.CHAR, 250))])
+ ERROR_FILE_NOT_FOUND = platform.ConstantInteger(
+ 'ERROR_FILE_NOT_FOUND')
+ ERROR_NO_MORE_FILES = platform.ConstantInteger(
+ 'ERROR_NO_MORE_FILES')
+
+ GetFileExInfoStandard = platform.ConstantInteger(
+ 'GetFileExInfoStandard')
+ FILE_ATTRIBUTE_DIRECTORY = platform.ConstantInteger(
+ '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')
+ _S_IFREG = platform.ConstantInteger('_S_IFREG')
+ _S_IFCHR = platform.ConstantInteger('_S_IFCHR')
+ _S_IFIFO = platform.ConstantInteger('_S_IFIFO')
+ FILE_TYPE_UNKNOWN = platform.ConstantInteger('FILE_TYPE_UNKNOWN')
+ FILE_TYPE_CHAR = platform.ConstantInteger('FILE_TYPE_CHAR')
+ FILE_TYPE_PIPE = platform.ConstantInteger('FILE_TYPE_PIPE')
+
+ FILE_WRITE_ATTRIBUTES = platform.ConstantInteger(
+ 'FILE_WRITE_ATTRIBUTES')
+ OPEN_EXISTING = platform.ConstantInteger(
+ 'OPEN_EXISTING')
+ FILE_FLAG_BACKUP_SEMANTICS = platform.ConstantInteger(
+ 'FILE_FLAG_BACKUP_SEMANTICS')
+ VOLUME_NAME_DOS = platform.ConstantInteger('VOLUME_NAME_DOS')
+ VOLUME_NAME_NT = platform.ConstantInteger('VOLUME_NAME_NT')
+
+ WIN32_FILE_ATTRIBUTE_DATA = platform.Struct(
+ 'WIN32_FILE_ATTRIBUTE_DATA',
+ [('dwFileAttributes', rwin32.DWORD),
+ ('nFileSizeHigh', rwin32.DWORD),
+ ('nFileSizeLow', rwin32.DWORD),
+ ('ftCreationTime', rwin32.FILETIME),
+ ('ftLastAccessTime', rwin32.FILETIME),
+ ('ftLastWriteTime', rwin32.FILETIME)])
+
+ BY_HANDLE_FILE_INFORMATION = platform.Struct(
+ 'BY_HANDLE_FILE_INFORMATION',
+ [('dwFileAttributes', rwin32.DWORD),
+ ('ftCreationTime', rwin32.FILETIME),
+ ('ftLastAccessTime', rwin32.FILETIME),
+ ('ftLastWriteTime', rwin32.FILETIME),
+ ('dwVolumeSerialNumber', rwin32.DWORD),
+ ('nFileSizeHigh', rwin32.DWORD),
+ ('nFileSizeLow', rwin32.DWORD),
+ ('nNumberOfLinks', rwin32.DWORD),
+ ('nFileIndexHigh', rwin32.DWORD),
+ ('nFileIndexLow', rwin32.DWORD)])
+
+ config = platform.configure(CConfig)
+
+ def external(*args, **kwargs):
+ kwargs['compilation_info'] = CConfig._compilation_info_
+ llfunc = rffi.llexternal(calling_conv='win', *args, **kwargs)
+ return staticmethod(llfunc)
+
+ class Win32Traits:
+ apisuffix = suffix
+
+ 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
+ FILE_WRITE_ATTRIBUTES OPEN_EXISTING
FILE_FLAG_BACKUP_SEMANTICS
+ VOLUME_NAME_DOS VOLUME_NAME_NT
+ ERROR_FILE_NOT_FOUND ERROR_NO_MORE_FILES
+ ERROR_SHARING_VIOLATION
+ '''.split():
+ locals()[name] = config[name]
+ LPWIN32_FIND_DATA = lltype.Ptr(WIN32_FIND_DATA)
+ GET_FILEEX_INFO_LEVELS = rffi.ULONG # an enumeration
+
+ FindFirstFile = external('FindFirstFile' + suffix,
+ [traits.CCHARP, LPWIN32_FIND_DATA],
+ rwin32.HANDLE)
+ FindNextFile = external('FindNextFile' + suffix,
+ [rwin32.HANDLE, LPWIN32_FIND_DATA],
+ rwin32.BOOL)
+ FindClose = external('FindClose',
+ [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,
+ lltype.Ptr(WIN32_FILE_ATTRIBUTE_DATA)],
+ rwin32.BOOL)
+
+ GetFileInformationByHandle = external(
+ 'GetFileInformationByHandle',
+ [rwin32.HANDLE, lltype.Ptr(BY_HANDLE_FILE_INFORMATION)],
+ rwin32.BOOL)
+
+ GetFileType = external(
+ 'GetFileType',
+ [rwin32.HANDLE],
+ rwin32.DWORD)
+
+ LPSTRP = rffi.CArrayPtr(traits.CCHARP)
+
+ GetFullPathName = external(
+ 'GetFullPathName' + suffix,
+ [traits.CCHARP, rwin32.DWORD,
+ traits.CCHARP, LPSTRP],
+ rwin32.DWORD)
+
+ GetCurrentDirectory = external(
+ 'GetCurrentDirectory' + suffix,
+ [rwin32.DWORD, traits.CCHARP],
+ rwin32.DWORD)
+
+ SetCurrentDirectory = external(
+ 'SetCurrentDirectory' + suffix,
+ [traits.CCHARP],
+ rwin32.BOOL)
+
+ CreateDirectory = external(
+ 'CreateDirectory' + suffix,
+ [traits.CCHARP, rffi.VOIDP],
+ rwin32.BOOL)
+
+ SetEnvironmentVariable = external(
+ 'SetEnvironmentVariable' + suffix,
+ [traits.CCHARP, traits.CCHARP],
+ rwin32.BOOL)
+
+ CreateFile = external(
+ 'CreateFile' + apisuffix,
+ [traits.CCHARP, rwin32.DWORD, rwin32.DWORD,
+ rwin32.LPSECURITY_ATTRIBUTES, rwin32.DWORD, rwin32.DWORD,
+ rwin32.HANDLE],
+ rwin32.HANDLE)
+
+ DeleteFile = external(
+ 'DeleteFile' + suffix,
+ [traits.CCHARP],
+ rwin32.BOOL)
+
+ MoveFile = external(
+ 'MoveFile' + suffix,
+ [traits.CCHARP, traits.CCHARP],
+ rwin32.BOOL)
+
+ return Win32Traits
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
@@ -247,104 +247,6 @@
return extdef([int], int, llimpl=c_func_llimpl,
export_name='ll_os.ll_os_' + name)
- @registering_str_unicode(os.utime)
- def register_os_utime(self, traits):
- UTIMBUFP = lltype.Ptr(self.UTIMBUF)
- os_utime = self.llexternal('utime', [rffi.CCHARP, UTIMBUFP], rffi.INT)
-
- if not _WIN32:
- includes = ['sys/time.h']
- else:
- includes = ['time.h']
- eci = ExternalCompilationInfo(includes=includes)
-
- class CConfig:
- _compilation_info_ = eci
- HAVE_UTIMES = platform.Has('utimes')
- config = platform.configure(CConfig)
-
- # XXX note that on Windows, calls to os.utime() are ignored on
- # directories. Remove that hack over there once it's fixed here!
-
- if config['HAVE_UTIMES']:
- class CConfig:
- _compilation_info_ = eci
- TIMEVAL = platform.Struct('struct timeval', [('tv_sec',
rffi.LONG),
- ('tv_usec',
rffi.LONG)])
- config = platform.configure(CConfig)
- TIMEVAL = config['TIMEVAL']
- TIMEVAL2P = rffi.CArrayPtr(TIMEVAL)
- os_utimes = self.llexternal('utimes', [rffi.CCHARP, TIMEVAL2P],
- rffi.INT, compilation_info=eci)
-
- def os_utime_platform(path, actime, modtime):
- import math
- l_times = lltype.malloc(TIMEVAL2P.TO, 2, flavor='raw')
- fracpart, intpart = math.modf(actime)
- rffi.setintfield(l_times[0], 'c_tv_sec', int(intpart))
- rffi.setintfield(l_times[0], 'c_tv_usec', int(fracpart * 1E6))
- fracpart, intpart = math.modf(modtime)
- rffi.setintfield(l_times[1], 'c_tv_sec', int(intpart))
- rffi.setintfield(l_times[1], 'c_tv_usec', int(fracpart * 1E6))
- error = os_utimes(path, l_times)
- lltype.free(l_times, flavor='raw')
- return error
- else:
- # we only have utime(), which does not allow sub-second resolution
- def os_utime_platform(path, actime, modtime):
- l_utimbuf = lltype.malloc(UTIMBUFP.TO, flavor='raw')
- l_utimbuf.c_actime = rffi.r_time_t(actime)
- l_utimbuf.c_modtime = rffi.r_time_t(modtime)
- error = os_utime(path, l_utimbuf)
- lltype.free(l_utimbuf, flavor='raw')
- return error
-
- # NB. this function is specialized; we get one version where
- # tp is known to be None, and one version where it is known
- # to be a tuple of 2 floats.
- if not _WIN32:
- assert traits.str is str
-
- @specialize.argtype(1)
- def os_utime_llimpl(path, tp):
- if tp is None:
- error = os_utime(path, lltype.nullptr(UTIMBUFP.TO))
- else:
- actime, modtime = tp
- error = os_utime_platform(path, actime, modtime)
- error = rffi.cast(lltype.Signed, error)
- if error == -1:
- raise OSError(rposix.get_errno(), "os_utime failed")
- else:
- from rpython.rtyper.module.ll_win32file import make_utime_impl
- os_utime_llimpl = make_utime_impl(traits)
-
- s_tuple_of_2_floats = SomeTuple([SomeFloat(), SomeFloat()])
-
- def os_utime_normalize_args(s_path, s_times):
- # special handling of the arguments: they can be either
- # [str, (float, float)] or [str, s_None], and get normalized
- # to exactly one of these two.
- if not traits.str0.contains(s_path):
- raise Exception("os.utime() arg 1 must be a string, got %s" % (
- s_path,))
- case1 = s_None.contains(s_times)
- case2 = s_tuple_of_2_floats.contains(s_times)
- if case1 and case2:
- return [traits.str0, s_ImpossibleValue] #don't know which case
yet
- elif case1:
- return [traits.str0, s_None]
- elif case2:
- return [traits.str0, s_tuple_of_2_floats]
- else:
- raise Exception("os.utime() arg 2 must be None or a tuple of "
- "2 floats, got %s" % (s_times,))
- os_utime_normalize_args._default_signature_ = [traits.str0, None]
-
- return extdef(os_utime_normalize_args, s_None,
- "ll_os.ll_os_utime",
- llimpl=os_utime_llimpl)
-
@registering(os.times)
def register_os_times(self):
if sys.platform.startswith('win'):
@@ -1357,7 +1259,7 @@
raise OSError(rposix.get_errno(), "os_unlink failed")
if sys.platform == 'win32':
- from rpython.rtyper.module.ll_win32file import make_win32_traits
+ from rpython.rlib.rwin32file import make_win32_traits
win32traits = make_win32_traits(traits)
@func_renamer('unlink_llimpl_%s' % traits.str.__name__)
@@ -1392,7 +1294,7 @@
[traits.CCHARP, rffi.MODE_T], rffi.INT)
if sys.platform == 'win32':
- from rpython.rtyper.module.ll_win32file import make_win32_traits
+ from rpython.rlib.rwin32file import make_win32_traits
win32traits = make_win32_traits(traits)
@func_renamer('mkdir_llimpl_%s' % traits.str.__name__)
@@ -1464,7 +1366,7 @@
raise OSError(rposix.get_errno(), "os_rename failed")
if sys.platform == 'win32':
- from rpython.rtyper.module.ll_win32file import make_win32_traits
+ from rpython.rlib.rwin32file import make_win32_traits
win32traits = make_win32_traits(traits)
@func_renamer('rename_llimpl_%s' % traits.str.__name__)
diff --git a/rpython/rtyper/module/ll_os_stat.py
b/rpython/rtyper/module/ll_os_stat.py
--- a/rpython/rtyper/module/ll_os_stat.py
+++ b/rpython/rtyper/module/ll_os_stat.py
@@ -440,7 +440,7 @@
def make_win32_stat_impl(name, traits):
from rpython.rlib import rwin32
- from rpython.rtyper.module.ll_win32file import make_win32_traits
+ from rpython.rlib.rwin32file import make_win32_traits
win32traits = make_win32_traits(traits)
# The CRT of Windows has a number of flaws wrt. its stat() implementation:
diff --git a/rpython/rtyper/module/ll_win32file.py
b/rpython/rtyper/module/ll_win32file.py
--- a/rpython/rtyper/module/ll_win32file.py
+++ b/rpython/rtyper/module/ll_win32file.py
@@ -10,195 +10,14 @@
from rpython.tool.sourcetools import func_renamer
from rpython.rlib.objectmodel import specialize
-def make_win32_traits(traits):
- from rpython.rlib import rwin32
-
- if traits.str is unicode:
- suffix = 'W'
- else:
- suffix = 'A'
-
- class CConfig:
- _compilation_info_ = ExternalCompilationInfo(
- includes = ['windows.h', 'winbase.h', 'sys/stat.h'],
- )
- WIN32_FIND_DATA = platform.Struct(
- 'struct _WIN32_FIND_DATA' + suffix,
- # Only interesting fields
- [('dwFileAttributes', rwin32.DWORD),
- ('nFileSizeHigh', rwin32.DWORD),
- ('nFileSizeLow', rwin32.DWORD),
- ('ftCreationTime', rwin32.FILETIME),
- ('ftLastAccessTime', rwin32.FILETIME),
- ('ftLastWriteTime', rwin32.FILETIME),
- ('cFileName', lltype.FixedSizeArray(traits.CHAR, 250))])
- ERROR_FILE_NOT_FOUND = platform.ConstantInteger(
- 'ERROR_FILE_NOT_FOUND')
- ERROR_NO_MORE_FILES = platform.ConstantInteger(
- 'ERROR_NO_MORE_FILES')
-
- GetFileExInfoStandard = platform.ConstantInteger(
- 'GetFileExInfoStandard')
- FILE_ATTRIBUTE_DIRECTORY = platform.ConstantInteger(
- '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')
- _S_IFREG = platform.ConstantInteger('_S_IFREG')
- _S_IFCHR = platform.ConstantInteger('_S_IFCHR')
- _S_IFIFO = platform.ConstantInteger('_S_IFIFO')
- FILE_TYPE_UNKNOWN = platform.ConstantInteger('FILE_TYPE_UNKNOWN')
- FILE_TYPE_CHAR = platform.ConstantInteger('FILE_TYPE_CHAR')
- FILE_TYPE_PIPE = platform.ConstantInteger('FILE_TYPE_PIPE')
-
- FILE_WRITE_ATTRIBUTES = platform.ConstantInteger(
- 'FILE_WRITE_ATTRIBUTES')
- OPEN_EXISTING = platform.ConstantInteger(
- 'OPEN_EXISTING')
- FILE_FLAG_BACKUP_SEMANTICS = platform.ConstantInteger(
- 'FILE_FLAG_BACKUP_SEMANTICS')
- VOLUME_NAME_DOS = platform.ConstantInteger('VOLUME_NAME_DOS')
- VOLUME_NAME_NT = platform.ConstantInteger('VOLUME_NAME_NT')
-
- WIN32_FILE_ATTRIBUTE_DATA = platform.Struct(
- 'WIN32_FILE_ATTRIBUTE_DATA',
- [('dwFileAttributes', rwin32.DWORD),
- ('nFileSizeHigh', rwin32.DWORD),
- ('nFileSizeLow', rwin32.DWORD),
- ('ftCreationTime', rwin32.FILETIME),
- ('ftLastAccessTime', rwin32.FILETIME),
- ('ftLastWriteTime', rwin32.FILETIME)])
-
- BY_HANDLE_FILE_INFORMATION = platform.Struct(
- 'BY_HANDLE_FILE_INFORMATION',
- [('dwFileAttributes', rwin32.DWORD),
- ('ftCreationTime', rwin32.FILETIME),
- ('ftLastAccessTime', rwin32.FILETIME),
- ('ftLastWriteTime', rwin32.FILETIME),
- ('dwVolumeSerialNumber', rwin32.DWORD),
- ('nFileSizeHigh', rwin32.DWORD),
- ('nFileSizeLow', rwin32.DWORD),
- ('nNumberOfLinks', rwin32.DWORD),
- ('nFileIndexHigh', rwin32.DWORD),
- ('nFileIndexLow', rwin32.DWORD)])
-
- config = platform.configure(CConfig)
-
- def external(*args, **kwargs):
- kwargs['compilation_info'] = CConfig._compilation_info_
- llfunc = rffi.llexternal(calling_conv='win', *args, **kwargs)
- return staticmethod(llfunc)
-
- class Win32Traits:
- apisuffix = suffix
-
- 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
- FILE_WRITE_ATTRIBUTES OPEN_EXISTING
FILE_FLAG_BACKUP_SEMANTICS
- VOLUME_NAME_DOS VOLUME_NAME_NT
- ERROR_FILE_NOT_FOUND ERROR_NO_MORE_FILES
- ERROR_SHARING_VIOLATION
- '''.split():
- locals()[name] = config[name]
- LPWIN32_FIND_DATA = lltype.Ptr(WIN32_FIND_DATA)
- GET_FILEEX_INFO_LEVELS = rffi.ULONG # an enumeration
-
- FindFirstFile = external('FindFirstFile' + suffix,
- [traits.CCHARP, LPWIN32_FIND_DATA],
- rwin32.HANDLE)
- FindNextFile = external('FindNextFile' + suffix,
- [rwin32.HANDLE, LPWIN32_FIND_DATA],
- rwin32.BOOL)
- FindClose = external('FindClose',
- [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,
- lltype.Ptr(WIN32_FILE_ATTRIBUTE_DATA)],
- rwin32.BOOL)
-
- GetFileInformationByHandle = external(
- 'GetFileInformationByHandle',
- [rwin32.HANDLE, lltype.Ptr(BY_HANDLE_FILE_INFORMATION)],
- rwin32.BOOL)
-
- GetFileType = external(
- 'GetFileType',
- [rwin32.HANDLE],
- rwin32.DWORD)
-
- LPSTRP = rffi.CArrayPtr(traits.CCHARP)
-
- GetFullPathName = external(
- 'GetFullPathName' + suffix,
- [traits.CCHARP, rwin32.DWORD,
- traits.CCHARP, LPSTRP],
- rwin32.DWORD)
-
- GetCurrentDirectory = external(
- 'GetCurrentDirectory' + suffix,
- [rwin32.DWORD, traits.CCHARP],
- rwin32.DWORD)
-
- SetCurrentDirectory = external(
- 'SetCurrentDirectory' + suffix,
- [traits.CCHARP],
- rwin32.BOOL)
-
- CreateDirectory = external(
- 'CreateDirectory' + suffix,
- [traits.CCHARP, rffi.VOIDP],
- rwin32.BOOL)
-
- SetEnvironmentVariable = external(
- 'SetEnvironmentVariable' + suffix,
- [traits.CCHARP, traits.CCHARP],
- rwin32.BOOL)
-
- CreateFile = external(
- 'CreateFile' + apisuffix,
- [traits.CCHARP, rwin32.DWORD, rwin32.DWORD,
- rwin32.LPSECURITY_ATTRIBUTES, rwin32.DWORD, rwin32.DWORD,
- rwin32.HANDLE],
- rwin32.HANDLE)
-
- DeleteFile = external(
- 'DeleteFile' + suffix,
- [traits.CCHARP],
- rwin32.BOOL)
-
- MoveFile = external(
- 'MoveFile' + suffix,
- [traits.CCHARP, traits.CCHARP],
- rwin32.BOOL)
-
- return Win32Traits
#_______________________________________________________________
# listdir
def make_listdir_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:
@@ -256,6 +75,8 @@
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:
@@ -310,6 +131,8 @@
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__)
@@ -349,65 +172,3 @@
lltype.free(lpBuffer, flavor='raw')
return getfullpathname_llimpl
-
-def make_utime_impl(traits):
- from rpython.rlib import rwin32
- win32traits = make_win32_traits(traits)
- from rpython.rtyper.module.ll_os_stat import time_t_to_FILE_TIME
-
- GetSystemTime = rffi.llexternal(
- 'GetSystemTime',
- [lltype.Ptr(rwin32.SYSTEMTIME)],
- lltype.Void,
- calling_conv='win')
-
- SystemTimeToFileTime = rffi.llexternal(
- 'SystemTimeToFileTime',
- [lltype.Ptr(rwin32.SYSTEMTIME),
- lltype.Ptr(rwin32.FILETIME)],
- rwin32.BOOL,
- calling_conv='win')
-
- SetFileTime = rffi.llexternal(
- 'SetFileTime',
- [rwin32.HANDLE,
- lltype.Ptr(rwin32.FILETIME),
- lltype.Ptr(rwin32.FILETIME),
- lltype.Ptr(rwin32.FILETIME)],
- rwin32.BOOL,
- calling_conv = 'win')
-
- @specialize.argtype(1)
- def os_utime_llimpl(path, tp):
- hFile = win32traits.CreateFile(path,
- win32traits.FILE_WRITE_ATTRIBUTES, 0,
- None, win32traits.OPEN_EXISTING,
- win32traits.FILE_FLAG_BACKUP_SEMANTICS,
- rwin32.NULL_HANDLE)
- if hFile == rwin32.INVALID_HANDLE_VALUE:
- raise rwin32.lastWindowsError()
- ctime = lltype.nullptr(rwin32.FILETIME)
- atime = lltype.malloc(rwin32.FILETIME, flavor='raw')
- mtime = lltype.malloc(rwin32.FILETIME, flavor='raw')
- try:
- if tp is None:
- now = lltype.malloc(rwin32.SYSTEMTIME, flavor='raw')
- try:
- GetSystemTime(now)
- if (not SystemTimeToFileTime(now, atime) or
- not SystemTimeToFileTime(now, mtime)):
- raise rwin32.lastWindowsError()
- finally:
- lltype.free(now, flavor='raw')
- else:
- actime, modtime = tp
- time_t_to_FILE_TIME(actime, atime)
- time_t_to_FILE_TIME(modtime, mtime)
- if not SetFileTime(hFile, ctime, atime, mtime):
- raise rwin32.lastWindowsError()
- finally:
- rwin32.CloseHandle(hFile)
- lltype.free(atime, flavor='raw')
- lltype.free(mtime, flavor='raw')
-
- return os_utime_llimpl
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit