* link: Improve trailing slash handling on native Windows
@ 2021-01-05 4:25 Bruno Haible
0 siblings, 0 replies; only message in thread
From: Bruno Haible @ 2021-01-05 4:25 UTC (permalink / raw)
To: bug-gnulib
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
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2021-01-05 4:25 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-05 4:25 link: Improve trailing slash handling on native Windows Bruno Haible
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).