mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-21 07:16:21 +00:00
platform_utils_win32: remove an unnecessary workaround
The comment in _create_symlink is incorrect. The return value of CreateSymbolicLink is as documented, it was just declared with the wrong return type. The actual return type is BOOLEAN, not BOOL. Fixing this allows us to simplify the code a bit. Change-Id: I4d2190a50d45ba41dd9814bf7079a5784fc0a366
This commit is contained in:
parent
e57f1146de
commit
a84df06160
@ -17,7 +17,7 @@ import errno
|
|||||||
|
|
||||||
from ctypes import WinDLL, get_last_error, FormatError, WinError, addressof
|
from ctypes import WinDLL, get_last_error, FormatError, WinError, addressof
|
||||||
from ctypes import c_buffer
|
from ctypes import c_buffer
|
||||||
from ctypes.wintypes import BOOL, LPCWSTR, DWORD, HANDLE, POINTER, c_ubyte
|
from ctypes.wintypes import BOOL, BOOLEAN, LPCWSTR, DWORD, HANDLE, POINTER, c_ubyte
|
||||||
from ctypes.wintypes import WCHAR, USHORT, LPVOID, Structure, Union, ULONG
|
from ctypes.wintypes import WCHAR, USHORT, LPVOID, Structure, Union, ULONG
|
||||||
from ctypes.wintypes import byref
|
from ctypes.wintypes import byref
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ ERROR_PRIVILEGE_NOT_HELD = 1314
|
|||||||
|
|
||||||
# Win32 API entry points
|
# Win32 API entry points
|
||||||
CreateSymbolicLinkW = kernel32.CreateSymbolicLinkW
|
CreateSymbolicLinkW = kernel32.CreateSymbolicLinkW
|
||||||
CreateSymbolicLinkW.restype = BOOL
|
CreateSymbolicLinkW.restype = BOOLEAN
|
||||||
CreateSymbolicLinkW.argtypes = (LPCWSTR, # lpSymlinkFileName In
|
CreateSymbolicLinkW.argtypes = (LPCWSTR, # lpSymlinkFileName In
|
||||||
LPCWSTR, # lpTargetFileName In
|
LPCWSTR, # lpTargetFileName In
|
||||||
DWORD) # dwFlags In
|
DWORD) # dwFlags In
|
||||||
@ -145,19 +145,12 @@ def create_dirsymlink(source, link_name):
|
|||||||
|
|
||||||
|
|
||||||
def _create_symlink(source, link_name, dwFlags):
|
def _create_symlink(source, link_name, dwFlags):
|
||||||
# Note: Win32 documentation for CreateSymbolicLink is incorrect.
|
if not CreateSymbolicLinkW(link_name, source, dwFlags | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE):
|
||||||
# On success, the function returns "1".
|
|
||||||
# On error, the function returns some random value (e.g. 1280).
|
|
||||||
# The best bet seems to use "GetLastError" and check for error/success.
|
|
||||||
CreateSymbolicLinkW(link_name, source, dwFlags | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)
|
|
||||||
code = get_last_error()
|
|
||||||
if code != ERROR_SUCCESS:
|
|
||||||
# See https://github.com/golang/go/pull/24307/files#diff-b87bc12e4da2497308f9ef746086e4f0
|
# See https://github.com/golang/go/pull/24307/files#diff-b87bc12e4da2497308f9ef746086e4f0
|
||||||
# "the unprivileged create flag is unsupported below Windows 10 (1703, v10.0.14972).
|
# "the unprivileged create flag is unsupported below Windows 10 (1703, v10.0.14972).
|
||||||
# retry without it."
|
# retry without it."
|
||||||
CreateSymbolicLinkW(link_name, source, dwFlags)
|
if not CreateSymbolicLinkW(link_name, source, dwFlags):
|
||||||
code = get_last_error()
|
code = get_last_error()
|
||||||
if code != ERROR_SUCCESS:
|
|
||||||
error_desc = FormatError(code).strip()
|
error_desc = FormatError(code).strip()
|
||||||
if code == ERROR_PRIVILEGE_NOT_HELD:
|
if code == ERROR_PRIVILEGE_NOT_HELD:
|
||||||
raise OSError(errno.EPERM, error_desc, link_name)
|
raise OSError(errno.EPERM, error_desc, link_name)
|
||||||
|
Loading…
Reference in New Issue
Block a user