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 <egg...@cs.ucla.edu> 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 <egg...@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 <br...@clisp.org> 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