Paul Eggert <[EMAIL PROTECTED]> wrote: > [EMAIL PROTECTED] (Andrew Church) writes: > >> The following patch may or may not be correct, but it seems to >> solve the problem for my case. > > Thanks for catching this problem. Too bad it's hard to write a portable > test case for it. > > The patch looks correct to me, but how about this patch instead? It > tries to make the code a bit clearer (and a tiny bit faster).
Thanks to both of you. I've checked in a change that looks a little different still. I prefer not to negate that expression, since doing that makes it less readable. Andrew, the "tiny change" is not a reflection on the value of your patch :-), but merely on its size -- it's a note that since it's small enough that we don't need copyright papers from you. 2007-03-03 Andrew Church <[EMAIL PROTECTED]> (tiny change) Paul Eggert <[EMAIL PROTECTED]> Fix a bug: cp -x would fail to set mount point permissions. * NEWS: mention cp -x bug fix * src/copy.c (copy_internal): Don't return immediately after copying a mount point that we do not intend to recurse under. Based on a patch by Andrew Church. diff --git a/NEWS b/NEWS index 65a7d52..57c51e1 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ GNU coreutils NEWS -*- outline -*- ** Bug fixes + cp -x (--one-file-system) would fail to set mount point permissions + The default block size and output format for df -P are now unaffected by the DF_BLOCK_SIZE, BLOCK_SIZE, and BLOCKSIZE environment variables. It is still affected by POSIXLY_CORRECT, though. diff --git a/src/copy.c b/src/copy.c index 000c248..49bbb8c 100644 --- a/src/copy.c +++ b/src/copy.c @@ -1604,19 +1604,20 @@ copy_internal (char const *src_name, char const *dst_name, emit_verbose (src_name, dst_name, NULL); } - /* Are we crossing a file system boundary? */ + /* Decide whether to copy the contents of the directory. */ if (x->one_file_system && device != 0 && device != src_sb.st_dev) - return true; - - /* Copy the contents of the directory. */ - - if (! copy_dir (src_name, dst_name, new_dst, &src_sb, dir, x, - copy_into_self)) { - /* Don't just return here -- otherwise, the failure to read a - single file in a source directory would cause the containing - destination directory not to have owner/perms set properly. */ - delayed_ok = false; + /* Here, we are crossing a file system boundary and cp's -x option + is in effect: so don't copy the contents of this directory. */ + } + else + { + /* Copy the contents of the directory. Don't just return if + this fails -- otherwise, the failure to read a single file + in a source directory would cause the containing destination + directory not to have owner/perms set properly. */ + delayed_ok = copy_dir (src_name, dst_name, new_dst, &src_sb, dir, x, + copy_into_self); } } else if (x->symbolic_link) _______________________________________________ Bug-coreutils mailing list Bug-coreutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-coreutils