summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2006-06-26 13:29:48 +0000
committerJim Meyering <jim@meyering.net>2006-06-26 13:29:48 +0000
commit7590adf9b94f168f0dd7259d1b1c32e88f58114f (patch)
tree931bc3595ecea02cea7bb4239aa058ce2a6459c6 /src
parent78b166d1b163df894d567b79d3bb5744156fb0fe (diff)
downloadcoreutils-7590adf9b94f168f0dd7259d1b1c32e88f58114f.tar.xz
Attempt rmdir (actually, unlinkat-with-AT_REMOVEDIR) upon any
fd_to_subdirp failure, not just when errno == EACCES. * src/remove.c (remove_dir): Use unlinkat-with-AT_REMOVEDIR, not rmdir, here, even though rmdir may happen to be adequate.
Diffstat (limited to 'src')
-rw-r--r--src/remove.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/src/remove.c b/src/remove.c
index 076ad64c3..4ee59cec3 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -1224,26 +1224,24 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
if (dirp == NULL)
{
- int saved_errno = errno;
- if (errno == EACCES)
+ /* CAUTION: this test and diagnostic are identical to
+ those following the other use of fd_to_subdirp. */
+ if (errno == ENOENT && x->ignore_missing_files)
{
- /* If fd_to_subdirp fails due to permissions, then try to
- remove DIR via rmdir, in case it's just an empty directory. */
- /* This use of rmdir just works, at least in the sole test I
- have that exercises this code, but it'll soon go, to be
- replaced by a use of unlinkat-with-AT_REMOVEDIR. */
- if (rmdir (dir) == 0)
+ /* With -f, don't report "file not found". */
+ }
+ else
+ {
+ /* Upon fd_to_subdirp failure, try to remove DIR directly,
+ in case it's just an empty directory. */
+ int saved_errno = errno;
+ if (unlinkat (fd_cwd, dir, AT_REMOVEDIR) == 0)
return RM_OK;
- errno = saved_errno;
+ error (0, saved_errno,
+ _("cannot remove %s"), quote (full_filename (dir)));
}
- /* CAUTION: this test and diagnostic are identical to those
- following the other use of fd_to_subdirp. */
- if (errno != ENOENT || !x->ignore_missing_files)
- error (0, errno,
- _("cannot remove %s"), quote (full_filename (dir)));
-
return RM_ERROR;
}