annotate mercurial/win32.py @ 41138:8ddc5d8bea25

tests: support passing testcase after .t paths that have path separators This probably could have been implemented by changing the regex above this bit of code, but I wasn't sure if it would end up handling various OSes correctly, so I decided to go with this version instead. Previously: $ tests/run-tests.py tests/test-ssh.t -l running 2 tests using 2 parallel processes .. # Ran 2 tests, 0 skipped, 0 failed. $ tests/run-tests.py tests/test-ssh.t#sshv1 -l running 0 tests using 0 parallel processes # Ran 0 tests, 0 skipped, 0 failed. Now: $ tests/run-tests.py tests/test-ssh.t -l running 2 tests using 2 parallel processes .. # Ran 2 tests, 0 skipped, 0 failed. $ tests/run-tests.py tests/test-ssh.t#sshv1 -l running 1 tests using 1 parallel processes . # Ran 1 tests, 0 skipped, 0 failed. Differential Revision: https://phab.mercurial-scm.org/D5535
author Kyle Lippincott <spectral@google.com>
date Tue, 08 Jan 2019 17:52:39 -0800
parents 576474baa209
children 2372284d9457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
1 # win32.py - utility functions that use win32 API
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
2 #
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
4 #
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10219
diff changeset
6 # GNU General Public License version 2 or any later version.
8227
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
7
25994
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
8 from __future__ import absolute_import
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
9
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
10 import ctypes
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
11 import ctypes.wintypes as wintypes
25994
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
12 import errno
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
13 import msvcrt
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
14 import os
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
15 import random
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
16 import subprocess
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
17
30667
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
18 from . import (
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
19 encoding,
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
20 pycompat,
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
21 )
30637
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30314
diff changeset
22
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
23 _kernel32 = ctypes.windll.kernel32
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
24 _advapi32 = ctypes.windll.advapi32
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
25 _user32 = ctypes.windll.user32
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
26 _crypt32 = ctypes.windll.crypt32
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
27
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
28 _BOOL = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
29 _WORD = ctypes.c_ushort
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
30 _DWORD = ctypes.c_ulong
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
31 _UINT = ctypes.c_uint
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
32 _LONG = ctypes.c_long
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
33 _LPCSTR = _LPSTR = ctypes.c_char_p
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
34 _HANDLE = ctypes.c_void_p
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
35 _HWND = _HANDLE
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
36 _PCCERT_CONTEXT = ctypes.c_void_p
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
37 _MAX_PATH = wintypes.MAX_PATH
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
38
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
39 _INVALID_HANDLE_VALUE = _HANDLE(-1).value
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
40
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
41 # GetLastError
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
42 _ERROR_SUCCESS = 0
21193
07f9825865de win32: add missing definition of _ERROR_NO_MORE_FILES caught by pyflakes
Yuya Nishihara <yuya@tcha.org>
parents: 20528
diff changeset
43 _ERROR_NO_MORE_FILES = 18
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
44 _ERROR_INVALID_PARAMETER = 87
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
45 _ERROR_BROKEN_PIPE = 109
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
46 _ERROR_INSUFFICIENT_BUFFER = 122
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
47 _ERROR_NO_DATA = 232
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
48
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
49 # WPARAM is defined as UINT_PTR (unsigned type)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
50 # LPARAM is defined as LONG_PTR (signed type)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
51 if ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
52 _WPARAM = ctypes.c_ulong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
53 _LPARAM = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
54 elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
55 _WPARAM = ctypes.c_ulonglong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
56 _LPARAM = ctypes.c_longlong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
57
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
58 class _FILETIME(ctypes.Structure):
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
59 _fields_ = [(r'dwLowDateTime', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
60 (r'dwHighDateTime', _DWORD)]
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
61
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
62 class _BY_HANDLE_FILE_INFORMATION(ctypes.Structure):
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
63 _fields_ = [(r'dwFileAttributes', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
64 (r'ftCreationTime', _FILETIME),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
65 (r'ftLastAccessTime', _FILETIME),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
66 (r'ftLastWriteTime', _FILETIME),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
67 (r'dwVolumeSerialNumber', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
68 (r'nFileSizeHigh', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
69 (r'nFileSizeLow', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
70 (r'nNumberOfLinks', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
71 (r'nFileIndexHigh', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
72 (r'nFileIndexLow', _DWORD)]
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
73
18959
2f6418d8a4c9 check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents: 18175
diff changeset
74 # CreateFile
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
75 _FILE_SHARE_READ = 0x00000001
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
76 _FILE_SHARE_WRITE = 0x00000002
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
77 _FILE_SHARE_DELETE = 0x00000004
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
78
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
79 _OPEN_EXISTING = 3
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
80
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
81 _FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
82
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
83 # SetFileAttributes
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
84 _FILE_ATTRIBUTE_NORMAL = 0x80
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
85 _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
86
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
87 # Process Security and Access Rights
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
88 _PROCESS_QUERY_INFORMATION = 0x0400
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
89
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
90 # GetExitCodeProcess
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
91 _STILL_ACTIVE = 259
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
92
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
93 class _STARTUPINFO(ctypes.Structure):
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
94 _fields_ = [(r'cb', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
95 (r'lpReserved', _LPSTR),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
96 (r'lpDesktop', _LPSTR),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
97 (r'lpTitle', _LPSTR),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
98 (r'dwX', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
99 (r'dwY', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
100 (r'dwXSize', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
101 (r'dwYSize', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
102 (r'dwXCountChars', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
103 (r'dwYCountChars', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
104 (r'dwFillAttribute', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
105 (r'dwFlags', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
106 (r'wShowWindow', _WORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
107 (r'cbReserved2', _WORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
108 (r'lpReserved2', ctypes.c_char_p),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
109 (r'hStdInput', _HANDLE),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
110 (r'hStdOutput', _HANDLE),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
111 (r'hStdError', _HANDLE)]
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
112
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
113 class _PROCESS_INFORMATION(ctypes.Structure):
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
114 _fields_ = [(r'hProcess', _HANDLE),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
115 (r'hThread', _HANDLE),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
116 (r'dwProcessId', _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
117 (r'dwThreadId', _DWORD)]
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
118
17050
e780fb37168b win32: specify _CREATE_NO_WINDOW on spawndetached()
Adrian Buehlmann <adrian@cadifra.com>
parents: 17006
diff changeset
119 _CREATE_NO_WINDOW = 0x08000000
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
120 _SW_HIDE = 0
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
121
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
122 class _COORD(ctypes.Structure):
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
123 _fields_ = [(r'X', ctypes.c_short),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
124 (r'Y', ctypes.c_short)]
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
125
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
126 class _SMALL_RECT(ctypes.Structure):
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
127 _fields_ = [(r'Left', ctypes.c_short),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
128 (r'Top', ctypes.c_short),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
129 (r'Right', ctypes.c_short),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
130 (r'Bottom', ctypes.c_short)]
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
131
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
132 class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
133 _fields_ = [(r'dwSize', _COORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
134 (r'dwCursorPosition', _COORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
135 (r'wAttributes', _WORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
136 (r'srWindow', _SMALL_RECT),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
137 (r'dwMaximumWindowSize', _COORD)]
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
138
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
139 _STD_OUTPUT_HANDLE = _DWORD(-11).value
14344
e1db8a00188b win32.py: more explicit definition of _STD_ERROR_HANDLE
Adrian Buehlmann <adrian@cadifra.com>
parents: 14237
diff changeset
140 _STD_ERROR_HANDLE = _DWORD(-12).value
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
141
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
142 # CERT_TRUST_STATUS dwErrorStatus
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
143 CERT_TRUST_IS_PARTIAL_CHAIN = 0x10000
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
144
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
145 # CertCreateCertificateContext encodings
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
146 X509_ASN_ENCODING = 0x00000001
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
147 PKCS_7_ASN_ENCODING = 0x00010000
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
148
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
149 # These structs are only complete enough to achieve what we need.
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
150 class CERT_CHAIN_CONTEXT(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
151 _fields_ = (
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
152 (r"cbSize", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
153
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
154 # CERT_TRUST_STATUS struct
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
155 (r"dwErrorStatus", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
156 (r"dwInfoStatus", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
157
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
158 (r"cChain", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
159 (r"rgpChain", ctypes.c_void_p),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
160 (r"cLowerQualityChainContext", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
161 (r"rgpLowerQualityChainContext", ctypes.c_void_p),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
162 (r"fHasRevocationFreshnessTime", _BOOL),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
163 (r"dwRevocationFreshnessTime", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
164 )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
165
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
166 class CERT_USAGE_MATCH(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
167 _fields_ = (
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
168 (r"dwType", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
169
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
170 # CERT_ENHKEY_USAGE struct
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
171 (r"cUsageIdentifier", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
172 (r"rgpszUsageIdentifier", ctypes.c_void_p), # LPSTR *
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
173 )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
174
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
175 class CERT_CHAIN_PARA(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
176 _fields_ = (
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
177 (r"cbSize", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
178 (r"RequestedUsage", CERT_USAGE_MATCH),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
179 (r"RequestedIssuancePolicy", CERT_USAGE_MATCH),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
180 (r"dwUrlRetrievalTimeout", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
181 (r"fCheckRevocationFreshnessTime", _BOOL),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
182 (r"dwRevocationFreshnessTime", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
183 (r"pftCacheResync", ctypes.c_void_p), # LPFILETIME
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
184 (r"pStrongSignPara", ctypes.c_void_p), # PCCERT_STRONG_SIGN_PARA
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
185 (r"dwStrongSignFlags", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
186 )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
187
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
188 # types of parameters of C functions used (required by pypy)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
189
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
190 _crypt32.CertCreateCertificateContext.argtypes = [_DWORD, # cert encoding
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
191 ctypes.c_char_p, # cert
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
192 _DWORD] # cert size
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
193 _crypt32.CertCreateCertificateContext.restype = _PCCERT_CONTEXT
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
194
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
195 _crypt32.CertGetCertificateChain.argtypes = [
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
196 ctypes.c_void_p, # HCERTCHAINENGINE
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
197 _PCCERT_CONTEXT,
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
198 ctypes.c_void_p, # LPFILETIME
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
199 ctypes.c_void_p, # HCERTSTORE
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
200 ctypes.c_void_p, # PCERT_CHAIN_PARA
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
201 _DWORD,
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
202 ctypes.c_void_p, # LPVOID
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
203 ctypes.c_void_p # PCCERT_CHAIN_CONTEXT *
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
204 ]
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
205 _crypt32.CertGetCertificateChain.restype = _BOOL
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
206
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
207 _crypt32.CertFreeCertificateContext.argtypes = [_PCCERT_CONTEXT]
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
208 _crypt32.CertFreeCertificateContext.restype = _BOOL
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
209
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
210 _kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p,
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
211 _DWORD, _DWORD, _HANDLE]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
212 _kernel32.CreateFileA.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
213
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
214 _kernel32.GetFileInformationByHandle.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
215 _kernel32.GetFileInformationByHandle.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
216
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
217 _kernel32.CloseHandle.argtypes = [_HANDLE]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
218 _kernel32.CloseHandle.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
219
15095
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
220 try:
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
221 _kernel32.CreateHardLinkA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p]
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
222 _kernel32.CreateHardLinkA.restype = _BOOL
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
223 except AttributeError:
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
224 pass
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
225
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
226 _kernel32.SetFileAttributesA.argtypes = [_LPCSTR, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
227 _kernel32.SetFileAttributesA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
228
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
229 _DRIVE_UNKNOWN = 0
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
230 _DRIVE_NO_ROOT_DIR = 1
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
231 _DRIVE_REMOVABLE = 2
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
232 _DRIVE_FIXED = 3
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
233 _DRIVE_REMOTE = 4
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
234 _DRIVE_CDROM = 5
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
235 _DRIVE_RAMDISK = 6
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
236
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
237 _kernel32.GetDriveTypeA.argtypes = [_LPCSTR]
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
238 _kernel32.GetDriveTypeA.restype = _UINT
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
239
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
240 _kernel32.GetVolumeInformationA.argtypes = [_LPCSTR, ctypes.c_void_p, _DWORD,
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
241 ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, _DWORD]
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
242 _kernel32.GetVolumeInformationA.restype = _BOOL
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
243
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
244 _kernel32.GetVolumePathNameA.argtypes = [_LPCSTR, ctypes.c_void_p, _DWORD]
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
245 _kernel32.GetVolumePathNameA.restype = _BOOL
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
246
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
247 _kernel32.OpenProcess.argtypes = [_DWORD, _BOOL, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
248 _kernel32.OpenProcess.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
249
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
250 _kernel32.GetExitCodeProcess.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
251 _kernel32.GetExitCodeProcess.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
252
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
253 _kernel32.GetLastError.argtypes = []
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
254 _kernel32.GetLastError.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
255
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
256 _kernel32.GetModuleFileNameA.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
257 _kernel32.GetModuleFileNameA.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
258
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
259 _kernel32.CreateProcessA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p,
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
260 ctypes.c_void_p, _BOOL, _DWORD, ctypes.c_void_p, _LPCSTR, ctypes.c_void_p,
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
261 ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
262 _kernel32.CreateProcessA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
263
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
264 _kernel32.ExitProcess.argtypes = [_UINT]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
265 _kernel32.ExitProcess.restype = None
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
266
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
267 _kernel32.GetCurrentProcessId.argtypes = []
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
268 _kernel32.GetCurrentProcessId.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
269
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
270 _SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
271 _kernel32.SetConsoleCtrlHandler.argtypes = [_SIGNAL_HANDLER, _BOOL]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
272 _kernel32.SetConsoleCtrlHandler.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
273
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
274 _kernel32.SetConsoleMode.argtypes = [_HANDLE, _DWORD]
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
275 _kernel32.SetConsoleMode.restype = _BOOL
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
276
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
277 _kernel32.GetConsoleMode.argtypes = [_HANDLE, ctypes.c_void_p]
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
278 _kernel32.GetConsoleMode.restype = _BOOL
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
279
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
280 _kernel32.GetStdHandle.argtypes = [_DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
281 _kernel32.GetStdHandle.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
282
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
283 _kernel32.GetConsoleScreenBufferInfo.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
284 _kernel32.GetConsoleScreenBufferInfo.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
285
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
286 _advapi32.GetUserNameA.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
287 _advapi32.GetUserNameA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
288
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
289 _user32.GetWindowThreadProcessId.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
290 _user32.GetWindowThreadProcessId.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
291
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
292 _user32.ShowWindow.argtypes = [_HANDLE, ctypes.c_int]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
293 _user32.ShowWindow.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
294
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
295 _WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
296 _user32.EnumWindows.argtypes = [_WNDENUMPROC, _LPARAM]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
297 _user32.EnumWindows.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
298
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
299 _kernel32.PeekNamedPipe.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD,
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
300 ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
301 _kernel32.PeekNamedPipe.restype = _BOOL
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
302
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
303 def _raiseoserror(name):
33419
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
304 # Force the code to a signed int to avoid an 'int too large' error.
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
305 # See https://bugs.python.org/issue28474
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
306 code = _kernel32.GetLastError()
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
307 if code > 0x7fffffff:
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
308 code -= 2**32
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
309 err = ctypes.WinError(code=code)
39762
edaa40dc5fe5 py3: create built in exceptions with str type messages in win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
310 raise OSError(err.errno, r'%s: %s' % (encoding.strfromlocal(name),
edaa40dc5fe5 py3: create built in exceptions with str type messages in win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
311 err.strerror))
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
312
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
313 def _getfileinfo(name):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
314 fh = _kernel32.CreateFileA(name, 0,
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
315 _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
316 None, _OPEN_EXISTING, _FILE_FLAG_BACKUP_SEMANTICS, None)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
317 if fh == _INVALID_HANDLE_VALUE:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
318 _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
319 try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
320 fi = _BY_HANDLE_FILE_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
321 if not _kernel32.GetFileInformationByHandle(fh, ctypes.byref(fi)):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
322 _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
323 return fi
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
324 finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
325 _kernel32.CloseHandle(fh)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
326
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
327 def checkcertificatechain(cert, build=True):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
328 '''Tests the given certificate to see if there is a complete chain to a
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
329 trusted root certificate. As a side effect, missing certificates are
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
330 downloaded and installed unless ``build=False``. True is returned if a
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
331 chain to a trusted root exists (even if built on the fly), otherwise
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
332 False. NB: A chain to a trusted root does NOT imply that the certificate
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
333 is valid.
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
334 '''
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
335
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
336 chainctxptr = ctypes.POINTER(CERT_CHAIN_CONTEXT)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
337
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
338 pchainctx = chainctxptr()
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
339 chainpara = CERT_CHAIN_PARA(cbSize=ctypes.sizeof(CERT_CHAIN_PARA),
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
340 RequestedUsage=CERT_USAGE_MATCH())
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
341
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
342 certctx = _crypt32.CertCreateCertificateContext(X509_ASN_ENCODING, cert,
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
343 len(cert))
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
344 if certctx is None:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
345 _raiseoserror('CertCreateCertificateContext')
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
346
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
347 flags = 0
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
348
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
349 if not build:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
350 flags |= 0x100 # CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
351
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
352 try:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
353 # Building the certificate chain will update root certs as necessary.
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
354 if not _crypt32.CertGetCertificateChain(None, # hChainEngine
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
355 certctx, # pCertContext
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
356 None, # pTime
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
357 None, # hAdditionalStore
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
358 ctypes.byref(chainpara),
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
359 flags,
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
360 None, # pvReserved
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
361 ctypes.byref(pchainctx)):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
362 _raiseoserror('CertGetCertificateChain')
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
363
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
364 chainctx = pchainctx.contents
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
365
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
366 return chainctx.dwErrorStatus & CERT_TRUST_IS_PARTIAL_CHAIN == 0
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
367 finally:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
368 if pchainctx:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
369 _crypt32.CertFreeCertificateChain(pchainctx)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
370 _crypt32.CertFreeCertificateContext(certctx)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
371
14235
b9e1b041744f rename util.os_link to oslink
Adrian Buehlmann <adrian@cadifra.com>
parents: 14230
diff changeset
372 def oslink(src, dst):
13976
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
373 try:
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
374 if not _kernel32.CreateHardLinkA(dst, src, None):
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
375 _raiseoserror(src)
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
376 except AttributeError: # Wine doesn't support this function
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
377 _raiseoserror(src)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
378
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
379 def nlinks(name):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
380 '''return number of hardlinks for the given file'''
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
381 return _getfileinfo(name).nNumberOfLinks
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
382
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
383 def samefile(path1, path2):
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
384 '''Returns whether path1 and path2 refer to the same file or directory.'''
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
385 res1 = _getfileinfo(path1)
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
386 res2 = _getfileinfo(path2)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
387 return (res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
388 and res1.nFileIndexHigh == res2.nFileIndexHigh
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
389 and res1.nFileIndexLow == res2.nFileIndexLow)
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
390
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
391 def samedevice(path1, path2):
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
392 '''Returns whether path1 and path2 are on the same device.'''
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
393 res1 = _getfileinfo(path1)
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
394 res2 = _getfileinfo(path2)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
395 return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
396
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
397 def peekpipe(pipe):
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
398 handle = msvcrt.get_osfhandle(pipe.fileno())
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
399 avail = _DWORD()
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
400
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
401 if not _kernel32.PeekNamedPipe(handle, None, 0, None, ctypes.byref(avail),
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
402 None):
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
403 err = _kernel32.GetLastError()
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
404 if err == _ERROR_BROKEN_PIPE:
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
405 return 0
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
406 raise ctypes.WinError(err)
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
407
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
408 return avail.value
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
409
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
410 def lasterrorwaspipeerror(err):
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
411 if err.errno != errno.EINVAL:
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
412 return False
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
413 err = _kernel32.GetLastError()
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
414 return err == _ERROR_BROKEN_PIPE or err == _ERROR_NO_DATA
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
415
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
416 def testpid(pid):
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
417 '''return True if pid is still running or unable to
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
418 determine, False otherwise'''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
419 h = _kernel32.OpenProcess(_PROCESS_QUERY_INFORMATION, False, pid)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
420 if h:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
421 try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
422 status = _DWORD()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
423 if _kernel32.GetExitCodeProcess(h, ctypes.byref(status)):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
424 return status.value == _STILL_ACTIVE
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
425 finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
426 _kernel32.CloseHandle(h)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
427 return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
428
14236
e949a008999d rename util.executable_path to executablepath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14235
diff changeset
429 def executablepath():
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
430 '''return full path of hg.exe'''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
431 size = 600
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
432 buf = ctypes.create_string_buffer(size + 1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
433 len = _kernel32.GetModuleFileNameA(None, ctypes.byref(buf), size)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
434 if len == 0:
24494
f2b87f4856bf win32: add comment about WinError
Adrian Buehlmann <adrian@cadifra.com>
parents: 24418
diff changeset
435 raise ctypes.WinError() # Note: WinError is a function
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
436 elif len == size:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
437 raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER)
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
438 return buf.value
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
439
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
440 def getvolumename(path):
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
441 """Get the mount point of the filesystem from a directory or file
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
442 (best-effort)
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
443
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
444 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
445 """
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
446 # realpath() calls GetFullPathName()
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
447 realpath = os.path.realpath(path)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
448
35550
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
449 # allocate at least MAX_PATH long since GetVolumePathName('c:\\', buf, 4)
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
450 # somehow fails on Windows XP
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
451 size = max(len(realpath), _MAX_PATH) + 1
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
452 buf = ctypes.create_string_buffer(size)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
453
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
454 if not _kernel32.GetVolumePathNameA(realpath, ctypes.byref(buf), size):
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
455 raise ctypes.WinError() # Note: WinError is a function
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
456
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
457 return buf.value
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
458
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
459 def getfstype(path):
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
460 """Get the filesystem type name from a directory or file (best-effort)
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
461
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
462 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
463 """
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
464 volume = getvolumename(path)
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
465
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
466 t = _kernel32.GetDriveTypeA(volume)
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
467
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
468 if t == _DRIVE_REMOTE:
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
469 return 'cifs'
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
470 elif t not in (_DRIVE_REMOVABLE, _DRIVE_FIXED, _DRIVE_CDROM,
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
471 _DRIVE_RAMDISK):
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
472 return None
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
473
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
474 size = _MAX_PATH + 1
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
475 name = ctypes.create_string_buffer(size)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
476
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
477 if not _kernel32.GetVolumeInformationA(volume, None, 0, None, None, None,
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
478 ctypes.byref(name), size):
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
479 raise ctypes.WinError() # Note: WinError is a function
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
480
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
481 return name.value
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
482
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
483 def getuser():
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
484 '''return name of current user'''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
485 size = _DWORD(300)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
486 buf = ctypes.create_string_buffer(size.value + 1)
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
487 if not _advapi32.GetUserNameA(ctypes.byref(buf), ctypes.byref(size)):
24418
a2285e2fc949 win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21226
diff changeset
488 raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
489 return buf.value
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
490
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
491 _signalhandler = []
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
492
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
493 def setsignalhandler():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
494 '''Register a termination handler for console events including
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
495 CTRL+C. python signal handlers do not work well with socket
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
496 operations.
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
497 '''
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
498 def handler(event):
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
499 _kernel32.ExitProcess(1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
500
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
501 if _signalhandler:
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
502 return # already registered
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
503 h = _SIGNAL_HANDLER(handler)
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
504 _signalhandler.append(h) # needed to prevent garbage collection
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
505 if not _kernel32.SetConsoleCtrlHandler(h, True):
24418
a2285e2fc949 win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21226
diff changeset
506 raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
507
10240
3af4b39afe2a cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents: 10219
diff changeset
508 def hidewindow():
3af4b39afe2a cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents: 10219
diff changeset
509
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
510 def callback(hwnd, pid):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
511 wpid = _DWORD()
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
512 _user32.GetWindowThreadProcessId(hwnd, ctypes.byref(wpid))
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
513 if pid == wpid.value:
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
514 _user32.ShowWindow(hwnd, _SW_HIDE)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
515 return False # stop enumerating windows
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
516 return True
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
517
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
518 pid = _kernel32.GetCurrentProcessId()
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
519 _user32.EnumWindows(_WNDENUMPROC(callback), pid)
11012
81631f0cf13b win32: detect console width on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 10388
diff changeset
520
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
521 def termsize():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
522 # cmd.exe does not handle CR like a unix console, the CR is
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
523 # counted in the line length. On 80 columns consoles, if 80
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
524 # characters are written, the following CR won't apply on the
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
525 # current line but on the new one. Keep room for it.
30313
392633d7860e scmutil: clarify that we explicitly do termwidth - 1 on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 25994
diff changeset
526 width = 80 - 1
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
527 height = 25
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
528 # Query stderr to avoid problems with redirections
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
529 screenbuf = _kernel32.GetStdHandle(
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
530 _STD_ERROR_HANDLE) # don't close the handle returned
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
531 if screenbuf is None or screenbuf == _INVALID_HANDLE_VALUE:
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
532 return width, height
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
533 csbi = _CONSOLE_SCREEN_BUFFER_INFO()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
534 if not _kernel32.GetConsoleScreenBufferInfo(
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
535 screenbuf, ctypes.byref(csbi)):
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
536 return width, height
30313
392633d7860e scmutil: clarify that we explicitly do termwidth - 1 on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 25994
diff changeset
537 width = csbi.srWindow.Right - csbi.srWindow.Left # don't '+ 1'
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
538 height = csbi.srWindow.Bottom - csbi.srWindow.Top + 1
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
539 return width, height
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
540
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
541 def enablevtmode():
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
542 '''Enable virtual terminal mode for the associated console. Return True if
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
543 enabled, else False.'''
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
544
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
545 ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
546
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
547 handle = _kernel32.GetStdHandle(_STD_OUTPUT_HANDLE) # don't close the handle
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
548 if handle == _INVALID_HANDLE_VALUE:
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
549 return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
550
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
551 mode = _DWORD(0)
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
552
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
553 if not _kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
554 return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
555
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
556 if (mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0:
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
557 mode.value |= ENABLE_VIRTUAL_TERMINAL_PROCESSING
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
558
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
559 if not _kernel32.SetConsoleMode(handle, mode):
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
560 return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
561
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
562 return True
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
563
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
564 def spawndetached(args):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
565 # No standard library function really spawns a fully detached
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
566 # process under win32 because they allocate pipes or other objects
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
567 # to handle standard streams communications. Passing these objects
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
568 # to the child process requires handle inheritance to be enabled
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
569 # which makes really detached processes impossible.
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
570 si = _STARTUPINFO()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
571 si.cb = ctypes.sizeof(_STARTUPINFO)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
572
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
573 pi = _PROCESS_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
574
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
575 env = ''
30637
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30314
diff changeset
576 for k in encoding.environ:
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30314
diff changeset
577 env += "%s=%s\0" % (k, encoding.environ[k])
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
578 if not env:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
579 env = '\0'
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
580 env += '\0'
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
581
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39611
diff changeset
582 args = subprocess.list2cmdline(pycompat.rapply(encoding.strfromlocal, args))
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
583
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39611
diff changeset
584 # TODO: CreateProcessW on py3?
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
585 res = _kernel32.CreateProcessA(
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39611
diff changeset
586 None, encoding.strtolocal(args), None, None, False, _CREATE_NO_WINDOW,
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39762
diff changeset
587 env, encoding.getcwd(), ctypes.byref(si), ctypes.byref(pi))
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
588 if not res:
24418
a2285e2fc949 win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21226
diff changeset
589 raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
590
40928
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
591 _kernel32.CloseHandle(pi.hProcess)
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
592 _kernel32.CloseHandle(pi.hThread)
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
593
32676
4c3d9ee87382 win32: drop a py26 daemonizing hack
Matt Harbison <matt_harbison@yahoo.com>
parents: 32664
diff changeset
594 return pi.dwProcessId
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
595
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
596 def unlink(f):
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
597 '''try to implement POSIX' unlink semantics on Windows'''
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
598
21226
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
599 if os.path.isdir(f):
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
600 # use EPERM because it is POSIX prescribed value, even though
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
601 # unlink(2) on directories returns EISDIR on Linux
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
602 raise IOError(errno.EPERM,
39762
edaa40dc5fe5 py3: create built in exceptions with str type messages in win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
603 r"Unlinking directory not permitted: '%s'"
edaa40dc5fe5 py3: create built in exceptions with str type messages in win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
604 % encoding.strfromlocal(f))
19159
1b329f8c7b24 windows: check target type before actual unlinking to follow POSIX semantics
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18959
diff changeset
605
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
606 # POSIX allows to unlink and rename open files. Windows has serious
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
607 # problems with doing that:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
608 # - Calling os.unlink (or os.rename) on a file f fails if f or any
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
609 # hardlinked copy of f has been opened with Python's open(). There is no
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
610 # way such a file can be deleted or renamed on Windows (other than
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
611 # scheduling the delete or rename for the next reboot).
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
612 # - Calling os.unlink on a file that has been opened with Mercurial's
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
613 # posixfile (or comparable methods) will delay the actual deletion of
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
614 # the file for as long as the file is held open. The filename is blocked
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
615 # during that time and cannot be used for recreating a new file under
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
616 # that same name ("zombie file"). Directories containing such zombie files
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
617 # cannot be removed or moved.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
618 # A file that has been opened with posixfile can be renamed, so we rename
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
619 # f to a random temporary name before calling os.unlink on it. This allows
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
620 # callers to recreate f immediately while having other readers do their
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
621 # implicit zombie filename blocking on a temporary name.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
622
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38533
diff changeset
623 for tries in pycompat.xrange(10):
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
624 temp = '%s-%08x' % (f, random.randint(0, 0xffffffff))
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
625 try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
626 os.rename(f, temp) # raises OSError EEXIST if temp exists
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
627 break
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24652
diff changeset
628 except OSError as e:
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
629 if e.errno != errno.EEXIST:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
630 raise
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
631 else:
39762
edaa40dc5fe5 py3: create built in exceptions with str type messages in win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
632 raise IOError(errno.EEXIST, r"No usable temporary filename found")
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
633
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
634 try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
635 os.unlink(temp)
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
636 except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
637 # The unlink might have failed because the READONLY attribute may heave
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
638 # been set on the original file. Rename works fine with READONLY set,
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
639 # but not os.unlink. Reset all attributes and try again.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
640 _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
641 try:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
642 os.unlink(temp)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
643 except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
644 # The unlink might have failed due to some very rude AV-Scanners.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
645 # Leaking a tempfile is the lesser evil than aborting here and
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
646 # leaving some potentially serious inconsistencies.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
647 pass
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
648
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
649 def makedir(path, notindexed):
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
650 os.mkdir(path)
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
651 if notindexed:
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
652 _kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)