bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

link: Improve trailing slash handling on native Windows


From: Bruno Haible
Subject: link: Improve trailing slash handling on native Windows
Date: Tue, 05 Jan 2021 05:25:43 +0100
User-agent: KMail/5.1.3 (Linux/4.4.0-197-generic; KDE/5.18.0; x86_64; ; )

On native Windows (but not on Linux!), when stat() fails with error
EOVERFLOW, you know that the file is a regular file of size >= 4 GiB.
This allows to improve the errno value here:


2021-01-04  Bruno Haible  <bruno@clisp.org>

        link: Improve trailing slash handling on native Windows.
        * lib/link.c (link): If stat() fails, provide a better errno.

diff --git a/lib/link.c b/lib/link.c
index 87dae40..21c7f7a 100644
--- a/lib/link.c
+++ b/lib/link.c
@@ -85,16 +85,24 @@ link (const char *file1, const char *file2)
       errno = EPERM;
       return -1;
     }
-  /* Reject trailing slashes on non-directories; mingw does not
+  /* Reject trailing slashes on non-directories; native Windows does not
      support hard-linking directories.  */
   if ((len1 && (file1[len1 - 1] == '/' || file1[len1 - 1] == '\\'))
       || (len2 && (file2[len2 - 1] == '/' || file2[len2 - 1] == '\\')))
     {
+      /* If stat() fails, then link() should fail for the same reason.  */
       struct stat st;
-      if (stat (file1, &st) == 0 && S_ISDIR (st.st_mode))
-        errno = EPERM;
-      else
+      if (stat (file1, &st))
+        {
+          if (errno == EOVERFLOW)
+            /* It's surely a file, not a directory (see stat-w32.c).  */
+            errno = ENOTDIR;
+          return -1;
+        }
+      if (!S_ISDIR (st.st_mode))
         errno = ENOTDIR;
+      else
+        errno = EPERM;
       return -1;
     }
   /* CreateHardLink("b/.","a",NULL) creates file "b", so we must check




reply via email to

[Prev in Thread] Current Thread [Next in Thread]