]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
"touch E; mkfifo F; cp -fR F E" no longer fails due to existing E
authorJim Meyering <meyering@redhat.com>
Wed, 2 Apr 2008 13:07:20 +0000 (15:07 +0200)
committerJim Meyering <meyering@redhat.com>
Wed, 2 Apr 2008 16:23:04 +0000 (18:23 +0200)
* src/copy.c (copy_internal): Revert change of 2005-03-01,
4303f0454592421eea48be87777d32a49e1d5e5b
Prompted by Michael Stone, who pointed me to an old bug report from
Ian Jackson: http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/7504
* tests/cp/special-f: New file.  Test for the above.
* tests/cp/Makefile.am (TESTS): Add special-f.
* NEWS: mention this bug fix.

NEWS
src/copy.c
tests/cp/Makefile.am
tests/cp/special-f [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index c05e0adea7feac9a2969f122d3e810b4d990924d..e208b30b8854b96eeeadeb48c396cc1cc2315a14 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,11 @@ GNU coreutils NEWS                                    -*- outline -*-
 
   configure --enable-no-install-program=groups now works.
 
+  "cp -fR fifo E" now succeeds with an existing E.  Before this fix, using
+  -fR to copy a fifo or "special" file onto an existing file would fail
+  with EEXIST.  Now, it once again unlinks the destination before trying
+  to create the destination file.  [bug introduced in coreutils-5.90]
+
   dd once again works with unnecessary options like if=/dev/stdin and
   of=/dev/stdout.  [bug introduced in fileutils-4.0h]
 
index 4e38e00210d46c4a34f78d0269da03c23ba687a2..c2f21a3401463200862ee456e29c50474cd92a68 100644 (file)
@@ -1354,7 +1354,7 @@ copy_internal (char const *src_name, char const *dst_name,
                   && (x->unlink_dest_before_opening
                       || (x->preserve_links && 1 < dst_sb.st_nlink)
                       || (x->dereference == DEREF_NEVER
-                          && S_ISLNK (src_sb.st_mode))
+                          && ! S_ISREG (src_sb.st_mode))
                       ))
            {
              if (unlink (dst_name) != 0 && errno != ENOENT)
index e2f96c9e34c325a9bc325c7f7d86a02d861d8a97..28ebd35a617e119862c8fa176c502a32e0745d11 100644 (file)
@@ -16,6 +16,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 TESTS = \
+  special-f \
   parent-perm \
   abuse \
   proc-zero-len \
diff --git a/tests/cp/special-f b/tests/cp/special-f
new file mode 100755 (executable)
index 0000000..ebcbf8e
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh
+# Ensure that "cp -Rf fifo E" unlinks E and retries.
+# Up until coreutils-6.10.171, it would not.
+
+# Copyright (C) 2008 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 3 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, see <http://www.gnu.org/licenses/>.
+
+if test "$VERBOSE" = yes; then
+  set -x
+  cp --version
+fi
+
+. $srcdir/../envvar-check
+. $srcdir/../lang-default
+. $srcdir/../test-lib.sh
+
+mkfifo fifo ||
+  skip_test_ "fifos not supported"
+touch e || framework-failure
+
+fail=0
+
+# Without -f, expect it to fail.
+cp -R fifo e || fail=1
+
+# With -f, it must succeed.
+cp -Rf fifo e || fail=1
+test -p fifo || fail=1
+
+(exit $fail); exit $fail