summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--NEWS2
-rw-r--r--src/mv.c4
-rw-r--r--src/remove.c10
-rw-r--r--src/remove.h13
-rw-r--r--src/rm.c18
-rw-r--r--tests/rm/Makefile.am3
-rwxr-xr-xtests/rm/i-never53
8 files changed, 100 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index b82902a78..7a80dbf91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2007-01-17 Jim Meyering <jim@meyering.net>
+
+ Make "rm --interactive=never ..." never prompt.
+ * NEWS: Mention this.
+ * src/remove.h (enum rm_interactive): New ternary type.
+ (struct rm_options) [interactive]: Use it, here -- rather than bool.
+ * src/remove.c (prompt): Reflect type change.
+ * src/mv.c (rm_option_init): Initialize to RMI_NEVER now.
+ * src/rm.c (main): Add a FIXME comment for '-d' option.
+ Adapt to type change of rm_options.interactive.
+
+ * tests/rm/i-never: New file. Test for the above fix.
+ * tests/rm/Makefile.am (TESTS): Add i-never.
+
2007-01-15 Jim Meyering <jim@meyering.net>
* bootstrap (gnulib_tool): When adding to .cvsignore and .gitignore,
diff --git a/NEWS b/NEWS
index 76f90d304..a30b17e52 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,8 @@ GNU coreutils NEWS -*- outline -*-
"rm -rf /etc/passwd" (run by non-root) now prints a diagnostic.
Before it would print nothing.
+ "rm --interactive=never F" no longer prompts for an unwritable F
+
* Noteworthy changes in release 6.7 (2006-12-08) [stable]
diff --git a/src/mv.c b/src/mv.c
index 03e96e5a0..1d1dddab8 100644
--- a/src/mv.c
+++ b/src/mv.c
@@ -1,5 +1,5 @@
/* mv -- move or rename files
- Copyright (C) 86, 89, 90, 91, 1995-2006 Free Software Foundation, Inc.
+ Copyright (C) 86, 89, 90, 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -98,7 +98,7 @@ rm_option_init (struct rm_options *x)
/* Should we prompt for removal, too? No. Prompting for the `move'
part is enough. It implies removal. */
- x->interactive = 0;
+ x->interactive = RMI_NEVER;
x->stdin_tty = false;
x->verbose = false;
diff --git a/src/remove.c b/src/remove.c
index fbe720456..97184eb26 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -798,10 +798,14 @@ prompt (int fd_cwd, Dirstack_state const *ds, char const *filename,
*is_empty = T_UNKNOWN;
- if (((!x->ignore_missing_files & (x->interactive | x->stdin_tty))
+ if (x->interactive == RMI_NEVER)
+ return RM_OK;
+
+ if (((!x->ignore_missing_files & ((x->interactive == RMI_ALWAYS)
+ | x->stdin_tty))
&& (write_protected = write_protected_non_symlink (fd_cwd, filename,
ds, sbuf)))
- || x->interactive)
+ || x->interactive == RMI_ALWAYS)
{
if (cache_fstatat (fd_cwd, filename, sbuf, AT_SYMLINK_NOFOLLOW) != 0)
{
@@ -821,7 +825,7 @@ prompt (int fd_cwd, Dirstack_state const *ds, char const *filename,
/* Using permissions doesn't make sense for symlinks. */
if (S_ISLNK (sbuf->st_mode))
{
- if ( ! x->interactive)
+ if (x->interactive != RMI_ALWAYS)
return RM_OK;
write_protected = false;
}
diff --git a/src/remove.h b/src/remove.h
index 2dc617618..ae01e3c6c 100644
--- a/src/remove.h
+++ b/src/remove.h
@@ -1,6 +1,6 @@
/* Remove directory entries.
- Copyright (C) 1998, 2000, 2002, 2003, 2004, 2005, 2006 Free
+ Copyright (C) 1998, 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
@@ -22,13 +22,22 @@
# include "dev-ino.h"
+enum rm_interactive
+{
+ /* Start with any number larger than 1, so that any legacy tests
+ against values of 0 or 1 will fail. */
+ RMI_ALWAYS = 3,
+ RMI_SOMETIMES,
+ RMI_NEVER
+};
+
struct rm_options
{
/* If true, ignore nonexistent files. */
bool ignore_missing_files;
/* If true, query the user about whether to remove each file. */
- bool interactive;
+ enum rm_interactive interactive;
/* If true, do not traverse into (or remove) any directory that is
on a file system (i.e., that has a different device number) other
diff --git a/src/rm.c b/src/rm.c
index 364a21cf5..81f81ec7f 100644
--- a/src/rm.c
+++ b/src/rm.c
@@ -1,5 +1,5 @@
/* `rm' file deletion utility for GNU.
- Copyright (C) 88, 90, 91, 1994-2006 Free Software Foundation, Inc.
+ Copyright (C) 88, 90, 91, 1994-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -213,7 +213,7 @@ static void
rm_option_init (struct rm_options *x)
{
x->ignore_missing_files = false;
- x->interactive = false;
+ x->interactive = RMI_SOMETIMES;
x->one_file_system = false;
x->recursive = false;
x->root_dev_ino = NULL;
@@ -249,25 +249,25 @@ main (int argc, char **argv)
{
case 'd':
/* Ignore this option, for backward compatibility with
- coreutils 5.92. Some time after 2005, we'll change this
+ coreutils 5.92. FIXME: Some time after 2005, change this
to report an error (or perhaps behave like FreeBSD does)
instead of ignoring the option. */
break;
case 'f':
- x.interactive = false;
+ x.interactive = RMI_NEVER;
x.ignore_missing_files = true;
prompt_once = false;
break;
case 'i':
- x.interactive = true;
+ x.interactive = RMI_ALWAYS;
x.ignore_missing_files = false;
prompt_once = false;
break;
case 'I':
- x.interactive = false;
+ x.interactive = RMI_NEVER;
x.ignore_missing_files = false;
prompt_once = true;
break;
@@ -288,18 +288,18 @@ main (int argc, char **argv)
switch (i)
{
case interactive_never:
- x.interactive = false;
+ x.interactive = RMI_NEVER;
prompt_once = false;
break;
case interactive_once:
- x.interactive = false;
+ x.interactive = RMI_SOMETIMES;
x.ignore_missing_files = false;
prompt_once = true;
break;
case interactive_always:
- x.interactive = true;
+ x.interactive = RMI_ALWAYS;
x.ignore_missing_files = false;
prompt_once = false;
break;
diff --git a/tests/rm/Makefile.am b/tests/rm/Makefile.am
index ff31f7518..4c212b9d6 100644
--- a/tests/rm/Makefile.am
+++ b/tests/rm/Makefile.am
@@ -1,6 +1,6 @@
# Make coreutils tests for "rm". -*-Makefile-*-
-# Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
# Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@@ -21,6 +21,7 @@
AUTOMAKE_OPTIONS = 1.1 gnits
TESTS = \
+ i-never \
fail-eacces \
one-file-system \
ignorable \
diff --git a/tests/rm/i-never b/tests/rm/i-never
new file mode 100755
index 000000000..f20e90e78
--- /dev/null
+++ b/tests/rm/i-never
@@ -0,0 +1,53 @@
+#!/bin/sh
+# Ensure that rm --interactive=never works does not prompt, even for
+# an unwritable file.
+
+# Copyright (C) 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ rm --version
+fi
+
+PRIV_CHECK_ARG=require-non-root . $srcdir/../priv-check
+
+pwd=`pwd`
+t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
+trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+framework_failure=0
+mkdir -p $tmp || framework_failure=1
+cd $tmp || framework_failure=1
+touch f || framework_failure=1
+chmod 0 f || framework_failure=1
+touch exp || framework_failure=1
+
+if test $framework_failure = 1; then
+ echo "$0: failure in testing framework" 1>&2
+ (exit 1); exit 1
+fi
+
+fail=0
+
+rm --interactive=never f > out || fail=1
+
+cmp out exp || fail=1
+test $fail = 1 && diff out exp 2> /dev/null
+
+(exit $fail); exit $fail