summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2012-09-19 09:35:12 +0200
committerJim Meyering <meyering@redhat.com>2012-09-19 09:44:22 +0200
commitba034fc449abd2b72ad52b3865c29fd98ea3de76 (patch)
tree4683fa21cff898e7a95e5bc547005129dd17f8c4
parent0bb0c2c00ee75bfb96413d9f166e097be6986831 (diff)
downloadcoreutils-ba034fc449abd2b72ad52b3865c29fd98ea3de76.tar.xz
rm: be even more careful when using a replacement errno value
* src/remove.c (excise): The change in commit v8.19-107-gccbd3f3 made the "rm -rf D" (for unreadable dir, D) diagnostic worse on Solaris 10: -rm: cannot remove 'D': Permission denied +rm: cannot remove 'D': File exists That happened because unlinkat would fail with EEXIST there, given an unreadable directory, which made the two tests, tests/rm/unread2 and tests/rm/unreadable fail. Accommodate the EEXIST case, too.
-rw-r--r--src/remove.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/remove.c b/src/remove.c
index a141718c9..838501298 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -393,11 +393,13 @@ excise (FTS *fts, FTSENT *ent, struct rm_options const *x, bool is_dir)
return RM_OK;
/* When failing to rmdir an unreadable directory, we see errno values
- like EISDIR or ENOTDIR, but they would be meaningless in a diagnostic.
- When that happens and the errno value from the failed open is EPERM
- or EACCES, use the earlier, more descriptive errno value. */
+ like EISDIR or ENOTDIR (or, on Solaris 10, EEXIST), but they would be
+ meaningless in a diagnostic. When that happens and the errno value
+ from the failed open is EPERM or EACCES, use the earlier, more
+ descriptive errno value. */
if (ent->fts_info == FTS_DNR
- && (errno == ENOTEMPTY || errno == EISDIR || errno == ENOTDIR)
+ && (errno == ENOTEMPTY || errno == EISDIR || errno == ENOTDIR
+ || errno == EEXIST)
&& (ent->fts_errno == EPERM || ent->fts_errno == EACCES))
errno = ent->fts_errno;
error (0, errno, _("cannot remove %s"), quote (ent->fts_path));