summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Voelker <mail@bernhard-voelker.de>2013-11-21 01:03:15 +0100
committerBernhard Voelker <mail@bernhard-voelker.de>2013-11-21 11:43:48 +0100
commit2da7009d70693d830393021f2751729d06ce5551 (patch)
tree686d6f7ee371b4289109f220d03c68e7896d0f5b
parent65f8a39d90dd223e52c1077a6a37eabf05e95e21 (diff)
downloadcoreutils-2da7009d70693d830393021f2751729d06ce5551.tar.xz
doc: enhance diagnostic when rm skips "." or ".." arguments
The error diagnostic "rm: cannot remove directory: '.'" does not give the user a hint for the reason. Issue a clearer error message. * src/remove.c (rm_fts): Enhance the error diagnostic in the above case to emphasize that skipping is done deliberately. In the corresponding comment, mention that POSIX mandates this behavior. Likewise in the subsequent comment for skipping "/". * doc/coreutils.texi (rm invocation): In the paragraph describing the above behavior, mention that POSIX mandates it.
-rw-r--r--doc/coreutils.texi3
-rw-r--r--src/remove.c12
2 files changed, 10 insertions, 5 deletions
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 035f2e67c..64713dc4a 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -9281,7 +9281,8 @@ the @option{-f} or @option{--force} option is not given, or the
If the response is not affirmative, the file is skipped.
Any attempt to remove a file whose last file name component is
-@file{.} or @file{..} is rejected without any prompting.
+@file{.} or @file{..} is rejected without any prompting, as mandated
+by POSIX.
@emph{Warning}: If you use @command{rm} to remove a file, it is usually
possible to recover the contents of that file. If you want more assurance
diff --git a/src/remove.c b/src/remove.c
index cdbbec5bb..3d386cf24 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -437,17 +437,21 @@ rm_fts (FTS *fts, FTSENT *ent, struct rm_options const *x)
/* Perform checks that can apply only for command-line arguments. */
if (ent->fts_level == FTS_ROOTLEVEL)
{
- /* If the basename of a command line argument is "." or "..",
+ /* POSIX says:
+ If the basename of a command line argument is "." or "..",
diagnose it and do nothing more with that argument. */
if (dot_or_dotdot (last_component (ent->fts_accpath)))
{
- error (0, 0, _("cannot remove directory: %s"),
- quote (ent->fts_path));
+ error (0, 0,
+ _("refusing to remove %s or %s directory: skipping %s"),
+ quote_n (0, "."), quote_n (1, ".."),
+ quote_n (2, ent->fts_path));
fts_skip_tree (fts, ent);
return RM_ERROR;
}
- /* If a command line argument resolves to "/" (and --preserve-root
+ /* POSIX also says:
+ If a command line argument resolves to "/" (and --preserve-root
is in effect -- default) diagnose and skip it. */
if (ROOT_DEV_INO_CHECK (x->root_dev_ino, ent->fts_statp))
{