Mercurial > vim
changeset 7681:07cfa8fea697 v7.4.1139
commit https://github.com/vim/vim/commit/fce7b3d24fd18b1486e474e933a95f9090df9973
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jan 19 19:00:32 2016 +0100
patch 7.4.1139
Problem: MS-Windows: getftype() returns "file for symlink to directory.
Solution: Make it return "dir". (Ken Takata)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 19 Jan 2016 19:15:05 +0100 |
parents | 4b72a6f11547 |
children | 71ca3427491f |
files | src/os_mswin.c src/version.c |
diffstat | 2 files changed, 20 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -506,12 +506,16 @@ slash_adjust(p) static int stat_symlink_aware(const char *name, struct stat *stp) { -#if defined(_MSC_VER) && _MSC_VER < 1700 - /* Work around for VC10 or earlier. stat() can't handle symlinks properly. +#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__) + /* Work around for VC12 or earlier (and MinGW). stat() can't handle + * symlinks properly. * VC9 or earlier: stat() doesn't support a symlink at all. It retrieves * status of a symlink itself. * VC10: stat() supports a symlink to a normal file, but it doesn't support - * a symlink to a directory (always returns an error). */ + * a symlink to a directory (always returns an error). + * VC11 and VC12: stat() doesn't return an error for a symlink to a + * directory, but it doesn't set S_IFDIR flag. + * MinGW: Same as VC9. */ WIN32_FIND_DATA findData; HANDLE hFind, h; DWORD attr = 0; @@ -540,6 +544,8 @@ stat_symlink_aware(const char *name, str fd = _open_osfhandle((OPEN_OH_ARGTYPE)h, _O_RDONLY); n = _fstat(fd, (struct _stat*)stp); + if ((n == 0) && (attr & FILE_ATTRIBUTE_DIRECTORY)) + stp->st_mode = (stp->st_mode & ~S_IFREG) | S_IFDIR; _close(fd); return n; } @@ -552,12 +558,16 @@ stat_symlink_aware(const char *name, str static int wstat_symlink_aware(const WCHAR *name, struct _stat *stp) { -# if defined(_MSC_VER) && _MSC_VER < 1700 - /* Work around for VC10 or earlier. _wstat() can't handle symlinks properly. +# if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__) + /* Work around for VC12 or earlier (and MinGW). _wstat() can't handle + * symlinks properly. * VC9 or earlier: _wstat() doesn't support a symlink at all. It retrieves * status of a symlink itself. * VC10: _wstat() supports a symlink to a normal file, but it doesn't - * support a symlink to a directory (always returns an error). */ + * support a symlink to a directory (always returns an error). + * VC11 and VC12: _wstat() doesn't return an error for a symlink to a + * directory, but it doesn't set S_IFDIR flag. + * MinGW: Same as VC9. */ int n; BOOL is_symlink = FALSE; HANDLE hFind, h; @@ -587,6 +597,8 @@ wstat_symlink_aware(const WCHAR *name, s fd = _open_osfhandle((OPEN_OH_ARGTYPE)h, _O_RDONLY); n = _fstat(fd, stp); + if ((n == 0) && (attr & FILE_ATTRIBUTE_DIRECTORY)) + stp->st_mode = (stp->st_mode & ~S_IFREG) | S_IFDIR; _close(fd); return n; }