mercurial/pure/osutil.py
branchstable
changeset 16474 ee553e6cd8c4
parent 15040 a494b54b6ed3
child 16686 67964cda8701
equal deleted inserted replaced
16473:7adc521259d4 16474:ee553e6cd8c4
    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)