Re: [PATCH] mkdir-p: Don't discard stat error

2018-12-16 Thread Niklas Hambüchen

On 15/12/2018 1:27 AM, Paul Eggert wrote:

+  if (stat (dir + prefix_len, &st) == 0
+  && S_ISDIR (st.st_mode))


That patch doesn't look quite right, since it can use errno even when stat 
succeeded (in which case errno contains garbage).


Oops, you're right, that doesn't make any sense, keeping more checks than the 
syscall one in the condition is wrong. My bad.


I installed the attached instead; please give it a try.


That looks good. I've also tried it with coreutils and it works as expected.

Thanks!



Re: [PATCH] mkdir-p: Don't discard stat error

2018-12-14 Thread Paul Eggert

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