summaryrefslogtreecommitdiff
path: root/src/remove.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2006-12-20 19:56:20 +0100
committerJim Meyering <jim@meyering.net>2006-12-21 08:58:11 +0100
commitc8ef95eaed944ec70ccd70c077cf465c6311c1b6 (patch)
tree5c83a1915419c58457fff59afe894abf3e00471c /src/remove.c
parentd69fc66d81c7166fe689418f42b7cb900d2a1433 (diff)
downloadcoreutils-c8ef95eaed944ec70ccd70c077cf465c6311c1b6.tar.xz
"rm -rf /etc/motd" (run by non-root) now prints a diagnostic.
* src/remove.c (remove_entry): Handle EACCES for a non-directory, too. Karl Berry reported that a cross-partition "mv /etc/issue ~" failed with the um,... suboptimal diagnostic, "mv: cannot remove `/etc/issue': Not a directory". * tests/rm/Makefile.am (TESTS): Add fail-eacces. * tests/rm/fail-eacces: New file. * NEWS: Mention that both mv and rm are affected.
Diffstat (limited to 'src/remove.c')
-rw-r--r--src/remove.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/remove.c b/src/remove.c
index 3dc692947..f6d3f0c67 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -1016,8 +1016,7 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
errno = EISDIR;
if (! x->recursive
- || errno == ENOENT || errno == ENOTDIR
- || errno == ELOOP || errno == ENAMETOOLONG)
+ || (cache_stat_ok (st) && !S_ISDIR (st->st_mode)))
{
if (ignorable_missing (x, errno))
return RM_OK;
@@ -1028,6 +1027,7 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
quote (full_filename (filename)));
return RM_ERROR;
}
+ assert (!cache_stat_ok (st) || S_ISDIR (st->st_mode));
}
else
{