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-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to