• Alex Brainman's avatar
    os: reimplement windows os.Stat · 53003621
    Alex Brainman authored
    Currently windows Stat uses combination of Lstat and Readlink to
    walk symlinks until it reaches file or directory. Windows Readlink
    is implemented via Windows DeviceIoControl(FSCTL_GET_REPARSE_POINT, ...)
    call, but that call does not work on network shares or inside of
    Docker container (see issues #18555 ad #19922 for details).
    
    But Raymond Chen suggests different approach:
    https://blogs.msdn.microsoft.com/oldnewthing/20100212-00/?p=14963/
    - he suggests to use Windows I/O manager to dereferences the
    symbolic link.
    
    This appears to work for all normal symlinks, but also for network
    shares and inside of Docker container.
    
    This CL implements described procedure.
    
    I also had to adjust TestStatSymlinkLoop, because the test is
    expecting Stat to return syscall.ELOOP for symlink with a loop.
    But new Stat returns Windows error of ERROR_CANT_RESOLVE_FILENAME
    = 1921 instead. I could map ERROR_CANT_RESOLVE_FILENAME into
    syscall.ELOOP, but I suspect the former is broader than later.
    And ERROR_CANT_RESOLVE_FILENAME message text of "The name of
    the file cannot be resolved by the system." sounds fine to me.
    
    Fixes #10935
    Fixes #18555
    Fixes #19922
    
    Change-Id: I979636064cdbdb9c7c840cf8ae73fe2c24499879
    Reviewed-on: https://go-review.googlesource.com/41834Reviewed-by: 's avatarHarshavardhana <hrshvardhana@gmail.com>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    53003621
Name
Last commit
Last update
..
exec Loading commit data...
signal Loading commit data...
user Loading commit data...
dir.go Loading commit data...
dir_plan9.go Loading commit data...
dir_unix.go Loading commit data...
dir_windows.go Loading commit data...
env.go Loading commit data...
env_test.go Loading commit data...
env_unix_test.go Loading commit data...
error.go Loading commit data...
error_plan9.go Loading commit data...
error_posix.go Loading commit data...
error_test.go Loading commit data...
error_unix.go Loading commit data...
error_unix_test.go Loading commit data...
error_windows.go Loading commit data...
error_windows_test.go Loading commit data...
example_test.go Loading commit data...
exec.go Loading commit data...
exec_plan9.go Loading commit data...
exec_posix.go Loading commit data...
exec_unix.go Loading commit data...
exec_windows.go Loading commit data...
executable.go Loading commit data...
executable_darwin.go Loading commit data...
executable_freebsd.go Loading commit data...
executable_plan9.go Loading commit data...
executable_procfs.go Loading commit data...
executable_solaris.go Loading commit data...
executable_test.go Loading commit data...
executable_windows.go Loading commit data...
export_test.go Loading commit data...
export_windows_test.go Loading commit data...
file.go Loading commit data...
file_plan9.go Loading commit data...
file_posix.go Loading commit data...
file_unix.go Loading commit data...
file_windows.go Loading commit data...
getwd.go Loading commit data...
getwd_darwin.go Loading commit data...
os_test.go Loading commit data...
os_unix_test.go Loading commit data...
os_windows_test.go Loading commit data...
path.go Loading commit data...
path_plan9.go Loading commit data...
path_test.go Loading commit data...
path_unix.go Loading commit data...
path_windows.go Loading commit data...
path_windows_test.go Loading commit data...
pipe_bsd.go Loading commit data...
pipe_freebsd.go Loading commit data...
pipe_linux.go Loading commit data...
pipe_test.go Loading commit data...
proc.go Loading commit data...
stat_darwin.go Loading commit data...
stat_dragonfly.go Loading commit data...
stat_freebsd.go Loading commit data...
stat_linux.go Loading commit data...
stat_nacl.go Loading commit data...
stat_netbsd.go Loading commit data...
stat_openbsd.go Loading commit data...
stat_plan9.go Loading commit data...
stat_solaris.go Loading commit data...
stat_unix.go Loading commit data...
stat_windows.go Loading commit data...
sticky_bsd.go Loading commit data...
sticky_notbsd.go Loading commit data...
str.go Loading commit data...
sys.go Loading commit data...
sys_bsd.go Loading commit data...
sys_darwin.go Loading commit data...
sys_freebsd.go Loading commit data...
sys_linux.go Loading commit data...
sys_nacl.go Loading commit data...
sys_plan9.go Loading commit data...
sys_solaris.go Loading commit data...
sys_unix.go Loading commit data...
sys_windows.go Loading commit data...
types.go Loading commit data...
types_plan9.go Loading commit data...
types_unix.go Loading commit data...
types_windows.go Loading commit data...
wait_unimp.go Loading commit data...
wait_wait6.go Loading commit data...
wait_waitid.go Loading commit data...