From: Bruno Haible <bruno@clisp.org>
Date: Sat, 2 Jan 2021 17:59:12 +0000 (+0100)
Subject: utimens: Fix test failure on macOS 10.13.
X-Git-Tag: v1.0~3232
X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=86c8ff740b64f3724de20d71dca481bef30b18dd;p=gnulib.git

utimens: Fix test failure on macOS 10.13.

* lib/utimens.c (fdutimens): Before calling utimensat, recognize a
filename ending in a slash that does not point to a directory.
---

diff --git a/ChangeLog b/ChangeLog
index 73d11397b2..5087bf4e62 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2021-01-02  Bruno Haible  <bruno@clisp.org>
+
+	utimens: Fix test failure on macOS 10.13.
+	* lib/utimens.c (fdutimens): Before calling utimensat, recognize a
+	filename ending in a slash that does not point to a directory.
+
 2021-01-02  Bruno Haible  <bruno@clisp.org>
 
 	utimens: Avoid test failures on macOS 10.13.
diff --git a/lib/utimens.c b/lib/utimens.c
index 5bbae05813..9f9c30af2f 100644
--- a/lib/utimens.c
+++ b/lib/utimens.c
@@ -246,6 +246,20 @@ fdutimens (int fd, char const *file, struct timespec const timespec[2])
 # if HAVE_UTIMENSAT
       if (fd < 0)
         {
+#  if defined __APPLE__ && defined __MACH__
+          size_t len = strlen (file);
+          if (len > 0 && file[len - 1] == '/')
+            {
+              struct stat statbuf;
+              if (stat (file, &statbuf) < 0)
+                return -1;
+              if (!S_ISDIR (statbuf.st_mode))
+                {
+                  errno = ENOTDIR;
+                  return -1;
+                }
+            }
+#  endif
           result = utimensat (AT_FDCWD, file, ts, 0);
 #  ifdef __linux__
           /* Work around a kernel bug: