]> granicus.if.org Git - vim/commitdiff
patch 7.4.1139 v7.4.1139
authorBram Moolenaar <Bram@vim.org>
Tue, 19 Jan 2016 18:00:32 +0000 (19:00 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 19 Jan 2016 18:00:32 +0000 (19:00 +0100)
Problem:    MS-Windows: getftype() returns "file for symlink to directory.
Solution:   Make it return "dir". (Ken Takata)

src/os_mswin.c
src/version.c

index daf71a304d5ee01cb9fec5f138e94f66b19e12e9..698c210f4471b41ecbd5ccb9c18170504c93137c 100644 (file)
@@ -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, struct stat *stp)
 
            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, struct stat *stp)
     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, struct _stat *stp)
 
            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;
        }
index d42a23777670ec0ccc832fa7238fd5e85b73ad0e..5a0ed90d34c98e63cb299ca1a1cd387d603a4784 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1139,
 /**/
     1138,
 /**/