equal
deleted
inserted
replaced
56 return result |
56 return result |
57 |
57 |
58 if os.name != 'nt': |
58 if os.name != 'nt': |
59 posixfile = open |
59 posixfile = open |
60 else: |
60 else: |
61 import ctypes, ctypes.util |
61 import ctypes, msvcrt |
62 |
62 |
63 _kernel32 = ctypes.windll.kernel32 |
63 _kernel32 = ctypes.windll.kernel32 |
64 |
64 |
65 _DWORD = ctypes.c_ulong |
65 _DWORD = ctypes.c_ulong |
66 _LPCSTR = _LPSTR = ctypes.c_char_p |
66 _LPCSTR = _LPSTR = ctypes.c_char_p |
67 _HANDLE = ctypes.c_void_p |
67 _HANDLE = ctypes.c_void_p |
68 |
68 |
69 _INVALID_HANDLE_VALUE = _HANDLE(-1).value |
69 _INVALID_HANDLE_VALUE = _HANDLE(-1).value |
70 |
|
71 def _crtname(): |
|
72 try: |
|
73 # find_msvcrt was introduced in Python 2.6 |
|
74 return ctypes.util.find_msvcrt() |
|
75 except AttributeError: |
|
76 return 'msvcr71.dll' # CPython 2.5 and 2.4 |
|
77 |
|
78 _crt = ctypes.PyDLL(_crtname()) |
|
79 |
70 |
80 # CreateFile |
71 # CreateFile |
81 _FILE_SHARE_READ = 0x00000001 |
72 _FILE_SHARE_READ = 0x00000001 |
82 _FILE_SHARE_WRITE = 0x00000002 |
73 _FILE_SHARE_WRITE = 0x00000002 |
83 _FILE_SHARE_DELETE = 0x00000004 |
74 _FILE_SHARE_DELETE = 0x00000004 |
102 # types of parameters of C functions used (required by pypy) |
93 # types of parameters of C functions used (required by pypy) |
103 |
94 |
104 _kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p, |
95 _kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p, |
105 _DWORD, _DWORD, _HANDLE] |
96 _DWORD, _DWORD, _HANDLE] |
106 _kernel32.CreateFileA.restype = _HANDLE |
97 _kernel32.CreateFileA.restype = _HANDLE |
107 |
|
108 _crt._open_osfhandle.argtypes = [_HANDLE, ctypes.c_int] |
|
109 _crt._open_osfhandle.restype = ctypes.c_int |
|
110 |
98 |
111 def _raiseioerror(name): |
99 def _raiseioerror(name): |
112 err = ctypes.WinError() |
100 err = ctypes.WinError() |
113 raise IOError(err.errno, '%s: %s' % (name, err.strerror)) |
101 raise IOError(err.errno, '%s: %s' % (name, err.strerror)) |
114 |
102 |
154 _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE, |
142 _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE, |
155 None, creation, _FILE_ATTRIBUTE_NORMAL, None) |
143 None, creation, _FILE_ATTRIBUTE_NORMAL, None) |
156 if fh == _INVALID_HANDLE_VALUE: |
144 if fh == _INVALID_HANDLE_VALUE: |
157 _raiseioerror(name) |
145 _raiseioerror(name) |
158 |
146 |
159 # for CPython we must use the same CRT as Python uses, |
147 fd = msvcrt.open_osfhandle(fh, flags) |
160 # or the os.fdopen call below will abort with |
|
161 # "OSError: [Errno 9] Bad file descriptor" |
|
162 fd = _crt._open_osfhandle(fh, flags) |
|
163 if fd == -1: |
148 if fd == -1: |
164 _kernel32.CloseHandle(fh) |
149 _kernel32.CloseHandle(fh) |
165 _raiseioerror(name) |
150 _raiseioerror(name) |
166 |
151 |
167 f = os.fdopen(fd, mode, bufsize) |
152 f = os.fdopen(fd, mode, bufsize) |