pure/osutil: use Python's msvcrt module (issue3380) stable
authorAdrian Buehlmann <adrian@cadifra.com>
Thu, 19 Apr 2012 17:08:12 +0200
branchstable
changeset 16474 ee553e6cd8c4
parent 16473 7adc521259d4
child 16475 1f75c1decdeb
child 16479 fc04698fa778
pure/osutil: use Python's msvcrt module (issue3380) As proposed by Christophe Gouiran <christophe.gouiran@eurocopter.com>
mercurial/pure/osutil.py
--- a/mercurial/pure/osutil.py	Thu Apr 19 18:11:48 2012 +0300
+++ b/mercurial/pure/osutil.py	Thu Apr 19 17:08:12 2012 +0200
@@ -58,7 +58,7 @@
 if os.name != 'nt':
     posixfile = open
 else:
-    import ctypes, ctypes.util
+    import ctypes, msvcrt
 
     _kernel32 = ctypes.windll.kernel32
 
@@ -68,15 +68,6 @@
 
     _INVALID_HANDLE_VALUE = _HANDLE(-1).value
 
-    def _crtname():
-        try:
-            # find_msvcrt was introduced in Python 2.6
-            return ctypes.util.find_msvcrt()
-        except AttributeError:
-            return 'msvcr71.dll' # CPython 2.5 and 2.4
-
-    _crt = ctypes.PyDLL(_crtname())
-
     # CreateFile 
     _FILE_SHARE_READ = 0x00000001
     _FILE_SHARE_WRITE = 0x00000002
@@ -105,9 +96,6 @@
         _DWORD, _DWORD, _HANDLE]
     _kernel32.CreateFileA.restype = _HANDLE
 
-    _crt._open_osfhandle.argtypes = [_HANDLE, ctypes.c_int]
-    _crt._open_osfhandle.restype = ctypes.c_int
-
     def _raiseioerror(name):
         err = ctypes.WinError()
         raise IOError(err.errno, '%s: %s' % (name, err.strerror))
@@ -156,10 +144,7 @@
             if fh == _INVALID_HANDLE_VALUE:
                 _raiseioerror(name)
 
-            # for CPython we must use the same CRT as Python uses,
-            # or the os.fdopen call below will abort with
-            #   "OSError: [Errno 9] Bad file descriptor"
-            fd = _crt._open_osfhandle(fh, flags)
+            fd = msvcrt.open_osfhandle(fh, flags)
             if fd == -1:
                 _kernel32.CloseHandle(fh)
                 _raiseioerror(name)