mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-03 08:00:21 +08:00
Fix get_dirent_type() for symlinks on MinGW/MSYS.
On Windows with MSVC, get_dirent_type() was recently made to return
DT_LNK for junction points by commit 9d3444dc
, which fixed some
defective dirent.c code.
On Windows with Cygwin, get_dirent_type() already worked for symlinks,
as it does on POSIX systems, because Cygwin has its own fake symlinks
that behave like POSIX (on closer inspection, Cygwin's dirent has the
BSD d_type extension but it's probably always DT_UNKNOWN, so we fall
back to lstat(), which understands Cygwin symlinks with S_ISLNK()).
On Windows with MinGW/MSYS, we need extra code, because the MinGW
runtime has its own readdir() without d_type, and the lstat()-based
fallback has no knowledge of our convention for treating junctions as
symlinks.
Back-patch to 14, where get_dirent_type() landed.
Reported-by: Andrew Dunstan <andrew@dunslane.net>
Discussion: https://postgr.es/m/b9ddf605-6b36-f90d-7c30-7b3e95c46276%40dunslane.net
This commit is contained in:
parent
5253519b27
commit
4fc6b6eefc
@ -465,5 +465,21 @@ get_dirent_type(const char *path,
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(WIN32) && !defined(_MSC_VER)
|
||||
|
||||
/*
|
||||
* If we're on native Windows (not Cygwin, which has its own POSIX
|
||||
* symlinks), but not using the MSVC compiler, then we're using a
|
||||
* readdir() emulation provided by the MinGW runtime that has no d_type.
|
||||
* Since the lstat() fallback code reports junction points as directories,
|
||||
* we need an extra system call to check if we should report them as
|
||||
* symlinks instead, following our convention.
|
||||
*/
|
||||
if (result == PGFILETYPE_DIR &&
|
||||
!look_through_symlinks &&
|
||||
pgwin32_is_junction(path))
|
||||
result = PGFILETYPE_LNK;
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user