summaryrefslogtreecommitdiff
path: root/src/copy.c
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2012-04-12 12:47:30 +0100
committerPádraig Brady <P@draigBrady.com>2012-04-12 18:35:17 +0100
commit3d53e7fe1c31aa440cc9708c7c51db6b78c07653 (patch)
tree13fc2d863087f5a0e2664592aa4902308e6fb0f0 /src/copy.c
parent7e0ef7c035a4ef331dfd5019465ad00171a7b800 (diff)
downloadcoreutils-3d53e7fe1c31aa440cc9708c7c51db6b78c07653.tar.xz
cp: change --attributes-only to not truncate existing files
* src/copy.c (copy_reg): Don't truncate an existing file, to support copying attributes between existing files. The original use case only considered creating new files, and it would be a very unusual use case to be relying on the truncating behavior. * doc/coreutils.texi (cp invocation): Mention the non truncating behavior. * tests/cp/attr-existing: A new test to ensure O_TRUNC skipped. * tests/Makefile.am: Reference the new test. * NEWS: Mention the change in behavior.
Diffstat (limited to 'src/copy.c')
-rw-r--r--src/copy.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/copy.c b/src/copy.c
index f63a72696..414fbe0e8 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -826,7 +826,9 @@ copy_reg (char const *src_name, char const *dst_name,
by the specs for both cp and mv. */
if (! *new_dst)
{
- dest_desc = open (dst_name, O_WRONLY | O_TRUNC | O_BINARY);
+ int open_flags =
+ O_WRONLY | O_BINARY | (x->data_copy_required ? O_TRUNC : 0);
+ dest_desc = open (dst_name, open_flags);
dest_errno = errno;
/* When using cp --preserve=context to copy to an existing destination,