# HG changeset patch # User Christian Brabandt # Date 1453227305 -3600 # Node ID 07cfa8fea697bcafeb22ea122d7d300511932745 # Parent 4b72a6f11547fff6da66a63acec2e1434890e685 commit https://github.com/vim/vim/commit/fce7b3d24fd18b1486e474e933a95f9090df9973 Author: Bram Moolenaar 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) diff --git a/src/os_mswin.c b/src/os_mswin.c --- 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; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1139, +/**/ 1138, /**/ 1137,