ftw [Re: cvs commit: src/usr.bin/patch - Imported sources]
Tim Robbins
tjr at freebsd.org
Wed Aug 4 18:07:17 PDT 2004
On Wed, Aug 04, 2004 at 02:05:24PM -0700, David Schultz wrote:
> On Mon, Aug 02, 2004, Tim Robbins wrote:
> > On Mon, Aug 02, 2004 at 10:45:09AM +0700, Alexey Dokuchaev wrote:
> > > On Sun, Aug 01, 2004 at 08:45:55PM +0000, Garance A Drosehn wrote:
> > > > gad 2004-08-01 20:45:55 UTC
> > > >
> > > > FreeBSD src repository
> > > >
> > > > src/usr.bin/patch - Imported sources
> > > > Update of /home/ncvs/src/usr.bin/patch
> > > > In directory repoman.freebsd.org:/tmp/cvs-serv87568
> > > >
> > > > Log Message:
> > > > Import of a BSD-licensed version of `patch', which will eventually
> > > > replace the version we currently have in src/gnu/usr.bin/patch/.
> > > > Among other things, this version includes a --posix option for strict
> > > > POSIX conformance.
> > > >
> > > > This version is the current source from OpenBSD as of today. It is
> > > > their 3.5-release, plus a few updates to patch.c and pch.c that they
> > > > made about three weeks ago.
> > >
> > > May I ask why you preferred OpenBSD's version over NetBSD's? It was
> > > shown in the past that OpenBSD's way of doing thing is a bit rough on
> > > the edges sometimes (humanize_number(3) vs. fmt_scaled(3) and
> > > scan_scaled(3), ftw(3) and nftw(3), etc).
> >
> > Actually, OpenBSD's ftw()/nftw() implementation is better than the one
> > we recently imported, in terms of both style and functionality; I wish we'd
> > gone with it instead. What we have in -CURRENT at the moment is incredibly
> > buggy for such a simple function. The droll, inane comments ("Because
> > errno is our friend") and style violations only make things worse.
>
> I agree about the style. What's wrong with the functionality?
>
> I have no objection to switching to Todd's (much cleaner) [n]ftw()
> implementation, although I'm not aware of any non-stylistic
> problems with the current code.
It calls the user-specified function too many times. For example, it calls
it at least twice for every directory: once when fts_read() returns FTS_D,
once when it returns FTS_DP. It looks like this segment of code is missing
a 'continue':
case FTS_D:
if ((MODE_NFTW != mode) || !(flags & FTW_DEPTH)) {
ftw_flag = FTW_D;
}
break;
and should be this instead:
case FTS_D:
if ((MODE_NFTW != mode) || !(flags & FTW_DEPTH)) {
ftw_flag = FTW_D;
} else
continue;
break;
(and similarly for FTS_DP.) The default case should be 'continue', too.
It should also handle FTS_DC and FTS_DEFAULT.
OpenBSD's implementation gets almost everything right. The only problem
I know of is that they sometimes call the user-specified function twice
when a directory cannot be read. This seems to be non-trivial to fix,
and our current implementation also suffers from this problem.
I'd like it if we could switch to the OpenBSD code.
Tim
More information about the cvs-src
mailing list