]> git.ipfire.org Git - thirdparty/gnulib.git/commitdiff
mkdir-p: improve diagnostic for FUSE mounts
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 15 Dec 2018 00:25:13 +0000 (16:25 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 15 Dec 2018 00:26:06 +0000 (16:26 -0800)
Problem reported by Niklas Hambüchen in:
https://lists.gnu.org/r/bug-gnulib/2018-12/msg00074.html
* lib/mkdir-p.c (make_dir_parents): In diagnostic, prefer stat
errno to mkdir errno if the stat errno is likely more interesting.

ChangeLog
lib/mkdir-p.c

index d66fb6124d9e30ba206b031d8204a73cf22c4bba..74688d4795748cf1a4694ada584c94004183c4e8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2018-12-14  Paul Eggert  <eggert@cs.ucla.edu>
+
+       mkdir-p: improve diagnostic for FUSE mounts
+       Problem reported by Niklas Hambüchen in:
+       https://lists.gnu.org/r/bug-gnulib/2018-12/msg00074.html
+       * lib/mkdir-p.c (make_dir_parents): In diagnostic, prefer stat
+       errno to mkdir errno if the stat errno is likely more interesting.
+
 2018-12-14  Bruno Haible  <bruno@clisp.org>
 
        hash-map: Add tests.
index c91b6c522788f7db91b51568981e024982e864fa..8ff80dc34098a2a51553d863c5733252fe70ac00 100644 (file)
@@ -146,12 +146,23 @@ make_dir_parents (char *dir,
 
           if (preserve_existing)
             {
-              struct stat st;
-              if (mkdir_errno == 0
-                  || (mkdir_errno != ENOENT && make_ancestor
-                      && stat (dir + prefix_len, &st) == 0
-                      && S_ISDIR (st.st_mode)))
+              if (mkdir_errno == 0)
                 return true;
+              if (mkdir_errno != ENOENT && make_ancestor)
+                {
+                  struct stat st;
+                  if (stat (dir + prefix_len, &st) == 0)
+                    {
+                      if (S_ISDIR (st.st_mode))
+                        return true;
+                    }
+                  else if (mkdir_errno == EEXIST
+                           && errno != ENOENT && errno != ENOTDIR)
+                    {
+                      error (0, errno, _("cannot stat %s"), quote (dir));
+                      return false;
+                    }
+                }
             }
           else
             {