On Sun, 18 Nov 2012, Chris Rees wrote:
On 18 Nov 2012 20:39, "Ed Schouten" <e...@80386.nl> wrote:
Hi Chris,
2012/11/18 Chris Rees <cr...@freebsd.org>:
Modified: head/etc/rc.initdiskless
==============================================================================
--- head/etc/rc.initdiskless Sun Nov 18 14:05:28 2012
(r243227)
+++ head/etc/rc.initdiskless Sun Nov 18 14:21:05 2012
(r243228)
@@ -354,7 +354,7 @@ for i in ${templates} ; do
subdir=${j##*/}
if [ -d $j -a ! -f $j.cpio.gz ]; then
create_md $subdir
- cp -Rp $j/ /$subdir
+ (cd $j && pax -rw . /$subdir)
fi
done
for j in /conf/$i/*.cpio.gz ; do
Are you sure that this bug wasn't already fixed? The original version
of the code in the bug report used the following line:
- cp -Rp $j/* /$subdir
The old version of the code you changed didn't have this asterisk,
meaning dotfiles would already be copied. Still, you could argue that
your version is nicer, as our behaviour of cp with the trailing slash
contradicts POSIX.
I don't think POSIX is that broken.
You are correct, and the second to point it out :)
As you say however, pax is technically how it should be done anyway, and
has the nice effect of also preserving hard links. If no-one objects I
think it should stay in.
Not perserving hard links is a bug in cp -R. Another bug in cp -Rp is that
it doesn't preserve mtimes for directories. But a non-broken cp -Rp would
be nicer than non-broken use of pax, and even a broken cp -Rp is better than
a broken use of pax. The above use of pax is semantically very different
from cp -Rp, and introduces the following bugs:
- no error checking for cd. We have just checked that $j is a directory.
If it should somehow go away, then the errors from cp -Rp of it are more
fail-safe than the errors from not checking for cd failure.
- cp -R creates the target directory /$subdir if it doesn't already exist
(and its path prefix does exist and is a directory or a symlink to a
directory), but pax doesn't If /$subdir does already exist, then there
are races similar to the ones for the source directory if the target
directory goes away, and pax handles them differently.
- -p was used in 'cp -Rp' to preserve all attributes. The corresponding
flags are not used in 'pax -rw'. They are '-p e'. By default,
pax preserves file times (so '-p am' is part of the default). pax's
man page seems to say that the file mode is not preserved by default
and that '-p p' (or '-p e') must be used to preserve it, but in my
tests under FreeBSD-~5.2 it was preserved. The uid and gid can only
be preserved by root, and it is the default to not preserve them even
for root. Root should use '-p e' or '-p o' to preseve them, just like
-p was used with cp -Rp.
pax is little used and poorly maintained. It has no support for acls,
while cp has some. Pax hasn't caught up with the creation of utimes(2)
in 4.2BSD, so it still clobbers the tv_nsec part of file times when it
"preserves" them (though it uses lutimes(2)), while cp only clobbers
the last 3 decimal digits in the tv_nsec part of file times when it
"preserves" them. So even with '-p e', pax often clobbers file times
and never preserves acls even. Maybe this doesn't matter here. But
pax is unusable in general. I normally use cp -pR when I don't care
about links or file times (which is rarely), else gnu tar if I care
about links but not file times, else bsd tar occasionally for its
better handling of file times (tar format just can't handle all the
times well, and bsd tar handles them slightly less badly), else
gnu tar following by a fixup program to duplicate all the times.
gnu cp -a should work best, but I haven't used it lately.
Bruce
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"