On 12/14/18 1:10 PM, Niklas Hambüchen wrote:
+ if (stat (dir + prefix_len, &st) == 0
+ && S_ISDIR (st.st_mode))
+return true;
+ else
+{
+ error (0, errno,
+ _("cannot stat %s"),
+ quote (dir + prefix_len));
+ return false;
+}
Thanks for the bug report. That patch doesn't look quite right, since it
can use errno even when stat succeeded (in which case errno contains
garbage). I installed the attached instead; please give it a try.
>From 6d603a24bfdfae79d782e8bbc42707e672f14720 Mon Sep 17 00:00:00 2001
From: Paul Eggert
Date: Fri, 14 Dec 2018 16:25:13 -0800
Subject: [PATCH] mkdir-p: improve diagnostic for FUSE mounts
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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 | 8
lib/mkdir-p.c | 21 -
2 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d66fb6124..74688d479 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2018-12-14 Paul Eggert
+
+ 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
hash-map: Add tests.
diff --git a/lib/mkdir-p.c b/lib/mkdir-p.c
index c91b6c522..8ff80dc34 100644
--- a/lib/mkdir-p.c
+++ b/lib/mkdir-p.c
@@ -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
{
--
2.19.2