From owner-svn-src-all@FreeBSD.ORG Mon Nov 19 08:03:33 2012 Return-Path: Delivered-To: svn-src-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 52D2FC79; Mon, 19 Nov 2012 08:03:33 +0000 (UTC) (envelope-from brde@optusnet.com.au) Received: from mail05.syd.optusnet.com.au (mail05.syd.optusnet.com.au [211.29.132.186]) by mx1.freebsd.org (Postfix) with ESMTP id DC1E88FC0C; Mon, 19 Nov 2012 08:03:32 +0000 (UTC) Received: from c122-106-175-26.carlnfd1.nsw.optusnet.com.au (c122-106-175-26.carlnfd1.nsw.optusnet.com.au [122.106.175.26]) by mail05.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id qAJ83ALQ006413 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 19 Nov 2012 19:03:17 +1100 Date: Mon, 19 Nov 2012 19:03:10 +1100 (EST) From: Bruce Evans X-X-Sender: bde@besplex.bde.org To: Chris Rees Subject: Re: svn commit: r243228 - head/etc In-Reply-To: Message-ID: <20121119175936.J1085@besplex.bde.org> References: <201211181421.qAIEL5KT042019@svn.freebsd.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: svn-src-head@FreeBSD.org, Ed Schouten , svn-src-all@FreeBSD.org, src-committers@FreeBSD.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Nov 2012 08:03:33 -0000 On Sun, 18 Nov 2012, Chris Rees wrote: > On 18 Nov 2012 20:39, "Ed Schouten" wrote: >> >> Hi Chris, >> >> 2012/11/18 Chris Rees : >>> 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