When deleting a symlink on Windows, then the way to delete it depends on whether it is a directory symlink or a file symlink. In the first case, we need to use `DeleteFile`, in the second `RemoveDirectory`. Right now, `p_unlink` will only ever try to use `DeleteFile`, though, and thus fail to remove directory symlinks. This mismatches how unlink(3P) is expected to behave, though, as it shall remove any symlink disregarding whether it is a file or directory symlink. In order to correctly unlink a symlink, we thus need to check what kind of file this is. If we were to first query file attributes of every file upon calling `p_unlink`, then this would penalize the common case though. Instead, we can try to first delete the file with `DeleteFile` and only if the error returned is `ERROR_ACCESS_DENIED` will we query file attributes and determine whether it is a directory symlink to use `RemoveDirectory` instead.
Name |
Last commit
|
Last update |
---|---|---|
.. | ||
dir.c | Loading commit data... | |
dir.h | Loading commit data... | |
error.c | Loading commit data... | |
error.h | Loading commit data... | |
findfile.c | Loading commit data... | |
findfile.h | Loading commit data... | |
git2.rc | Loading commit data... | |
map.c | Loading commit data... | |
mingw-compat.h | Loading commit data... | |
msvc-compat.h | Loading commit data... | |
path_w32.c | Loading commit data... | |
path_w32.h | Loading commit data... | |
posix.h | Loading commit data... | |
posix_w32.c | Loading commit data... | |
precompiled.c | Loading commit data... | |
precompiled.h | Loading commit data... | |
reparse.h | Loading commit data... | |
thread.c | Loading commit data... | |
thread.h | Loading commit data... | |
utf-conv.c | Loading commit data... | |
utf-conv.h | Loading commit data... | |
version.h | Loading commit data... | |
w32_buffer.c | Loading commit data... | |
w32_buffer.h | Loading commit data... | |
w32_common.h | Loading commit data... | |
w32_crtdbg_stacktrace.c | Loading commit data... | |
w32_crtdbg_stacktrace.h | Loading commit data... | |
w32_stack.c | Loading commit data... | |
w32_stack.h | Loading commit data... | |
w32_util.c | Loading commit data... | |
w32_util.h | Loading commit data... | |
win32-compat.h | Loading commit data... |