Home | History | Annotate | only in /src/usr.sbin/mtree
History log of /src/usr.sbin/mtree
RevisionDateAuthorComments
 1.34 03-Feb-2013  christos add the ability to only output paths included in a spec file when creating
from a directory (-c)
 1.33 05-Oct-2012  christos Implement FreeBSD's -f spec1 -f spec2 spec comparision function. This
is more useful than -C and diff because it highlights the keys that have
changed value so for example, you can see that the size of a file has
not changed but the contents have. (brooks)
 1.32 22-Apr-2009  lukem branches: 1.32.6; 1.32.12;
Enable WARNS=4 by default, except for:
cpuctl dumplfs hprop ipf iprop-log kadmin kcm kdc kdigest
kimpersonate kstash ktutil makefs ndbootd ntp pppd quot
racoon racoonctl rtadvd sntp sup tcpdchk tcpdmatch tcpdump
traceroute traceroute6 user veriexecgen wsmoused zic
(Mostly third-party applications)
 1.31 12-Dec-2007  christos branches: 1.31.12;
warns=4
 1.30 16-Dec-2006  bouyer branches: 1.30.4;
Don't depend on lubutil if we're building host tools. Fix tools build on
non-NetBSD hosts.
 1.29 14-Dec-2006  he Complete the move of string_to_flags() and flags_to_string() from the
bin/ls sources to libutil:
o Bump libutil minor version number
o Fix uses to include <util.h> to pick up the function definitions
o Fix most uses of flags_to_string() to release the now-malloc()ed result
 1.28 14-Dec-2006  he The "#ifdef UNUSED_BLOCK" in stat_flags.c wasn't so unused after
all -- it was used by the mtree source. So, instead do an "#ifdef
MTREE", and define that one when building mtree.
 1.27 09-Apr-2005  dsl WARNS=3 seems to work for me
 1.26 18-May-2003  lukem Now that <bsd.prog.mk> DTRT if HOSTPROG is defined (i.e, it is a no-op),
there's no need to special-case .include-ing it.
 1.25 30-Nov-2002  lukem tweaks for fparseln(3) move from libutil to libc:
- remove #include <util.h> if nothing else needed it
- remove LDFLAGS+=-lutil if nothing else needed it
 1.24 18-Sep-2002  lukem use NETBSDSRCDIR as appropriate
 1.23 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.22 24-Jan-2002  lukem Add '-N dbdir', to specify that user & group lookups (via pwcache(3)) are to
be done from dbdir/master.passwd and dbdir/group, using simple text file
parsing routines.
 1.21 10-Nov-2001  lukem with local crc.c, don't need usr.bin/cksum in .PATH any more
 1.20 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.19 18-Oct-2001  lukem complete WARNS=2 cleanup (with a bit of ickiness for the fts_open argv issue)
 1.18 09-Oct-2001  enami Make mtree a host tool and use it when appropriate.
 1.17 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.16 10-Sep-2001  lukem replace home-grown parser with fparseln()
 1.15 07-Dec-1999  wennmach code.c is no longer used, we use strsvis instead. Removed prototypes
from extern.h
 1.14 07-Nov-1999  wennmach Encode file names using strvis(3) when creating a specification.
Escape white space characters and `#' characters. Do the inverse
when reading specs.

This is a temporary fix until we have strzouvis(3) (or some such)
which is an improved version of strvis (taking an additional list
of characters to encode).

Fixes PR 5006 and PR 7663
 1.13 10-Oct-1998  mrg branches: 1.13.2; 1.13.6;
add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.12 25-Oct-1997  lukem use CPPFLAGS instead of CFLAGS
 1.11 17-Oct-1997  mrg branches: 1.11.2;
merge lite-2
 1.10 08-May-1997  gwr Back out the .PATH.c changes. The .depend problem (and others)
will be fixed using the new .NOPATH make feature instead.
 1.9 06-May-1997  gwr Use .PATH.c: ...
 1.8 07-Mar-1995  cgd add NetBSD id's
 1.7 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.6 22-Dec-1994  cgd specify man pages the new way.
 1.5 19-Mar-1994  cgd don't forget the man page. from Luke Mewburn <lm@rmit.edu.au>
 1.4 02-Nov-1993  cgd fix oops
 1.3 02-Nov-1993  cgd latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.2 30-Jul-1993  mycroft Add RCS identifiers.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.3 27-Apr-1995  mrg 4.4BSD-Lite2
 1.1.1.2 07-Mar-1995  cgd from 4.4-Lite
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.11.2.1 08-Nov-1997  lukem sync with trunk (approved by thorpej)
 1.13.6.1 27-Dec-1999  wrstuden Pull up to last week's -current.
 1.13.2.1 20-Nov-1999  he Pull up revision 1.14 (requested by wennmach and joda):
Make mtree able to properly encode file names with `funny' albeit
legal characters (`#', ` ', binary characters), fixing PR#5006 and
PR#7663.
 1.30.4.1 09-Jan-2008  matt sync with HEAD
 1.31.12.1 13-May-2009  jym Sync with HEAD.

Third (and last) commit. See http://mail-index.netbsd.org/source-changes/2009/05/13/msg221222.html
 1.32.12.2 25-Feb-2013  tls resync with head
 1.32.12.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.32.6.2 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.32.6.1 30-Oct-2012  yamt sync with head
 1.5 07-Dec-1999  wennmach code.c is no longer used, we use strsvis instead. Removed prototypes
from extern.h
 1.4 12-Nov-1999  wennmach branches: 1.4.2;
Add __RCSID()
 1.3 09-Nov-1999  wennmach Add RCS tag
 1.2 09-Nov-1999  drochner prototype encode()/decode()
 1.1 07-Nov-1999  wennmach Encode file names using strvis(3) when creating a specification.
Escape white space characters and `#' characters. Do the inverse
when reading specs.

This is a temporary fix until we have strzouvis(3) (or some such)
which is an improved version of strvis (taking an additional list
of characters to encode).

Fixes PR 5006 and PR 7663
 1.4.2.2 12-Nov-1999  wennmach Add __RCSID()
 1.4.2.1 12-Nov-1999  wennmach file code.c was added on branch netbsd-1-4 on 1999-11-12 14:42:36 +0000
 1.61 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.60 03-Apr-2021  simonb branches: 1.60.8;
Deal with the case when a device gets recreated (eg when mtree is called by
MAKEDEV) and the stat buffer contains information about the original device
before checking/setting the owner/group/mode of the new device file.
 1.59 18-Mar-2021  cheusov mtree: use POSIX type uint32_t instead of u_int32_t
 1.58 21-Nov-2013  christos From Brooks Davis:
When comparing a directory to an mtree file NetBSD mtree has output like
this:

xxx: size (4, 5)
md5digest (0x6de9439834c9147569741d3c9c9fc010, 0xa5d119ab8edcda0ef7f381da8=
f52f92f)
=2E/yyy missing

FreeBSD's historical behavior is this:

xxx changed
size expected 4 found 5
md5digest expected 6de9439834c9147569741d3c9c9fc010 found a5d119ab8edcda0e=
f7f381da8f52f92f
=2E/yyy missing

FreeBSD's mergemaster -U command depends on the latter behavior so
the following patch alters the freebsd9 mode of mtree to output
that format. I don't think programs should rely on this output one way
or another since it's clearly meant for humans, but this seems like the
easiest short term fix.
 1.57 17-Oct-2013  christos Our <sys/param.h> ends up calling header files that define intmax_t. This
should not be the case (but >sys/param.h> is not a standard header so all bets
are off). FreeBSD's does not, so explicitly include <stdint.h> to get it.
 1.56 09-Sep-2013  christos use intmax_t instead of long long. fixes wrong cast for time_t.
 1.55 05-Oct-2012  christos account for differences in digest names
 1.54 05-Oct-2012  christos explicitly include <sys/stat.h>
 1.53 05-Oct-2012  christos more const
check if we support SHA384 before using
(brooks)
 1.52 28-Dec-2008  christos branches: 1.52.8; 1.52.14;
fix dev_t formats.
 1.51 04-Feb-2007  elad The hashing routines (MD5File() and co.) can do dynamic allocation, so
take advantage of that instead of an ugly hard-coded MAXHASHLEN limit
that needs updating.

I think this was suggested by cube@ years ago.
 1.50 14-Dec-2006  he Fix mtree to release the returned strings from flags_to_string()
following the move of it from bin/ls to libutil and the change of
it to return malloc()ed memory.
 1.49 30-Oct-2006  christos kill crypto/rmd160.h and crypto/sha2.h, and instead make symlinks to
/usr/include from /usr/include/sys. This makes all the one way hash
header handling identical.
 1.48 24-Sep-2005  elad Use crypto/rmd160.h.
 1.47 02-Sep-2005  elad Use MAXHASHLEN here too.
 1.46 24-Aug-2005  elad Add SHA2 support in mtree.
 1.45 22-Jul-2004  lukem branches: 1.45.2;
Implement -M to "merge" entries, even with different types.
This can be used in /etc/security to allow special.local to override
types of entries in special (e.g, replacing a dir with a link).

Rename Wflag to mtree_Wflag, to be more "external namespace" friendly.
 1.44 20-Jun-2004  jmc Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.43 07-Aug-2003  agc branches: 1.43.2;
Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.42 08-Oct-2002  lukem Remove convoluted code to work around missing lch{flags,mod,own}();
instead, rely upon libnbcompat to provide a workaround (which returns
an error if the target is a symlink).
Should fix another MacOS X build issue due to missing lchown(2).
 1.41 06-Oct-2002  lukem - Check HAVE_LCHFLAGS for lchflags(2) support, rather than assuming
that HAVE_STRUCT_STAT_ST_FLAGS implies this.
- Set HAVE_LCHFLAGS for native builds
- Clean up {CLEAR,SET,CHANGE}FLAGS macros, and only provide if
HAVE_STRUCT_STAT_ST_FLAGS is set.

(Fixes compilation as a tool on MacOS X, noted by Allen Briggs.)
 1.40 08-Feb-2002  tv Funtion appropriately in the absence of a lchmod call on the host.
 1.39 04-Feb-2002  lukem - use lch*() instead of ch*() to change permissions, so that links in
the specfile don't confuse things. doesn't affect the default
(physical) operation, and shouldn't affect logical either.
- slightly rework how miss() is implemented so that duplicated code is
reduced and links may optionally have a mode, uname and/or gname.
 1.38 31-Jan-2002  tv Protect __RCSID and __COPYRIGHT from being invoked if not defined.
 1.37 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.36 10-Nov-2001  lukem provide the ability to remove support for generating or checking various
digests by #define-ing NO_MD5, NO_RMD160, or NO_SHA1. the keywords are
still parsed.
 1.35 09-Nov-2001  lukem Generally don't need the extra byte in MAXPATHLEN sized buffers, because
pathnames are guaranteed by POSIX to be MAXPATHLEN-1 bytes long.
Kindly pointed out by Warner Losh in private email.
 1.34 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.33 25-Oct-2001  lukem Add -W: don't attempt to change the perms/time/flags on existing entries, nor
set them when creating new directories. (AKA the ``don't whack'' option).
Concept suggested by Todd Vierling.
 1.32 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.31 18-Oct-2001  lukem need semicolon between goto label and closing brace
 1.30 18-Oct-2001  lukem make this mostly WARNS=2 safe
 1.29 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.28 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.27 01-Oct-2001  lukem - implement -D - dump the specfile out in a manner that's parseable
by various tools
- implement -R key - remove the given key(s) from the list of keys to print
(now it's possible with "-k type -R type" to remove all keys :)
- rename ftype() to nodetype(), and make it public
- use pwcache(3) functions instead of get{gr,pw}{nam,uid}(3)
- add dump_nodes(), which provides the guts for -D.
 1.26 22-Sep-2001  perry Add a -l flag which does "loose" permissions checks, i.e. a mode 444
matches a check for mode 644 (though obviously not the reverse). This
can be used by the nightly security run, making the output1 more useful
by having it contain fewer spurious permissions violations.

Note that I did not make -l work if you have a sgid/suid/sticky bit
set. I don't know how you could cause security trouble with more
stringent settings and a suid file, but I don't want to find out the
hard way.
 1.25 18-Jul-2001  lukem - add parsetype() (a la parsekey()) to parse the "type=xxx" arg. this improves
the error detection for invalid types, as well as shrinking binary size
- implement inotype() using ftype(), rather than duplicating the switch
- change "char *" arguments to "const char *"
 1.24 09-Mar-2001  simonb ANSIfy, KNF, in preperation for more work.
 1.23 05-Jan-2001  lukem use %ll_ instead of the less standard %q_
 1.22 10-Jul-1999  christos branches: 1.22.8;
fix thinko in mtime stuff.
 1.21 06-Jul-1999  christos portability fixes:
- don't use timespecs in struct stat on non 4.4BSD systems
- don't assume that tv_sec is a time_t
 1.20 11-Feb-1999  mrg - add -m and -i to change file flags more usefully.
- fix bugs in fileflags checking

all of the above from dr. lex wennmacher <wennmach@geo.Uni-Koeln.DE>
with some error fixes from egcs via myself.
 1.19 19-Dec-1998  christos Appease gcc-2.8.1, make printf formats more portable.
 1.18 06-Dec-1998  jwise Add an `md5' keyword to mtree, which takes as an argument the MD5 cryptographic
checksum of the file in question, optionally preceeded by `0x'.

This has been tested, and does work, AFAICT. There is currently no md5 equivalent
of the '-s' flag for use with checksum.
 1.17 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.16 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.15 27-Aug-1998  ross Add {} pairs to shut up egcs.
 1.14 24-Oct-1997  enami Make this compile again on NetBSD/alpha; cast off_t variable to long long
so that it matches printf format `%qd'.
 1.13 17-Oct-1997  lukem branches: 1.13.2;
WARNSify, getopt returns -1 not EOF
 1.12 11-Jul-1997  mikel fix printf() formats, make explicit comparisons to NULL (gcc -Wall)
 1.11 05-Sep-1996  mycroft Add a `-t' option to update time stamps.
 1.10 01-Feb-1996  jtc branches: 1.10.4;
Rename struct timespec fields to conform to POSIX.1b
 1.9 22-Oct-1995  pk Insert parentheses to get correct precedence when comparing time-stamps
(from Arne Juul; PR#1660).
 1.8 07-Mar-1995  cgd add NetBSD id's
 1.7 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.6 27-Mar-1994  cgd off_t exp.
 1.5 17-Nov-1993  cgd make things a bit more consistent
 1.4 02-Nov-1993  cgd latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.3 06-Aug-1993  deraadt update for fts library change
 1.2 01-Aug-1993  mycroft Add RCS identifiers.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.2 07-Mar-1995  cgd from 4.4-Lite
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.10.4.1 10-Dec-1996  mycroft From trunk:
Don`t record sizes for things other than regular files.
Add a `-t' option to update time stamps.
 1.13.2.1 24-Oct-1997  mellon Pull rev 1.14 up from trunk
 1.22.8.1 09-Dec-2001  he Pull up revision 1.26 (requested by lukem):
Add an ``-l'' flag which does ``loose'' permission checks.
 1.43.2.1 22-Jun-2004  tron Pull up revision 1.44 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.45.2.2 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.45.2.1 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.52.14.2 20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.52.14.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.52.8.2 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.52.8.1 30-Oct-2012  yamt sync with head
 1.60.8.1 02-Aug-2025  perseant Sync with HEAD
 1.11 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.10 18-Mar-2021  cheusov branches: 1.10.8;
mtree: use POSIX type uint32_t instead of u_int32_t
 1.9 05-Oct-2012  christos remove dup extern (brooks)
 1.8 02-Jun-2005  lukem branches: 1.8.42; 1.8.48;
appease gcc -Wuninitialized
 1.7 06-Feb-2005  perry ANSIfy function declaration, remove register declarations, and some
minor KNFing.
 1.6 20-Jun-2004  jmc Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.5 07-Aug-2003  agc branches: 1.5.2;
Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.4 31-Jan-2002  tv Protect __RCSID and __COPYRIGHT from being invoked if not defined.
 1.3 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.2 10-Nov-2001  lukem need <stdio.h> and <time.h> for mtree.h
 1.1 10-Nov-2001  mycroft Add a separate version of the CRC routine that listens to sflag.
 1.5.2.1 22-Jun-2004  tron Pull up revision 1.6 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.8.48.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.8.42.1 30-Oct-2012  yamt sync with head
 1.10.8.1 02-Aug-2025  perseant Sync with HEAD
 1.79 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.78 24-Apr-2024  christos branches: 1.78.2;
For the NetBSD tools build we provide our own fts.h not FreeBSD's so the
comparator should have the NetBSD signature.
 1.77 02-Dec-2023  christos PR/57735: Jose Louis Duran: check if fts_read(3) had an error.
(FreeBSD commit https://github.com/freebsd/freebsd-src/commit/\
2dfa4b66b3d0caaaae6ce2df476b5615f8415a19)
 1.76 18-Nov-2018  sevan branches: 1.76.10;
Adjust test, we only want to return the structure member if the result is not NULL.

Heads up by Sascha Wildner @ DragonFly BSD.
 1.75 31-Dec-2017  christos branches: 1.75.2; 1.75.4;
factor out common code from Poul-Henning Kamp.
 1.74 14-Dec-2017  christos use uintmax_t for nlink_t from FreeBSD
 1.73 24-Apr-2014  christos branches: 1.73.2; 1.73.16;
Pass a file pointer to write data instead of writing to stdout.
No functional change.
 1.72 17-Oct-2013  christos branches: 1.72.2;
Our <sys/param.h> ends up calling header files that define intmax_t. This
should not be the case (but >sys/param.h> is not a standard header so all bets
are off). FreeBSD's does not, so explicitly include <stdint.h> to get it.
 1.71 16-Oct-2013  christos Restore old behavior of not printing sizes for directories, since it varies
depending on filesystem implementation. (Brooks Davis)
 1.70 09-Sep-2013  christos use intmax_t instead of long long. fixes wrong cast for time_t.
 1.69 03-Feb-2013  christos add the ability to only output paths included in a spec file when creating
from a directory (-c)
 1.68 20-Dec-2012  christos Implement the "flavor" output discussed in tech-userlevel@, by Brooks Davis
 1.67 15-Dec-2012  christos make us compatible with FreeBSD (for -n) (Brooks Davies)
 1.66 12-Dec-2012  christos -n is incorrectly supressing the ".." lines. (Brooks Davis)
 1.65 05-Oct-2012  christos Allow uid and uname or gid and gname to both be printed while
preserving the behavior of falling back to [ug]id when the name is not
resolvable. (brooks)
 1.64 05-Oct-2012  christos clarify seconds.09nanoseconds format (brooks)
 1.63 05-Oct-2012  christos add -j flag to indent directory blocks (from brooks)
 1.62 05-Oct-2012  christos add -n flag to disable comments (brook)
 1.61 05-Oct-2012  christos our fts compare routine is less constified.
 1.60 05-Oct-2012  christos more const
check if we support SHA384 before using
(brooks)
 1.59 15-Jul-2012  spz branches: 1.59.2;
resource leak (Coverity issues 274383 and 274384)
 1.58 03-Apr-2009  apb branches: 1.58.6;
Make "mtree -C" sort its output.

As the input is read from a specfile into a tree of linked lists,
keep each linked list sorted. The sort order is the same as that
already used by "mtree -c": directories sort after non-directories, but
otherwise names are sorted in the order used by strcmp().
 1.57 01-Feb-2009  hubertf branches: 1.57.2;
When {MD5,RMD160,SHA1,SHA256_,SHA384_,SHA512_}File fail, use errno
to print what's actually wrong
 1.56 28-Dec-2008  christos fix dev_t formats.
 1.55 05-Dec-2007  christos PR/37482: Malcolm Herbert: mtree does not check for getlogin() returning null
in spec create
 1.54 19-Nov-2007  rillig Renamed dsort to dcmp, since it doesn't sort, it only compares.
 1.53 19-Nov-2007  rillig Even on non-BSD systems, the "-R all" option should disable printing of
the "time" attribute. Noticed by Malcolm Herbert on tech-pkg.
 1.52 18-Oct-2007  christos cast to long explicitly for the compat build
 1.51 04-Feb-2007  elad branches: 1.51.4;
The hashing routines (MD5File() and co.) can do dynamic allocation, so
take advantage of that instead of an ugly hard-coded MAXHASHLEN limit
that needs updating.

I think this was suggested by cube@ years ago.
 1.50 30-Oct-2006  christos kill crypto/rmd160.h and crypto/sha2.h, and instead make symlinks to
/usr/include from /usr/include/sys. This makes all the one way hash
header handling identical.
 1.49 24-Sep-2005  elad Use crypto/rmd160.h.
 1.48 02-Sep-2005  elad Use MAXHASHLEN here too.
 1.47 24-Aug-2005  elad Add SHA2 support in mtree.
 1.46 01-Dec-2004  lukem branches: 1.46.2;
strsvis(3) encode & decode the "link=" value (symlink target).
 1.45 20-Jun-2004  jmc Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.44 27-Oct-2003  lukem branches: 1.44.2;
Overhaul how `build.sh tools' are used:

* Rename "config.h" to "nbtool_config.h" and
HAVE_CONFIG_H to HAVE_NBTOOL_CONFIG_H.
This makes in more obvious in the source when we're using
tools/compat/config.h versus "standard autoconf" config.h

* Consistently move the inclusion of nbtool_config.h to before
<sys/cdefs.h> so that the former can provide __RCSID() (et al),
and there's no need to protect those macros any more.

These changes should make it easier to "tool-ify" a program by adding:
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
to the top of the source files (for the general case).
 1.43 07-Aug-2003  agc Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.42 23-Dec-2002  lukem Add -C, which dumps the specification with the full path name first,
and then all the other fields. (I.e, like -D except with the name
first instead of last).
Consistenly strsvis(3) encode path names (even for -C and -D).
 1.41 29-Nov-2002  grant avoid non-constant initializer errors by changing hack to workaround
gcc warning to a slightly different hack.
 1.40 08-Aug-2002  soren Remove extraneous \n's in {err,warn}{,x} that used to be printfs.
 1.39 31-Jan-2002  tv Protect __RCSID and __COPYRIGHT from being invoked if not defined.
 1.38 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.37 10-Nov-2001  lukem provide the ability to remove support for generating or checking various
digests by #define-ing NO_MD5, NO_RMD160, or NO_SHA1. the keywords are
still parsed.
 1.36 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.35 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.34 18-Oct-2001  lukem complete WARNS=2 cleanup (with a bit of ickiness for the fts_open argv issue)
 1.33 18-Oct-2001  lukem make this mostly WARNS=2 safe
 1.32 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.31 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.30 01-Oct-2001  lukem - implement -D - dump the specfile out in a manner that's parseable
by various tools
- implement -R key - remove the given key(s) from the list of keys to print
(now it's possible with "-k type -R type" to remove all keys :)
- rename ftype() to nodetype(), and make it public
- use pwcache(3) functions instead of get{gr,pw}{nam,uid}(3)
- add dump_nodes(), which provides the guts for -D.
 1.29 09-Mar-2001  simonb ANSIfy, KNF, in preperation for more work.
 1.28 20-Feb-2001  hubertf Remove all the "#ifdef __APPLE__" code, to make this actually
build again on Darwin. The code in question is outdated.

OK'd by Wilfredo Sanchez wsanchez@MIT.EDU.
 1.27 15-Oct-2000  is LP64 format string cleanup. Problem reported by garbled.
 1.26 11-Oct-2000  is More format string cleanups by sommerfeld.
 1.25 01-Dec-1999  wennmach branches: 1.25.4;
Now that we have strsvis, use it.
 1.24 07-Nov-1999  wennmach Encode file names using strvis(3) when creating a specification.
Escape white space characters and `#' characters. Do the inverse
when reading specs.

This is a temporary fix until we have strzouvis(3) (or some such)
which is an improved version of strvis (taking an additional list
of characters to encode).

Fixes PR 5006 and PR 7663
 1.23 06-Jul-1999  christos branches: 1.23.4;
portability fixes:
- don't use timespecs in struct stat on non 4.4BSD systems
- don't assume that tv_sec is a time_t
 1.22 06-Jul-1999  hubertf Actually generate MD5 checksums, as reported in PR 7928.
Approved by Dr. Lex Wennmacher <wennmach@geo.Uni-Koeln.DE>
 1.21 11-Feb-1999  mrg branches: 1.21.2;
- add -m and -i to change file flags more usefully.
- fix bugs in fileflags checking

all of the above from dr. lex wennmacher <wennmach@geo.Uni-Koeln.DE>
with some error fixes from egcs via myself.
 1.20 19-Dec-1998  christos Appease gcc-2.8.1, make printf formats more portable.
 1.19 03-Nov-1998  christos Namespace protection against MAXUID etc.
 1.18 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.17 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.16 30-Aug-1998  nathanw Add braces to satisfy egcs.
 1.15 27-Aug-1998  ross Add {} pairs to shut up egcs.
 1.14 06-Jul-1998  mrg - use an array MAXHOSTNAMELEN+1 size to hold hostnames
- ensure hostname from gethostname() is nul-terminated in all cases
- minor KNF
- use MAXHOSTNAMELEN over various other values/defines
- be safe will buffers that hold hostnames
 1.13 17-Oct-1997  lukem WARNSify, getopt returns -1 not EOF
 1.12 11-Jul-1997  mikel fix printf() formats, make explicit comparisons to NULL (gcc -Wall)
 1.11 05-Sep-1996  mycroft Only record sizes for regular files.
 1.10 01-Feb-1996  jtc branches: 1.10.4;
Rename struct timespec fields to conform to POSIX.1b
 1.9 07-Mar-1995  cgd add NetBSD id's
 1.8 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.7 27-Mar-1994  cgd off_t exp.
 1.6 17-Nov-1993  cgd make things a bit more consistent
 1.5 02-Nov-1993  cgd latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.4 01-Oct-1993  jtc Use *->fts_errno instead of errno after fts_read(). The fts manpage
indicates that the fts_errno will be set to the correct value, but there
are no guarentees about errno.
 1.3 06-Aug-1993  deraadt update for fts library change
 1.2 01-Aug-1993  mycroft Add RCS identifiers.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.2 07-Mar-1995  cgd from 4.4-Lite
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.10.4.1 10-Dec-1996  mycroft From trunk:
Don`t record sizes for things other than regular files.
Add a `-t' option to update time stamps.
 1.21.2.3 19-Oct-2000  he Pull up revision 1.26 (via patch, requested by he):
Format string cleanup.
 1.21.2.2 19-Oct-2000  he Pull up revision 1.27 (via patch, requested by is):
Format string cleanup for LP64.
 1.21.2.1 20-Nov-1999  he Pull up revision 1.24 (requested by wennmach and joda):
Make mtree able to properly encode file names with `funny' albeit
legal characters (`#', ` ', binary characters), fixing PR#5006 and
PR#7663.
 1.23.4.1 27-Dec-1999  wrstuden Pull up to last week's -current.
 1.25.4.1 17-Oct-2000  tv Pullup usr.sbin string format fixes [is].
See "cvs log" for explicit revision numbers per file, from sommerfeld.
 1.44.2.1 22-Jun-2004  tron Pull up revision 1.45 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.46.2.1 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.51.4.2 09-Jan-2008  matt sync with HEAD
 1.51.4.1 06-Nov-2007  matt sync with HEAD
 1.57.2.1 13-May-2009  jym Sync with HEAD.

Third (and last) commit. See http://mail-index.netbsd.org/source-changes/2009/05/13/msg221222.html
 1.58.6.4 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.58.6.3 23-Jan-2013  yamt sync with head
 1.58.6.2 16-Jan-2013  yamt sync with (a bit old) head
 1.58.6.1 30-Oct-2012  yamt sync with head
 1.59.2.3 20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.59.2.2 25-Feb-2013  tls resync with head
 1.59.2.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.72.2.1 10-Aug-2014  tls Rebase.
 1.73.16.1 24-Nov-2018  martin Pull up following revision(s) (requested by sevan in ticket #1103):

usr.sbin/mtree/create.c: revision 1.76

Adjust test, we only want to return the structure member if the result
is not NULL.

Heads up by Sascha Wildner @ DragonFly BSD.
 1.73.2.1 24-Nov-2018  martin Pull up following revision(s) (requested by sevan in ticket #1654):

usr.sbin/mtree/create.c: revision 1.76

Adjust test, we only want to return the structure member if the result
is not NULL.

Heads up by Sascha Wildner @ DragonFly BSD.
Adjust test, we only want to return the structure member if the result
is not NULL.
 1.75.4.1 10-Jun-2019  christos Sync with HEAD
 1.75.2.1 26-Nov-2018  pgoyette Sync with HEAD, resolve a couple of conflicts
 1.76.10.1 28-Apr-2024  martin Pull up following revision(s) (requested by hgutch in ticket #677):

usr.sbin/mtree/create.c: revision 1.78
external/gpl3/gcc.old/dist/gcc/cp/cfns.h: revision 1.12
(applied to external/gpl3/gcc/dist/gcc/cp/cfns.h)

For the NetBSD tools build we provide our own fts.h not FreeBSD's so the
comparator should have the NetBSD signature.

Fix gcc build on FreeBSD 14 (and possibly other systems using clang >= 16).
Pointed out by Eirik �verby.
OK mrg@
 1.78.2.1 02-Aug-2025  perseant Sync with HEAD
 1.13 20-Jun-2004  jmc Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.12 17-Nov-2003  dbj branches: 1.12.2;
#include <util.h>
this is needed by fparseln on macos/darwin and is harmless on netbsd
 1.11 30-Nov-2002  lukem tweaks for fparseln(3) move from libutil to libc:
- remove #include <util.h> if nothing else needed it
- remove LDFLAGS+=-lutil if nothing else needed it
 1.10 09-Apr-2002  bjh21 Don't use __RCSID unless it's defined.
 1.9 09-Apr-2002  thorpej Use __RCSID().
 1.8 31-Jan-2002  tv Roll in fixes to permit cross-compiling from non-NetBSD hosts. This
round has been tested on Solaris/x86 and Linux hosts.

* Add host tools cap_mkdb, ctags, m4, uudecode.
* Protect __RCSID() and __COPYRIGHT() better.
* Reduce the number of places that need to include "config.h", to keep
sources closer to their "vanilla" versions.
* Add more compat #defines and autoconf-checked functions.
 1.7 29-Jan-2002  tv Make almost all tools compile and run properly on non-NetBSD hosts. (In
particular, most tools now run correctly on Solaris 7.)
 1.6 29-Jan-2002  lukem add <util.h> back in for native builds.
 1.5 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.4 11-Nov-2001  jmc Ugg...Turn LIST_FOREACH into a while loop around LIST_NEXT...

The *_FOREACH macros got added post 1.5 and were pulled up into 1.5.2. This
makes it impossible to compile mtree local on a 1.5-release box as a cross
toolchain bit for bootstrapping to -current. (and why I never saw this problem
on my 1.5.2 machine)

This whole thing is solved via a compat lib for the tools for all netbsd bits
and/or trimming down a version of mtree to just the bits needed for building
the snapshots.
 1.3 10-Nov-2001  lukem replace <sys/time.h> with <time.h> (for consistency)
 1.2 07-Nov-2001  lukem - KNF & whitespace cleanup
- use fparseln() instead of fgetln()
 1.1 07-Nov-2001  lukem branches: 1.1.1;
Initial revision
 1.1.1.1 07-Nov-2001  lukem Code from FreeBSD to give mtree the ability to exclude items from its traversal
 1.12.2.1 22-Jun-2004  tron Pull up revision 1.13 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.41 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.40 18-Mar-2021  cheusov branches: 1.40.8;
mtree: use POSIX type uint32_t instead of u_int32_t
 1.39 24-Apr-2014  christos Pass a file pointer to write data instead of writing to stdout.
No functional change.
 1.38 03-Feb-2013  christos branches: 1.38.6;
add the ability to only output paths included in a spec file when creating
from a directory (-c)
 1.37 20-Dec-2012  christos Implement the "flavor" output discussed in tech-userlevel@, by Brooks Davis
 1.36 05-Oct-2012  christos Implement FreeBSD's -f spec1 -f spec2 spec comparision function. This
is more useful than -C and diff because it highlights the keys that have
changed value so for example, you can see that the size of a file has
not changed but the contents have. (brooks)
 1.35 05-Oct-2012  christos add -j flag to indent directory blocks (from brooks)
 1.34 05-Oct-2012  christos add -q flag to silence warnings about symlinks to existing dirs (from OpenBSD
via brooks)
 1.33 05-Oct-2012  christos add -n flag to disable comments (brook)
 1.32 29-Aug-2011  joerg branches: 1.32.2; 1.32.8;
Use __dead and __printflike
 1.31 08-Apr-2009  apb The recent addition of sorting to "mtree -C" broke some third party
scripts. Now make sorting optional, controled by the "-S" flag.
 1.30 14-Dec-2006  he branches: 1.30.20;
Complete the move of string_to_flags() and flags_to_string() from the
bin/ls sources to libutil:
o Bump libutil minor version number
o Fix uses to include <util.h> to pick up the function definitions
o Fix most uses of flags_to_string() to release the now-malloc()ed result
 1.29 22-Jul-2004  lukem Implement -M to "merge" entries, even with different types.
This can be used in /etc/security to allow special.local to override
types of entries in special (e.g, replacing a dir with a link).

Rename Wflag to mtree_Wflag, to be more "external namespace" friendly.
 1.28 27-Oct-2003  lukem Overhaul how `build.sh tools' are used:

* Rename "config.h" to "nbtool_config.h" and
HAVE_CONFIG_H to HAVE_NBTOOL_CONFIG_H.
This makes in more obvious in the source when we're using
tools/compat/config.h versus "standard autoconf" config.h

* Consistently move the inclusion of nbtool_config.h to before
<sys/cdefs.h> so that the former can provide __RCSID() (et al),
and there's no need to protect those macros any more.

These changes should make it easier to "tool-ify" a program by adding:
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
to the top of the source files (for the general case).
 1.27 07-Aug-2003  agc Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.26 23-Dec-2002  lukem Add -C, which dumps the specification with the full path name first,
and then all the other fields. (I.e, like -D except with the name
first instead of last).
Consistenly strsvis(3) encode path names (even for -C and -D).
 1.25 08-Oct-2002  lukem Remove convoluted code to work around missing lch{flags,mod,own}();
instead, rely upon libnbcompat to provide a workaround (which returns
an error if the target is a symlink).
Should fix another MacOS X build issue due to missing lchown(2).
 1.24 06-Oct-2002  lukem - Check HAVE_LCHFLAGS for lchflags(2) support, rather than assuming
that HAVE_STRUCT_STAT_ST_FLAGS implies this.
- Set HAVE_LCHFLAGS for native builds
- Clean up {CLEAR,SET,CHANGE}FLAGS macros, and only provide if
HAVE_STRUCT_STAT_ST_FLAGS is set.

(Fixes compilation as a tool on MacOS X, noted by Allen Briggs.)
 1.23 08-Feb-2002  tv Funtion appropriately in the absence of a lchmod call on the host.
 1.22 31-Jan-2002  tv Roll in fixes to permit cross-compiling from non-NetBSD hosts. This
round has been tested on Solaris/x86 and Linux hosts.

* Add host tools cap_mkdb, ctags, m4, uudecode.
* Protect __RCSID() and __COPYRIGHT() better.
* Reduce the number of places that need to include "config.h", to keep
sources closer to their "vanilla" versions.
* Add more compat #defines and autoconf-checked functions.
 1.21 29-Jan-2002  tv Make almost all tools compile and run properly on non-NetBSD hosts. (In
particular, most tools now run correctly on Solaris 7.)
 1.20 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.19 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.18 03-Nov-2001  lukem - move "Wflag" global from mtree.c to spec.c, and reinstate the functionality
of tv's previous code, which skips uname or gname parsing if -W is enabled.
- rename "lineno" to "mtree_lineno", to reduce possibility of name
clashes in code that yanks in spec.c & misc.c (unlikely, but you never know)
 1.17 25-Oct-2001  lukem Add -W: don't attempt to change the perms/time/flags on existing entries, nor
set them when creating new directories. (AKA the ``don't whack'' option).
Concept suggested by Todd Vierling.
 1.16 25-Oct-2001  lukem - add lineno field to NODE
- move inotype() prototype into mtree.h from extern.h
 1.15 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.14 05-Oct-2001  lukem cleanup tags support;
- create a typedef struct slist_t to hold stuff in (avoid stringlist(3)
because it's less portable)
- move the tag manipulate stuff into misc.c
- add matchtags(), which returns 0 if the node is explicitly excluded,
or not included if an include list is given; or 1 otherwise
- in -D, change tags support from files-only to all-non-directories

(xxx; still considering implementing tags support for -c and !-D)
 1.13 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.12 01-Oct-2001  lukem - implement -D - dump the specfile out in a manner that's parseable
by various tools
- implement -R key - remove the given key(s) from the list of keys to print
(now it's possible with "-k type -R type" to remove all keys :)
- rename ftype() to nodetype(), and make it public
- use pwcache(3) functions instead of get{gr,pw}{nam,uid}(3)
- add dump_nodes(), which provides the guts for -D.
 1.11 18-Jul-2001  lukem - add parsetype() (a la parsekey()) to parse the "type=xxx" arg. this improves
the error detection for invalid types, as well as shrinking binary size
- implement inotype() using ftype(), rather than duplicating the switch
- change "char *" arguments to "const char *"
 1.10 09-Mar-2001  simonb ANSIfy, KNF, in preperation for more work.
 1.9 20-Feb-2001  hubertf Remove all the "#ifdef __APPLE__" code, to make this actually
build again on Darwin. The code in question is outdated.

OK'd by Wilfredo Sanchez wsanchez@MIT.EDU.
 1.8 11-Oct-2000  is More format string cleanups by sommerfeld.
 1.7 07-Dec-1999  wennmach branches: 1.7.4;
code.c is no longer used, we use strsvis instead. Removed prototypes
from extern.h
 1.6 09-Nov-1999  drochner prototype encode()/decode()
 1.5 10-Oct-1998  mrg branches: 1.5.2; 1.5.6;
add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.4 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.3 07-Mar-1995  cgd add NetBSD id's
 1.2 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.1 02-Nov-1993  cgd branches: 1.1.1;
latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.1.1.1 07-Mar-1995  cgd from 4.4-Lite
 1.5.6.1 27-Dec-1999  wrstuden Pull up to last week's -current.
 1.5.2.2 19-Oct-2000  he Pull up revision 1.8 (requested by he):
Format string cleanup.
 1.5.2.1 20-Nov-1999  he Pull up revision 1.6 (requested by wennmach and joda):
Make mtree able to properly encode file names with `funny' albeit
legal characters (`#', ` ', binary characters), fixing PR#5006 and
PR#7663.
 1.7.4.1 17-Oct-2000  tv Pullup usr.sbin string format fixes [is].
See "cvs log" for explicit revision numbers per file, from sommerfeld.
 1.30.20.1 13-May-2009  jym Sync with HEAD.

Third (and last) commit. See http://mail-index.netbsd.org/source-changes/2009/05/13/msg221222.html
 1.32.8.3 20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.32.8.2 25-Feb-2013  tls resync with head
 1.32.8.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.32.2.3 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.32.2.2 23-Jan-2013  yamt sync with head
 1.32.2.1 30-Oct-2012  yamt sync with head
 1.38.6.1 10-Aug-2014  tls Rebase.
 1.40.8.1 02-Aug-2025  perseant Sync with HEAD
 1.10 27-Oct-2014  christos fix pasto; thanks John-Mark Gurney...
 1.9 31-Mar-2014  christos say why we can't use the password or the group databases.
 1.8 16-Oct-2013  christos skip comment lines on password and group databases (Brooks Davis)
 1.7 28-Apr-2008  martin branches: 1.7.4; 1.7.26;
Remove clause 3 and 4 from TNF licenses
 1.6 12-Dec-2007  lukem branches: 1.6.4;
use __RCSID()
 1.5 20-Jun-2004  jmc branches: 1.5.16;
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.4 07-Aug-2003  agc branches: 1.4.2;
Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.3 29-Jan-2002  tv Make almost all tools compile and run properly on non-NetBSD hosts. (In
particular, most tools now run correctly on Solaris 7.)
 1.2 29-Jan-2002  lukem don't bother initialising pwfile[] to _PATH_MASTERPASSWD and grfile[]
to _PATH_GROUP, because the simple_get{pw,gr}*() functions should not
be called by anything before those path arrays are setup by setup_getid().
 1.1 24-Jan-2002  lukem Add '-N dbdir', to specify that user & group lookups (via pwcache(3)) are to
be done from dbdir/master.passwd and dbdir/group, using simple text file
parsing routines.
 1.4.2.1 22-Jun-2004  tron Pull up revision 1.5 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.5.16.1 09-Jan-2008  matt sync with HEAD
 1.6.4.1 18-May-2008  yamt sync with head.
 1.7.26.1 20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.7.4.1 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.35 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.34 20-Dec-2012  christos branches: 1.34.42;
move flavor to misc.c because pax needs it.
 1.33 12-Dec-2012  christos - two entries for rmd160digest in misc.c (Brooks Davis)
 1.32 05-Oct-2012  christos Implement FreeBSD's "nochange" keyworld which causes the existance of a
filesystem object to be checked but none of its attiributes.(brooks)
 1.31 05-Oct-2012  christos account for differences in digest names
 1.30 18-Jan-2009  lukem branches: 1.30.8; 1.30.14;
fix -Wsign-compare issues
 1.29 16-Oct-2006  christos c99 initializers
 1.28 14-Oct-2006  christos PR/34818: rad at twig dot com: Recognize solaris door files.
 1.27 29-Sep-2005  tron The list of keywords must be sorted because it is search with bsearch(3).
Correcting this makes mtree(8) work again under Solaris.
 1.26 24-Aug-2005  elad Add SHA2 support in mtree.
 1.25 20-Jun-2004  jmc branches: 1.25.2;
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.24 07-Aug-2003  agc branches: 1.24.2;
Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.23 19-Feb-2002  lukem inotype() only needs to understand S_ types, not the F_ types
 1.22 31-Jan-2002  tv Protect __RCSID and __COPYRIGHT from being invoked if not defined.
 1.21 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.20 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.19 03-Nov-2001  lukem - move "Wflag" global from mtree.c to spec.c, and reinstate the functionality
of tv's previous code, which skips uname or gname parsing if -W is enabled.
- rename "lineno" to "mtree_lineno", to reduce possibility of name
clashes in code that yanks in spec.c & misc.c (unlikely, but you never know)
 1.18 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.17 18-Oct-2001  lukem make this mostly WARNS=2 safe
 1.16 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.15 05-Oct-2001  lukem - support "all" as a valid keyword for -k, -K and -R.
- parsekey(): support "all" as a keyword which returns a value with all bits
set that pertain to a valid keyword.
- dump_nodes():
- only print out a keyword if it's requested AND it's set in the node
- UNAME falls back to UID if the user name can't be determined
- GNAME falls back to GID if the group name can't be determined
- rework man page:
- use Sy instead of Cm
- use Pq, Dq, Ql, etc instead of ``...''
 1.14 05-Oct-2001  lukem cleanup tags support;
- create a typedef struct slist_t to hold stuff in (avoid stringlist(3)
because it's less portable)
- move the tag manipulate stuff into misc.c
- add matchtags(), which returns 0 if the node is explicitly excluded,
or not included if an include list is given; or 1 otherwise
- in -D, change tags support from files-only to all-non-directories

(xxx; still considering implementing tags support for -c and !-D)
 1.13 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.12 11-Sep-2001  thorpej Fix printf format.
 1.11 10-Sep-2001  lukem replace home-grown parser with fparseln()
 1.10 18-Jul-2001  lukem - add parsetype() (a la parsekey()) to parse the "type=xxx" arg. this improves
the error detection for invalid types, as well as shrinking binary size
- implement inotype() using ftype(), rather than duplicating the switch
- change "char *" arguments to "const char *"
 1.9 09-Mar-2001  simonb ANSIfy, KNF, in preperation for more work.
 1.8 06-Dec-1998  jwise Add an `md5' keyword to mtree, which takes as an argument the MD5 cryptographic
checksum of the file in question, optionally preceeded by `0x'.

This has been tested, and does work, AFAICT. There is currently no md5 equivalent
of the '-s' flag for use with checksum.
 1.7 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.6 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.5 17-Oct-1997  lukem WARNSify, getopt returns -1 not EOF
 1.4 07-Mar-1995  cgd add an 'optional' keyword, which allows files to be in the
specification, but _not_ in the file hierarchy. contrib'd by:
Ed Symanzik <zik@enoch.cl.msu.edu>. Man page adjustment to match, and
minor man page cleanup, by me.
 1.3 07-Mar-1995  cgd add NetBSD id's
 1.2 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.1 02-Nov-1993  cgd branches: 1.1.1;
latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.1.1.1 07-Mar-1995  cgd from 4.4-Lite
 1.24.2.1 22-Jun-2004  tron Pull up revision 1.25 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.25.2.2 01-Oct-2005  snj Pull up following revision(s) (requested by tron in ticket #839):
usr.sbin/mtree/misc.c: revision 1.27
The list of keywords must be sorted because it is search with bsearch(3).
Correcting this makes mtree(8) work again under Solaris.
 1.25.2.1 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.30.14.2 25-Feb-2013  tls resync with head
 1.30.14.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.30.8.3 23-Jan-2013  yamt sync with head
 1.30.8.2 16-Jan-2013  yamt sync with (a bit old) head
 1.30.8.1 30-Oct-2012  yamt sync with head
 1.34.42.1 02-Aug-2025  perseant Sync with HEAD
 1.3 02-Nov-1993  mycroft Clean up deleted files.
 1.2 01-Aug-1993  mycroft Add RCS indentifiers.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.78 02-Dec-2023  christos PR/57735: Jose Louis Duran: Add missing xref to mtree.5
(FreeBSD commit https://github.com/freebsd/freebsd-src/commit/\
da232c04ab9eba3d3a7fc73881daff847071e9fd)
 1.77 01-Jun-2023  uwe mtree(8): a few markup fixes

Didn't touch the section that describes the spec file format. We have
the format documented here, in mtree(8), and we also have the format
description in mtree(5) that comes from libarchive.
 1.76 16-Jun-2020  wiz Use more markup. Bump date for previous.
 1.75 16-Jun-2020  sborrill Describe correctly how whitespace is formatted as the docs did not
match the source.
 1.74 13-Dec-2018  wiz Use \(en.
 1.73 13-Dec-2018  dholland Fix naming inconsistency; PR 53769 from silas.
 1.72 22-Feb-2017  abhinav branches: 1.72.10; 1.72.12;
Fix typo.
 1.71 23-Jan-2015  wiz branches: 1.71.2; 1.71.4;
Pull into this year.
 1.70 23-Jan-2015  christos attempt to reset file flags when -rr
 1.69 03-Feb-2013  christos fix man page.
 1.68 03-Feb-2013  christos add the ability to only output paths included in a spec file when creating
from a directory (-c)
 1.67 20-Dec-2012  wiz Typo fix.
 1.66 20-Dec-2012  wiz Add missing letter and use x.y versions for Fx/Nx.
 1.65 20-Dec-2012  christos Implement the "flavor" output discussed in tech-userlevel@, by Brooks Davis
 1.64 12-Dec-2012  christos - No mention of -t in the usage message or the manpage SYNOPSIS (Brooks Davis)
 1.63 05-Oct-2012  wiz Fix typos; remove trailing whitespace; add missing options to SYNOPSIS.
 1.62 05-Oct-2012  christos Implement FreeBSD's "nochange" keyworld which causes the existance of a
filesystem object to be checked but none of its attiributes.(brooks)
 1.61 05-Oct-2012  christos Implement FreeBSD's "nochange" keyworld which causes the existance of a
filesystem object to be checked but none of its attributes. (brooks)
 1.60 05-Oct-2012  christos Implement FreeBSD's -f spec1 -f spec2 spec comparision function. This
is more useful than -C and diff because it highlights the keys that have
changed value so for example, you can see that the size of a file has
not changed but the contents have. (brooks)
 1.59 05-Oct-2012  christos clarify seconds.09nanoseconds format (brooks)
 1.58 05-Oct-2012  christos add -j flag to indent directory blocks (from brooks)
 1.57 05-Oct-2012  christos add -q flag to silence warnings about symlinks to existing dirs (from OpenBSD
via brooks)
 1.56 05-Oct-2012  christos add -n flag to disable comments (brook)
 1.55 05-Oct-2012  christos account for differences in digest names
 1.54 03-Oct-2012  wiz - Sort order of options mentioned in text;
- improve wording;
- remove unneeded macros (fixes mandoc(1) warnings);
- in the `EXAMPLES' section, for `-d', mention the use of `-U'
besides that of `-u' (as the former is a variant on the latter).

From Bug Hunting.
 1.53 20-Jan-2010  wiz branches: 1.53.6; 1.53.12;
Fix date.
 1.52 20-Jan-2010  uebayasi Document -t (modify mtime). Bump date.
 1.51 09-Apr-2009  apb * Rewrite intro to mention all three things mtree can do (check directory
tree against spec; create spec; modify spec).
* Consistently use "options" to refer to command line options. "flags"
is used to refer to file flags.
* Some other clarifications and changes for consistency.
 1.50 08-Apr-2009  wiz Sort options and option descriptions.
Remove an incomplete sentence ("It will") -- probably pasto.
Give the tagged lists more space for the first column.
Remove unnecessary Bk/Ek pairs.
 1.49 08-Apr-2009  apb The recent addition of sorting to "mtree -C" broke some third party
scripts. Now make sorting optional, controled by the "-S" flag.
 1.48 11-Mar-2009  joerg Don't use .Xo/.Xc. Replace use of .Sm off / .Sm on with .Ns.
 1.47 02-Feb-2009  wiz branches: 1.47.2;
New sentence, new line.
 1.46 01-Feb-2009  hubertf -c: make it clear where the file hierarchy starts
-I, -E: they also work with -C, not just with -D
 1.45 02-May-2008  martin Move TNF licenses to 2 clause form
 1.44 12-Sep-2006  pavel branches: 1.44.16;
describe how to suppress printing of "type" keyword when -k is used.
bump date.
 1.43 22-Apr-2006  wiz i.e. without a space. PR 33328 by Igor Sobrado.
 1.42 10-Nov-2005  elad SHA2 support has been pulled up to NetBSD 3.0, update the history part.
 1.41 24-Aug-2005  elad Add SHA2 support in mtree.
 1.40 24-Aug-2005  elad Reference cksum(1) only.
 1.39 22-Jul-2004  lukem branches: 1.39.2;
Implement -M to "merge" entries, even with different types.
This can be used in /etc/security to allow special.local to override
types of entries in special (e.g, replacing a dir with a link).

Rename Wflag to mtree_Wflag, to be more "external namespace" friendly.
 1.38 07-Aug-2003  agc Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.37 27-Jun-2003  wiz Quote some characters.
 1.36 31-Mar-2003  grant grammar tweak.
 1.35 25-Feb-2003  wiz .Nm does not need a dummy argument ("") before punctuation or
for correct formatting of the SYNOPSIS any longer.
 1.34 27-Dec-2002  grant File types belong under 'type', not 'uname'.
 1.33 23-Dec-2002  lukem Add -C, which dumps the specification with the full path name first,
and then all the other fields. (I.e, like -D except with the name
first instead of last).
Consistenly strsvis(3) encode path names (even for -C and -D).
 1.32 09-Dec-2002  lukem correct description of -D
 1.31 11-Feb-2002  lukem support multiple entries for "." and full paths if the types match; the last
listed entry's settings override the existing settings for that node.
 1.30 05-Feb-2002  lukem Support `/unset all', to unset all of the global values set with `/set ...'
 1.29 24-Jan-2002  lukem Add '-N dbdir', to specify that user & group lookups (via pwcache(3)) are to
be done from dbdir/master.passwd and dbdir/group, using simple text file
parsing routines.
 1.28 19-Jan-2002  wiz Whitespace nits.
 1.27 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.26 25-Oct-2001  lukem Add -W: don't attempt to change the perms/time/flags on existing entries, nor
set them when creating new directories. (AKA the ``don't whack'' option).
Concept suggested by Todd Vierling.
 1.25 22-Oct-2001  lukem document requirement about first node being a directory called "."
 1.24 19-Oct-2001  lukem improve enumeration of the different specfile entry types
 1.23 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.22 08-Oct-2001  lukem - use "full path" instead of "absolute path"; perry thinks it's less confusing
- clarify the `all' keyword support in -k, -K and -R. should solve [misc/14186]
- use ".sp" instead of ".Pp" (from FreeBSD).
 1.21 05-Oct-2001  lukem * Implement support for absolute paths in the specfile. An absolute path
is one that contains a `/' character that is not the first character.
All parent directories referenced in the path must exist.
* Add copyright for all the work I've done.
* Document the history of various features added since 4.3-Reno.
 1.20 05-Oct-2001  lukem - support "all" as a valid keyword for -k, -K and -R.
- parsekey(): support "all" as a keyword which returns a value with all bits
set that pertain to a valid keyword.
- dump_nodes():
- only print out a keyword if it's requested AND it's set in the node
- UNAME falls back to UID if the user name can't be determined
- GNAME falls back to GID if the group name can't be determined
- rework man page:
- use Sy instead of Cm
- use Pq, Dq, Ql, etc instead of ``...''
 1.19 05-Oct-2001  lukem cleanup tags support;
- create a typedef struct slist_t to hold stuff in (avoid stringlist(3)
because it's less portable)
- move the tag manipulate stuff into misc.c
- add matchtags(), which returns 0 if the node is explicitly excluded,
or not included if an include list is given; or 1 otherwise
- in -D, change tags support from files-only to all-non-directories

(xxx; still considering implementing tags support for -c and !-D)
 1.18 04-Oct-2001  wiz Whitespace fixes, sort sections.
 1.17 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.16 01-Oct-2001  lukem - implement -D - dump the specfile out in a manner that's parseable
by various tools
- implement -R key - remove the given key(s) from the list of keys to print
(now it's possible with "-k type -R type" to remove all keys :)
- rename ftype() to nodetype(), and make it public
- use pwcache(3) functions instead of get{gr,pw}{nam,uid}(3)
- add dump_nodes(), which provides the guts for -D.
 1.15 22-Sep-2001  perry Add a -l flag which does "loose" permissions checks, i.e. a mode 444
matches a check for mode 644 (though obviously not the reverse). This
can be used by the nightly security run, making the output1 more useful
by having it contain fewer spurious permissions violations.

Note that I did not make -l work if you have a sgid/suid/sticky bit
set. I don't know how you could cause security trouble with more
stringent settings and a suid file, but I don't want to find out the
hard way.
 1.14 07-Nov-2000  lukem use .Xr
 1.13 05-Oct-2000  wennmach mtree uses strsvis, not strvis.
 1.12 07-Nov-1999  wennmach branches: 1.12.4;
Encode file names using strvis(3) when creating a specification.
Escape white space characters and `#' characters. Do the inverse
when reading specs.

This is a temporary fix until we have strzouvis(3) (or some such)
which is an improved version of strvis (taking an additional list
of characters to encode).

Fixes PR 5006 and PR 7663
 1.11 07-Mar-1999  mycroft branches: 1.11.2; 1.11.6;
Clean up SYNOPSIS formatting.
 1.10 11-Feb-1999  mrg - add -m and -i to change file flags more usefully.
- fix bugs in fileflags checking

all of the above from dr. lex wennmacher <wennmach@geo.Uni-Koeln.DE>
with some error fixes from egcs via myself.
 1.9 06-Dec-1998  jwise Add an `md5' keyword to mtree, which takes as an argument the MD5 cryptographic
checksum of the file in question, optionally preceeded by `0x'.

This has been tested, and does work, AFAICT. There is currently no md5 equivalent
of the '-s' flag for use with checksum.
 1.8 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.7 17-Oct-1997  lukem WARNSify, getopt returns -1 not EOF
 1.6 20-Aug-1997  agc Add -U flag, checking for mismatch. This is the same as the old -u flag,
except that an error which was corrected is deemed not to be an error.

Necessary for use in the FreeBSD ports system.
 1.5 10-Jul-1997  mikel xref chown(8) not chown(1), kill extra comma
 1.4 07-Mar-1995  cgd add an 'optional' keyword, which allows files to be in the
specification, but _not_ in the file hierarchy. contrib'd by:
Ed Symanzik <zik@enoch.cl.msu.edu>. Man page adjustment to match, and
minor man page cleanup, by me.
 1.3 07-Mar-1995  cgd add NetBSD id's
 1.2 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.1 02-Nov-1993  cgd branches: 1.1.1;
latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.1.1.1 07-Mar-1995  cgd from 4.4-Lite
 1.11.6.1 27-Dec-1999  wrstuden Pull up to last week's -current.
 1.11.2.1 20-Nov-1999  he Pull up revision 1.12 (requested by wennmach and joda):
Make mtree able to properly encode file names with `funny' albeit
legal characters (`#', ` ', binary characters), fixing PR#5006 and
PR#7663.
 1.12.4.2 09-Dec-2001  he Pull up revision 1.15 (requested by lukem):
Add an ``-l'' flag which does ``loose'' permission checks.
 1.12.4.1 09-Dec-2001  he Pull up revision 1.13-1.14 (requested by lukem):
Fix references to strsvis(3).
 1.39.2.2 11-Nov-2005  tron Pull up following revision(s) (requested by elad in ticket #952):
usr.sbin/mtree/mtree.8: revision 1.42
SHA2 support has been pulled up to NetBSD 3.0, update the history part.
 1.39.2.1 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.44.16.1 18-May-2008  yamt sync with head.
 1.47.2.1 13-May-2009  jym Sync with HEAD.

Third (and last) commit. See http://mail-index.netbsd.org/source-changes/2009/05/13/msg221222.html
 1.53.12.2 25-Feb-2013  tls resync with head
 1.53.12.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.53.6.4 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.53.6.3 23-Jan-2013  yamt sync with head
 1.53.6.2 16-Jan-2013  yamt sync with (a bit old) head
 1.53.6.1 30-Oct-2012  yamt sync with head
 1.71.4.1 21-Apr-2017  bouyer Sync with HEAD
 1.71.2.1 20-Mar-2017  pgoyette Sync with HEAD
 1.72.12.1 10-Jun-2019  christos Sync with HEAD
 1.72.10.1 26-Dec-2018  pgoyette Sync with HEAD, resolve a few conflicts
 1.51 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.50 23-Jan-2015  christos branches: 1.50.28;
attempt to reset file flags when -rr
 1.49 24-Apr-2014  christos Pass a file pointer to write data instead of writing to stdout.
No functional change.
 1.48 08-Apr-2013  christos branches: 1.48.4;
move flags only used in main() inside main(), from Ed Schouten
 1.47 03-Feb-2013  christos add the ability to only output paths included in a spec file when creating
from a directory (-c)
 1.46 20-Dec-2012  christos move flavor to misc.c because pax needs it.
 1.45 20-Dec-2012  mlelstv joerg@: just use unsigned int please
 1.44 20-Dec-2012  christos Implement the "flavor" output discussed in tech-userlevel@, by Brooks Davis
 1.43 12-Dec-2012  christos - No "j" in the getopt string. (Brooks Davis)
 1.42 05-Oct-2012  wiz Sync usage with man page.
 1.41 05-Oct-2012  christos Implement FreeBSD's -f spec1 -f spec2 spec comparision function. This
is more useful than -C and diff because it highlights the keys that have
changed value so for example, you can see that the size of a file has
not changed but the contents have. (brooks)
 1.40 05-Oct-2012  christos add -j flag to indent directory blocks (from brooks)
 1.39 05-Oct-2012  christos add -q flag to silence warnings about symlinks to existing dirs (from OpenBSD
via brooks)
 1.38 05-Oct-2012  christos add -n flag to disable comments (brook)
 1.37 29-Aug-2011  joerg branches: 1.37.2; 1.37.8;
Use __dead and __printflike
 1.36 08-Apr-2009  wiz Sync usage with man page.
 1.35 08-Apr-2009  apb The recent addition of sorting to "mtree -C" broke some third party
scripts. Now make sorting optional, controled by the "-S" flag.
 1.34 21-Jul-2008  lukem branches: 1.34.6;
Remove the \n and tabs from the __COPYRIGHT() strings.
Tweak to use a consistent format.
 1.33 20-Jan-2007  perry branches: 1.33.12;
Fix a typo in a boolean test, which used & instead of &&.
 1.32 22-Jul-2004  lukem Implement -M to "merge" entries, even with different types.
This can be used in /etc/security to allow special.local to override
types of entries in special (e.g, replacing a dir with a link).

Rename Wflag to mtree_Wflag, to be more "external namespace" friendly.
 1.31 20-Jun-2004  jmc Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.30 07-Aug-2003  agc branches: 1.30.2;
Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.29 23-Dec-2002  lukem Add -C, which dumps the specification with the full path name first,
and then all the other fields. (I.e, like -D except with the name
first instead of last).
Consistenly strsvis(3) encode path names (even for -C and -D).
 1.28 31-Jan-2002  tv Protect __RCSID and __COPYRIGHT from being invoked if not defined.
 1.27 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.26 24-Jan-2002  lukem Add '-N dbdir', to specify that user & group lookups (via pwcache(3)) are to
be done from dbdir/master.passwd and dbdir/group, using simple text file
parsing routines.
 1.25 09-Nov-2001  lukem Generally don't need the extra byte in MAXPATHLEN sized buffers, because
pathnames are guaranteed by POSIX to be MAXPATHLEN-1 bytes long.
Kindly pointed out by Warner Losh in private email.
 1.24 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.23 03-Nov-2001  lukem - move "Wflag" global from mtree.c to spec.c, and reinstate the functionality
of tv's previous code, which skips uname or gname parsing if -W is enabled.
- rename "lineno" to "mtree_lineno", to reduce possibility of name
clashes in code that yanks in spec.c & misc.c (unlikely, but you never know)
 1.22 25-Oct-2001  lukem Add -W: don't attempt to change the perms/time/flags on existing entries, nor
set them when creating new directories. (AKA the ``don't whack'' option).
Concept suggested by Todd Vierling.
 1.21 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.20 05-Oct-2001  lukem cleanup tags support;
- create a typedef struct slist_t to hold stuff in (avoid stringlist(3)
because it's less portable)
- move the tag manipulate stuff into misc.c
- add matchtags(), which returns 0 if the node is explicitly excluded,
or not included if an include list is given; or 1 otherwise
- in -D, change tags support from files-only to all-non-directories

(xxx; still considering implementing tags support for -c and !-D)
 1.19 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.18 01-Oct-2001  lukem - implement -D - dump the specfile out in a manner that's parseable
by various tools
- implement -R key - remove the given key(s) from the list of keys to print
(now it's possible with "-k type -R type" to remove all keys :)
- rename ftype() to nodetype(), and make it public
- use pwcache(3) functions instead of get{gr,pw}{nam,uid}(3)
- add dump_nodes(), which provides the guts for -D.
 1.17 22-Sep-2001  perry Add a -l flag which does "loose" permissions checks, i.e. a mode 444
matches a check for mode 644 (though obviously not the reverse). This
can be used by the nightly security run, making the output1 more useful
by having it contain fewer spurious permissions violations.

Note that I did not make -l work if you have a sgid/suid/sticky bit
set. I don't know how you could cause security trouble with more
stringent settings and a suid file, but I don't want to find out the
hard way.
 1.16 21-Mar-2001  cgd use setprogname
 1.15 09-Mar-2001  simonb ANSIfy, KNF, in preperation for more work.
 1.14 11-Feb-1999  mrg branches: 1.14.10;
- add -m and -i to change file flags more usefully.
- fix bugs in fileflags checking

all of the above from dr. lex wennmacher <wennmach@geo.Uni-Koeln.DE>
with some error fixes from egcs via myself.
 1.13 05-Dec-1998  itohy getcwd() is not equivalent of getwd() if you want to print an error message.
 1.12 03-Dec-1998  thorpej Use getcwd(3) instead of getwd(3).
 1.11 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.10 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.9 17-Oct-1997  lukem WARNSify, getopt returns -1 not EOF
 1.8 20-Aug-1997  agc Add -U flag, checking for mismatch. This is the same as the old -u flag,
except that an error which was corrected is deemed not to be an error.

Necessary for use in the FreeBSD ports system.
 1.7 05-Sep-1996  thorpej Add a missing "break;", pointed out by Chris Demetriou.
 1.6 05-Sep-1996  mycroft Add a `-t' option to update time stamps.
 1.5 07-Mar-1995  cgd branches: 1.5.6;
add NetBSD id's
 1.4 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.3 02-Nov-1993  cgd latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.2 01-Aug-1993  mycroft Add RCS identifiers.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.2 07-Mar-1995  cgd from 4.4-Lite
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.5.6.1 10-Dec-1996  mycroft From trunk:
Don`t record sizes for things other than regular files.
Add a `-t' option to update time stamps.
 1.14.10.1 09-Dec-2001  he Pull up revision 1.17 (via patch, requested by lukem):
Add an ``-l'' flag which does ``loose'' permission checks.
 1.30.2.1 22-Jun-2004  tron Pull up revision 1.31 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.33.12.1 18-Sep-2008  wrstuden Sync with wrstuden-revivesa-base-2.
 1.34.6.1 13-May-2009  jym Sync with HEAD.

Third (and last) commit. See http://mail-index.netbsd.org/source-changes/2009/05/13/msg221222.html
 1.37.8.4 20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.37.8.3 23-Jun-2013  tls resync from head
 1.37.8.2 25-Feb-2013  tls resync with head
 1.37.8.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.37.2.4 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.37.2.3 23-Jan-2013  yamt sync with head
 1.37.2.2 16-Jan-2013  yamt sync with (a bit old) head
 1.37.2.1 30-Oct-2012  yamt sync with head
 1.48.4.1 10-Aug-2014  tls Rebase.
 1.50.28.1 02-Aug-2025  perseant Sync with HEAD
 1.31 05-Oct-2012  wiz Fix typo in comment.
 1.30 05-Oct-2012  christos Implement FreeBSD's "nochange" keyworld which causes the existance of a
filesystem object to be checked but none of its attiributes.(brooks)
 1.29 05-Oct-2012  christos Implement FreeBSD's -f spec1 -f spec2 spec comparision function. This
is more useful than -C and diff because it highlights the keys that have
changed value so for example, you can see that the size of a file has
not changed but the contents have. (brooks)
 1.28 05-Oct-2012  christos account for differences in digest names
 1.27 04-Apr-2009  apb branches: 1.27.6; 1.27.12;
Tags are internally stored with leading and trailing commas, for ease
of using strstr(3) to check them against inclusion or exclusion lists.
Don't output the leading or trailing commas.
 1.26 04-Feb-2007  elad branches: 1.26.20;
The hashing routines (MD5File() and co.) can do dynamic allocation, so
take advantage of that instead of an ugly hard-coded MAXHASHLEN limit
that needs updating.

I think this was suggested by cube@ years ago.
 1.25 14-Oct-2006  christos PR/34818: rad at twig dot com: Recognize solaris door files.
 1.24 02-Sep-2005  elad Use MAXHASHLEN here too.
 1.23 24-Aug-2005  elad Add SHA2 support in mtree.
 1.22 22-Jul-2004  lukem branches: 1.22.2;
Implement -M to "merge" entries, even with different types.
This can be used in /etc/security to allow special.local to override
types of entries in special (e.g, replacing a dir with a link).

Rename Wflag to mtree_Wflag, to be more "external namespace" friendly.
 1.21 07-Aug-2003  agc Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.20 23-Dec-2002  lukem Add -C, which dumps the specification with the full path name first,
and then all the other fields. (I.e, like -D except with the name
first instead of last).
Consistenly strsvis(3) encode path names (even for -C and -D).
 1.19 24-Jan-2002  lukem Add '-N dbdir', to specify that user & group lookups (via pwcache(3)) are to
be done from dbdir/master.passwd and dbdir/group, using simple text file
parsing routines.
 1.18 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.17 25-Oct-2001  lukem - add lineno field to NODE
- move inotype() prototype into mtree.h from extern.h
 1.16 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.15 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.14 05-Oct-2001  lukem cleanup tags support;
- create a typedef struct slist_t to hold stuff in (avoid stringlist(3)
because it's less portable)
- move the tag manipulate stuff into misc.c
- add matchtags(), which returns 0 if the node is explicitly excluded,
or not included if an include list is given; or 1 otherwise
- in -D, change tags support from files-only to all-non-directories

(xxx; still considering implementing tags support for -c and !-D)
 1.13 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.12 03-Oct-2001  lukem add F_TYPE to KEYDEFAULT.
whilst -c always prints the type (even if removed with -R),
-D wasn't printing it in the default config
 1.11 11-Feb-1999  mrg - add -m and -i to change file flags more usefully.
- fix bugs in fileflags checking

all of the above from dr. lex wennmacher <wennmach@geo.Uni-Koeln.DE>
with some error fixes from egcs via myself.
 1.10 06-Dec-1998  jwise Add an `md5' keyword to mtree, which takes as an argument the MD5 cryptographic
checksum of the file in question, optionally preceeded by `0x'.

This has been tested, and does work, AFAICT. There is currently no md5 equivalent
of the '-s' flag for use with checksum.
 1.9 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.8 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.7 07-Mar-1995  cgd add an 'optional' keyword, which allows files to be in the
specification, but _not_ in the file hierarchy. contrib'd by:
Ed Symanzik <zik@enoch.cl.msu.edu>. Man page adjustment to match, and
minor man page cleanup, by me.
 1.6 07-Mar-1995  cgd add NetBSD id's
 1.5 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.4 25-Apr-1994  cgd #definery fun...
 1.3 02-Nov-1993  cgd latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.2 01-Aug-1993  mycroft Add RCS identifiers.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.2 07-Mar-1995  cgd from 4.4-Lite
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.22.2.2 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.22.2.1 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.26.20.1 13-May-2009  jym Sync with HEAD.

Third (and last) commit. See http://mail-index.netbsd.org/source-changes/2009/05/13/msg221222.html
 1.27.12.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.27.6.1 30-Oct-2012  yamt sync with head
 1.3 07-Sep-2017  nakayama Don't modify strings stored in hash, otherwise filling up of
directory hierarchy stops if the same hash value occurs in
directory and leaf.

Fix the issue that
"./usr/share/locale/pl/LC_MESSAGES/gettext-tools.mo" isn't included
in sets file in the case of MKUNPRIVED=no.
 1.2 05-Feb-2013  christos branches: 1.2.4; 1.2.10; 1.2.12; 1.2.14; 1.2.22; 1.2.26;
fill up the directory hierarchy so that leaf files are not ignored if
specified by themselves.
 1.1 03-Feb-2013  christos add the ability to only output paths included in a spec file when creating
from a directory (-c)
 1.2.26.1 11-Sep-2017  snj Pull up following revision(s) (requested by nakayama in ticket #268):
usr.sbin/mtree/only.c: revision 1.3
Don't modify strings stored in hash, otherwise filling up of
directory hierarchy stops if the same hash value occurs in
directory and leaf.
Fix the issue that
"./usr/share/locale/pl/LC_MESSAGES/gettext-tools.mo" isn't included
in sets file in the case of MKUNPRIVED=no.
 1.2.22.1 23-Oct-2017  snj Pull up following revision(s) (requested by nakayama in ticket #1506):
usr.sbin/mtree/only.c: revision 1.3
Don't modify strings stored in hash, otherwise filling up of
directory hierarchy stops if the same hash value occurs in
directory and leaf.
Fix the issue that
"./usr/share/locale/pl/LC_MESSAGES/gettext-tools.mo" isn't included
in sets file in the case of MKUNPRIVED=no.
 1.2.14.1 23-Oct-2017  snj Pull up following revision(s) (requested by nakayama in ticket #1506):
usr.sbin/mtree/only.c: revision 1.3
Don't modify strings stored in hash, otherwise filling up of
directory hierarchy stops if the same hash value occurs in
directory and leaf.
Fix the issue that
"./usr/share/locale/pl/LC_MESSAGES/gettext-tools.mo" isn't included
in sets file in the case of MKUNPRIVED=no.
 1.2.12.1 23-Oct-2017  snj Pull up following revision(s) (requested by nakayama in ticket #1506):
usr.sbin/mtree/only.c: revision 1.3
Don't modify strings stored in hash, otherwise filling up of
directory hierarchy stops if the same hash value occurs in
directory and leaf.
Fix the issue that
"./usr/share/locale/pl/LC_MESSAGES/gettext-tools.mo" isn't included
in sets file in the case of MKUNPRIVED=no.
 1.2.10.2 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.2.10.1 05-Feb-2013  yamt file only.c was added on branch yamt-pagecache on 2014-05-22 11:43:07 +0000
 1.2.4.2 25-Feb-2013  tls resync with head
 1.2.4.1 05-Feb-2013  tls file only.c was added on branch tls-maxphys on 2013-02-25 00:30:46 +0000
 1.92 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.91 04-Nov-2024  christos Provide a more detail message about mismatched entries.
 1.90 14-Dec-2017  christos branches: 1.90.16;
use uintmax_t for nlink_t from FreeBSD
 1.89 24-Apr-2014  christos Pass a file pointer to write data instead of writing to stdout.
No functional change.
 1.88 17-Oct-2013  christos branches: 1.88.2;
Our <sys/param.h> ends up calling header files that define intmax_t. This
should not be the case (but >sys/param.h> is not a standard header so all bets
are off). FreeBSD's does not, so explicitly include <stdint.h> to get it.
 1.87 16-Oct-2013  christos Default a bare "." with no type to F_DIR. For FreeBSD compatibility (Brooks
Davis)
 1.86 09-Sep-2013  christos use intmax_t instead of long long. fixes wrong cast for time_t.
 1.85 20-Dec-2012  christos Implement the "flavor" output discussed in tech-userlevel@, by Brooks Davis
 1.84 07-Oct-2012  christos disable encoding of globbing characters for now.
 1.83 05-Oct-2012  christos Encode literal global characters in files. Otherwise the results of
updating a directory using the resulting spec will be surprising.

See http://svnweb.freebsd.org/base/head/usr.sbin/mtree/test/test00.sh
for test cases.
(brooks)
 1.82 05-Oct-2012  christos clarify seconds.09nanoseconds format (brooks)
 1.81 05-Oct-2012  christos account for differences in digest names
 1.80 15-Mar-2012  joerg branches: 1.80.2;
Add __printflike attribution to use vprintf and friends with an argument
as format string.
 1.79 14-Feb-2011  uebayasi branches: 1.79.4;
Suppress a superfluous whitespace after "time=..." in the output.
 1.78 22-Sep-2009  apb branches: 1.78.2;
Fix errors in previous: "optional" and "ignore" keywords also need the
appendfield treatment.
 1.77 19-Sep-2009  apb Do not print a trailing space on each line with "mtree -C".
 1.76 19-Sep-2009  apb Fix the "mtree -M" problem reported in PR 42031 by Geoff Wing.
The cause of the problem was that part of the code assumed that
nodecmp() on two nodes with the same name would return 0, but in
fact nodecmp() would return -1 or +1 if one of the nodes was a
directory and the other was not. The fix is to separate the notion
of whether or not a duplicate name was found from the notion of
where the new node should appear in the list.
 1.75 11-Apr-2009  apb When an mtree spec file omits a parent directory, "missing directory in
specification", instead of "no such file or directory".
 1.74 08-Apr-2009  apb The recent addition of sorting to "mtree -C" broke some third party
scripts. Now make sorting optional, controled by the "-S" flag.
 1.73 07-Apr-2009  apb fix another missing "prev" link
 1.72 05-Apr-2009  apb Fix broken "prev" pointer in one case.
 1.71 05-Apr-2009  dogcow Watch one's "p"s and "q"s and fix cast aspersions on alpha ("warning: field
precision should have type 'int', but argument 2 has type 'long int'")
 1.70 04-Apr-2009  apb Tags are internally stored with leading and trailing commas, for ease
of using strstr(3) to check them against inclusion or exclusion lists.
Don't output the leading or trailing commas.
 1.69 03-Apr-2009  apb Make "mtree -C" sort its output.

As the input is read from a specfile into a tree of linked lists,
keep each linked list sorted. The sort order is the same as that
already used by "mtree -c": directories sort after non-directories, but
otherwise names are sorted in the order used by strcmp().
 1.68 18-Jan-2009  lukem branches: 1.68.2;
fix -Wsign-compare issues
 1.67 28-Dec-2008  christos fix time_t and dev_t formats
 1.66 04-Nov-2008  dbj ensure mtree_err gets a format string
 1.65 28-Apr-2008  martin Remove clause 3 and 4 from TNF licenses
 1.64 14-Dec-2006  he branches: 1.64.10;
Complete the move of string_to_flags() and flags_to_string() from the
bin/ls sources to libutil:
o Bump libutil minor version number
o Fix uses to include <util.h> to pick up the function definitions
o Fix most uses of flags_to_string() to release the now-malloc()ed result
 1.63 08-Oct-2006  martin Apply patch from Peter Bex to fix PR bin/31922.
 1.62 12-Apr-2006  dsl If parameter don't have values, then 'continue' after setting the flag bit.
Fixes coverty CID 776 and removes the need for a 'val = NULL' added to
appease gcc's undefined variable tests.
This parsing code sucks though, it doesn't correctly check for the '='
between a parameter and its value, whitespace can be used instead.
 1.61 01-Oct-2005  christos fix setmode error handling.
 1.60 24-Aug-2005  elad Add SHA2 support in mtree.
 1.59 01-Dec-2004  lukem branches: 1.59.2;
In replacenode(), don't strunvis() a NULL pointer. (Fixes bug in previous.)
 1.58 01-Dec-2004  lukem strsvis(3) encode & decode the "link=" value (symlink target).
 1.57 22-Jul-2004  lukem Implement -M to "merge" entries, even with different types.
This can be used in /etc/security to allow special.local to override
types of entries in special (e.g, replacing a dir with a link).

Rename Wflag to mtree_Wflag, to be more "external namespace" friendly.
 1.56 20-Jun-2004  jmc Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.55 11-May-2004  christos foliage from pack_dev change :-)
 1.54 30-Jan-2004  ross branches: 1.54.2;
Handle new-style error return from mknod/pack_dev.c
 1.53 17-Nov-2003  dbj #include <util.h>
this is needed by fparseln on macos/darwin and is harmless on netbsd
 1.52 10-Oct-2003  dsl Include filename in:
'existing entry for `sha1.h', type `file' does not match type `link'
 1.51 19-Sep-2003  itojun realloc pedant
 1.50 07-Aug-2003  agc Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.49 23-Dec-2002  lukem Add -C, which dumps the specification with the full path name first,
and then all the other fields. (I.e, like -D except with the name
first instead of last).
Consistenly strsvis(3) encode path names (even for -C and -D).
 1.48 30-Nov-2002  lukem tweaks for fparseln(3) move from libutil to libc:
- remove #include <util.h> if nothing else needed it
- remove LDFLAGS+=-lutil if nothing else needed it
 1.47 11-Feb-2002  lukem support multiple entries for "." and full paths if the types match; the last
listed entry's settings override the existing settings for that node.
 1.46 05-Feb-2002  lukem Support `/unset all', to unset all of the global values set with `/set ...'
 1.45 31-Jan-2002  tv Roll in fixes to permit cross-compiling from non-NetBSD hosts. This
round has been tested on Solaris/x86 and Linux hosts.

* Add host tools cap_mkdb, ctags, m4, uudecode.
* Protect __RCSID() and __COPYRIGHT() better.
* Reduce the number of places that need to include "config.h", to keep
sources closer to their "vanilla" versions.
* Add more compat #defines and autoconf-checked functions.
 1.44 29-Jan-2002  tv Make almost all tools compile and run properly on non-NetBSD hosts. (In
particular, most tools now run correctly on Solaris 7.)
 1.43 29-Jan-2002  lukem add <util.h> back in for native builds.
 1.42 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.41 09-Nov-2001  lukem Generally don't need the extra byte in MAXPATHLEN sized buffers, because
pathnames are guaranteed by POSIX to be MAXPATHLEN-1 bytes long.
Kindly pointed out by Warner Losh in private email.
 1.40 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.39 03-Nov-2001  lukem - move "Wflag" global from mtree.c to spec.c, and reinstate the functionality
of tv's previous code, which skips uname or gname parsing if -W is enabled.
- rename "lineno" to "mtree_lineno", to reduce possibility of name
clashes in code that yanks in spec.c & misc.c (unlikely, but you never know)
 1.38 01-Nov-2001  tv Revert previous until it's fixed a more generic way ... I didn't realize
this was pulled in via reachover from elsewhere.
 1.37 31-Oct-2001  tv Don't try to do uid or gid lookups from a supplied spec file if -W is given;
the numerical IDs won't be used anyway.
 1.36 26-Oct-2001  lukem fix potential sparc compiler warning (if DEBUG was defined, that is...)
 1.35 25-Oct-2001  lukem - add lineno field to NODE
- move inotype() prototype into mtree.h from extern.h
 1.34 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.33 17-Oct-2001  lukem convert from strtok() to strsep()
 1.32 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.31 05-Oct-2001  lukem * Implement support for absolute paths in the specfile. An absolute path
is one that contains a `/' character that is not the first character.
All parent directories referenced in the path must exist.
* Add copyright for all the work I've done.
* Document the history of various features added since 4.3-Reno.
 1.30 05-Oct-2001  lukem - support "all" as a valid keyword for -k, -K and -R.
- parsekey(): support "all" as a keyword which returns a value with all bits
set that pertain to a valid keyword.
- dump_nodes():
- only print out a keyword if it's requested AND it's set in the node
- UNAME falls back to UID if the user name can't be determined
- GNAME falls back to GID if the group name can't be determined
- rework man page:
- use Sy instead of Cm
- use Pq, Dq, Ql, etc instead of ``...''
 1.29 05-Oct-2001  lukem dump_nodes() fixes:
- in F_GID, print the gid not the uid
- support F_GNAME
 1.28 05-Oct-2001  lukem cleanup tags support;
- create a typedef struct slist_t to hold stuff in (avoid stringlist(3)
because it's less portable)
- move the tag manipulate stuff into misc.c
- add matchtags(), which returns 0 if the node is explicitly excluded,
or not included if an include list is given; or 1 otherwise
- in -D, change tags support from files-only to all-non-directories

(xxx; still considering implementing tags support for -c and !-D)
 1.27 04-Oct-2001  lukem - skip F_OPT entries (recently added diagnostic detected this)
- put F_TAG parsing in the correct alphabetical position
 1.26 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.25 01-Oct-2001  lukem - implement -D - dump the specfile out in a manner that's parseable
by various tools
- implement -R key - remove the given key(s) from the list of keys to print
(now it's possible with "-k type -R type" to remove all keys :)
- rename ftype() to nodetype(), and make it public
- use pwcache(3) functions instead of get{gr,pw}{nam,uid}(3)
- add dump_nodes(), which provides the guts for -D.
 1.24 10-Sep-2001  lukem replace home-grown parser with fparseln()
 1.23 18-Jul-2001  lukem - add parsetype() (a la parsekey()) to parse the "type=xxx" arg. this improves
the error detection for invalid types, as well as shrinking binary size
- implement inotype() using ftype(), rather than duplicating the switch
- change "char *" arguments to "const char *"
 1.22 25-Mar-2001  christos improve readability of error messages by quoting the string that we
did not understand. Avoids lossage like "unknown group named".
 1.21 09-Mar-2001  simonb ANSIfy, KNF, in preperation for more work.
 1.20 20-Feb-2001  hubertf Remove all the "#ifdef __APPLE__" code, to make this actually
build again on Darwin. The code in question is outdated.

OK'd by Wilfredo Sanchez wsanchez@MIT.EDU.
 1.19 10-Oct-2000  enami - The type of return value of setmode is a void * and getmode takes it,
rather than mode_t *.
- Free the storage allocated by setmode unless it is obvious that program
exits immediately.
 1.18 01-Dec-1999  wennmach Use strunvis instead of homebrewed "decode" routine
 1.17 07-Nov-1999  wennmach Encode file names using strvis(3) when creating a specification.
Escape white space characters and `#' characters. Do the inverse
when reading specs.

This is a temporary fix until we have strzouvis(3) (or some such)
which is an improved version of strvis (taking an additional list
of characters to encode).

Fixes PR 5006 and PR 7663
 1.16 19-Dec-1998  christos branches: 1.16.2; 1.16.6;
Appease gcc-2.8.1, make printf formats more portable.
 1.15 06-Dec-1998  jwise Add an `md5' keyword to mtree, which takes as an argument the MD5 cryptographic
checksum of the file in question, optionally preceeded by `0x'.

This has been tested, and does work, AFAICT. There is currently no md5 equivalent
of the '-s' flag for use with checksum.
 1.14 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.13 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.12 23-Sep-1998  itohy The return value of setmode(3) is a pointer to malloc()'ed area
and must be freed to avoid memory leaks if called repeatedly.
 1.11 17-Oct-1997  lukem WARNSify, getopt returns -1 not EOF
 1.10 17-Oct-1997  mrg merge lite-2
 1.9 11-Jul-1997  mikel fix printf() formats, make explicit comparisons to NULL (gcc -Wall)
 1.8 25-Apr-1997  mikel use appropriate strto*() functions, and cast results when appropriate;
fixes PR bin/1582.
 1.7 01-Feb-1996  jtc Rename struct timespec fields to conform to POSIX.1b
 1.6 07-Mar-1995  cgd add NetBSD id's
 1.5 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.4 27-Mar-1994  cgd off_t exp.
 1.3 02-Nov-1993  cgd latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.2 01-Aug-1993  mycroft Add RCS identifiers.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.3 29-Apr-1995  mrg 4.4BSD-Lite2
 1.1.1.2 07-Mar-1995  cgd from 4.4-Lite
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.16.6.1 27-Dec-1999  wrstuden Pull up to last week's -current.
 1.16.2.1 20-Nov-1999  he Pull up revision 1.17 (requested by wennmach and joda):
Make mtree able to properly encode file names with `funny' albeit
legal characters (`#', ` ', binary characters), fixing PR#5006 and
PR#7663.
 1.54.2.1 22-Jun-2004  tron Pull up revision 1.56 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.59.2.1 12-Sep-2005  tron Apply patch (requested by elad in ticket #755):
Add support for SHA2 in mtree(8).
 1.64.10.1 18-May-2008  yamt sync with head.
 1.68.2.1 13-May-2009  jym Sync with HEAD.

Third (and last) commit. See http://mail-index.netbsd.org/source-changes/2009/05/13/msg221222.html
 1.78.2.1 17-Feb-2011  bouyer Sync with HEAD
 1.79.4.4 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.79.4.3 23-Jan-2013  yamt sync with head
 1.79.4.2 30-Oct-2012  yamt sync with head
 1.79.4.1 17-Apr-2012  yamt sync with head
 1.80.2.3 20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.80.2.2 25-Feb-2013  tls resync with head
 1.80.2.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.88.2.1 10-Aug-2014  tls Rebase.
 1.90.16.1 02-Aug-2025  perseant Sync with HEAD
 1.5 02-Dec-2023  christos PR/57735: Jose Louis Duran: mtree -f file1 -f file2 does not consider type
changes.
(FreeBSD https://github.com/freebsd/freebsd-src/commit/\
4f4b548b1d21ae16955b09f9b717524167a7d97e)
 1.4 14-Dec-2017  christos use uintmax_t for nlink_t from FreeBSD
 1.3 07-Jan-2015  joerg st_nlink on Linux is not int, so add an explicit cast.
 1.2 05-Oct-2012  christos branches: 1.2.2; 1.2.4;
NetBSD needs <time.h>
 1.1 05-Oct-2012  christos Implement FreeBSD's -f spec1 -f spec2 spec comparision function. This
is more useful than -C and diff because it highlights the keys that have
changed value so for example, you can see that the size of a file has
not changed but the contents have. (brooks)
 1.2.4.2 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.2.4.1 05-Oct-2012  tls file specspec.c was added on branch tls-maxphys on 2012-11-20 03:03:02 +0000
 1.2.2.2 30-Oct-2012  yamt sync with head
 1.2.2.1 05-Oct-2012  yamt file specspec.c was added on branch yamt-pagecache on 2012-10-30 19:00:41 +0000
 1.50 11-Dec-2024  christos PR/58885: Jose Luis Duran: Fix output formatting for extra entries for
FreeBSD-9 compatibility.
 1.49 05-Dec-2024  christos PR/58875: Jose Luis Duran: Produce consistent checksums in verification
by scanning directories in the same order as usual. While here, fix some
incorrect types.
 1.48 02-Dec-2023  christos branches: 1.48.2;
PR/57735: Jose Louis Duran: check if fts_read(3) had an error.
(FreeBSD commit https://github.com/freebsd/freebsd-src/commit/\
2dfa4b66b3d0caaaae6ce2df476b5615f8415a19)
 1.47 18-Mar-2021  cheusov mtree: use POSIX type uint32_t instead of u_int32_t
 1.46 23-Jan-2015  christos fix tools build.
 1.45 23-Jan-2015  christos attempt to reset file flags when -rr
 1.44 03-Feb-2013  christos add the ability to only output paths included in a spec file when creating
from a directory (-c)
 1.43 05-Oct-2012  christos Implement FreeBSD's "nochange" keyworld which causes the existance of a
filesystem object to be checked but none of its attiributes.(brooks)
 1.42 05-Oct-2012  christos Implement FreeBSD's -f spec1 -f spec2 spec comparision function. This
is more useful than -C and diff because it highlights the keys that have
changed value so for example, you can see that the size of a file has
not changed but the contents have. (brooks)
 1.41 05-Oct-2012  christos add -q flag to silence warnings about symlinks to existing dirs (from OpenBSD
via brooks)
 1.40 25-Mar-2012  christos branches: 1.40.2;
PR/41061: Steven Drake: mtree -d complains about extra symlinks
 1.39 07-Oct-2006  elad branches: 1.39.40;
PR/28786: Jukka Salmi: mtree bug (in verify.c)

Apply patch from Peter Bex, thanks!
 1.38 22-Jul-2004  lukem Implement -M to "merge" entries, even with different types.
This can be used in /etc/security to allow special.local to override
types of entries in special (e.g, replacing a dir with a link).

Rename Wflag to mtree_Wflag, to be more "external namespace" friendly.
 1.37 20-Jun-2004  jmc Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')

Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).

Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.

Fixes PR's: PR#17762 PR#25944
 1.36 27-Oct-2003  lukem branches: 1.36.2;
Overhaul how `build.sh tools' are used:

* Rename "config.h" to "nbtool_config.h" and
HAVE_CONFIG_H to HAVE_NBTOOL_CONFIG_H.
This makes in more obvious in the source when we're using
tools/compat/config.h versus "standard autoconf" config.h

* Consistently move the inclusion of nbtool_config.h to before
<sys/cdefs.h> so that the former can provide __RCSID() (et al),
and there's no need to protect those macros any more.

These changes should make it easier to "tool-ify" a program by adding:
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
to the top of the source files (for the general case).
 1.35 07-Aug-2003  agc Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22366, verified by myself.
 1.34 04-Jan-2003  lukem Change default permissions of newly created directories from
"0700, modified by umask", to "0777, modified by umask".
This matches the behaviour of mkdir(1) and just about every other command...

This change is useful when running with '-W', where the mode of the
new directory won't be changed to what's specified in the specfile.
(I.e, an UNPRIVED build, with a umask of 022).
 1.33 29-Nov-2002  grant avoid non-constant initializer errors by changing hack to workaround
gcc warning to a slightly different hack.
 1.32 08-Oct-2002  lukem Remove convoluted code to work around missing lch{flags,mod,own}();
instead, rely upon libnbcompat to provide a workaround (which returns
an error if the target is a symlink).
Should fix another MacOS X build issue due to missing lchown(2).
 1.31 06-Oct-2002  lukem - Check HAVE_LCHFLAGS for lchflags(2) support, rather than assuming
that HAVE_STRUCT_STAT_ST_FLAGS implies this.
- Set HAVE_LCHFLAGS for native builds
- Clean up {CLEAR,SET,CHANGE}FLAGS macros, and only provide if
HAVE_STRUCT_STAT_ST_FLAGS is set.

(Fixes compilation as a tool on MacOS X, noted by Allen Briggs.)
 1.30 08-Feb-2002  tv Funtion appropriately in the absence of a lchmod call on the host.
 1.29 04-Feb-2002  lukem - use lch*() instead of ch*() to change permissions, so that links in
the specfile don't confuse things. doesn't affect the default
(physical) operation, and shouldn't affect logical either.
- slightly rework how miss() is implemented so that duplicated code is
reduced and links may optionally have a mode, uname and/or gname.
 1.28 04-Feb-2002  lukem explicitly chmod(2) newly created devices
 1.27 31-Jan-2002  tv Protect __RCSID and __COPYRIGHT from being invoked if not defined.
 1.26 29-Jan-2002  tv Add hooks to make mtree compilable from src/tools.
 1.25 09-Nov-2001  lukem Generally don't need the extra byte in MAXPATHLEN sized buffers, because
pathnames are guaranteed by POSIX to be MAXPATHLEN-1 bytes long.
Kindly pointed out by Warner Losh in private email.
 1.24 07-Nov-2001  lukem User interface changes from (or inspired by) FreeBSD:
- Add -L to walk the tree `logically', by following symbolic links in
the heirarchy.
- Add -P to walk the tree `physically'. This is the current behaviour,
and the default.
- Add "-X excludes-file" to give mtree the ability to exclude files and
directories from its traversal. excludes-file contains fnmatch(3)
patterns to exclude from the walk.
- Add "md5digest" synonym for "md5".
- Add "rmd160" keyword for RMD-160 message digest, and "rmd160digest" synonym.
- Add "sha1" keyword for SHA-1 message digest, and "sha1digest" synonym.
- Don't try to compare() other attributes if the type doesn't match;
it's nothing but trouble, and no use anyway.
- In -c, only emit "/set" records if something has changed since the
previous one.

User interface changes by me:
- Check a device's parameters before checking uid/gid/mode.
- If updating (-u), modify the following to match the specification:
- Device type (retaining existing ownership).
- Symlink target.

Fixes from (or inspired by) FreeBSD:
- Use p->ftslevel instead of own code to keep track of the level ourself.
The previous code got majorly confused if fts(3) couldn't descend
into a subdir, resulting in leaf nodes getting attached to the wrong
directory.
XXX: This new method is much much more robust, even though it's not 100%
perfect; it might result in a couple of following entries in the spec
to be incorrectly tagged as missing.
- Pass a useful pathname to rlink(), so that logical (-L) traversal
doesn't confuse symlink checking.
- Consistently use MAXPATHLEN+1 sized buffers for pathnames, so that
there's room for the NUL.
- Use mtree_err() and strerror(p->fts_errno) to report errors during
the fts(3) walk.

Fixes by me:
- Remove now-unused `const char *name' argument from compare().
- Change crc_total from an int to a u_int32_t, to match usr.bin/cksum/crc.c.
- Remove trailing whitespace.
- Remove unnecessary (void) casts on functions.
- Reorder entries in the getopt() switch.
- Replace strtoq() with strtoll(), and use strtoul() appropriately.
- Renumber F_ flags to be in alphabetical order.
 1.23 25-Oct-2001  lukem Add -W: don't attempt to change the perms/time/flags on existing entries, nor
set them when creating new directories. (AKA the ``don't whack'' option).
Concept suggested by Todd Vierling.
 1.22 22-Oct-2001  lukem - enforce the top-most entry must be "." and must be a directory; avoids
various potential problems when intermixing full and relative paths
- changes to make it much easier to use spec() - the specfile parser - in
other programs (via .PATHing spec.c and misc.c):
- move excludetags, includetags and keys from mtree.c to misc.c
- implement mtree_err() using vwarnx() instead of assuming name is
"mtree"
- move inotype() and nodetype() from compare.c to misc.c
- add nodetoinode(), to convert from an mtree F_* type to a
mode_t S_IF* type
- clean up #include use; don't assume "mtree.h" pulls in some
standard includes
- change spec() to take a FILE * arg (where the specfile is read from)
 1.21 18-Oct-2001  lukem complete WARNS=2 cleanup (with a bit of ickiness for the fts_open argv issue)
 1.20 09-Oct-2001  lukem Add "device" keyword, which allows the device number to be specified,
to be later checked and possibly created. Uses parsing and encoding
routines from mknod(8).
 1.19 04-Oct-2001  lukem features:
- add a new keyword - "tags" - which is a comma separated list of tags
associated with that file.
- add "-E tags"; exclude files in -D output with matching tags
- add "-I tags"; only include files in -D output with matching tags
(default is to list all)

fixes:
- move all extern variable references from individual files into extern.h
- `quote' some more user-specified strings in error messages
- man page: list an options arguments in the description, and sort xrefs.
 1.18 09-Mar-2001  simonb ANSIfy, KNF, in preperation for more work.
 1.17 11-Feb-1999  mrg - add -m and -i to change file flags more usefully.
- fix bugs in fileflags checking

all of the above from dr. lex wennmacher <wennmach@geo.Uni-Koeln.DE>
with some error fixes from egcs via myself.
 1.16 10-Oct-1998  mrg add support for 4.4BSD file flags. we take a `flags=xxx' parameter,
using the same style of naming as chflags, ls & xinstall use, plus an
additional `none' to turn off a default setting.
 1.15 08-Oct-1998  wsanchez Use u_int32_t rather than Sys-V u_long.
Rename err() to mtree_err(), to avoid conflict with libc.
 1.14 27-Aug-1998  ross Add {} pairs to shut up egcs.
 1.13 17-Oct-1997  lukem WARNSify, getopt returns -1 not EOF
 1.12 11-Jul-1997  mikel fix printf() formats, make explicit comparisons to NULL (gcc -Wall)
 1.11 23-Jun-1997  lukem Don't incorrectly warn about a subdirectory of 'foo' called 'bar' when there's
directory at the same level as 'foo' called 'bar'. (e.g, a definition
of usr/obj exists, and a def for usr/bin, but none for usr/obj/bin. don't
warn about usr/obj/bin because of the usr/bin entry).
Fix from enami tsugutomo <enami@ba2.so-net.or.jp> in [bin/3365]
 1.10 07-Mar-1995  cgd add an 'optional' keyword, which allows files to be in the
specification, but _not_ in the file hierarchy. contrib'd by:
Ed Symanzik <zik@enoch.cl.msu.edu>. Man page adjustment to match, and
minor man page cleanup, by me.
 1.9 07-Mar-1995  cgd add NetBSD id's
 1.8 07-Mar-1995  cgd clean up import, fix a few bugs, etc.
 1.7 02-Nov-1993  cgd make it compile...
 1.6 02-Nov-1993  cgd latest mtree from uunet. doesn't compile, but that'll be fixed soon.
(want to have 'pseudo-virgin' sources, for when fixed fnmatch stuff
is released...)
 1.5 01-Oct-1993  jtc Use *->fts_errno instead of errno after fts_read(). The fts manpage
indicates that the fts_errno will be set to the correct value, but there
are no guarentees about errno.
 1.4 01-Aug-1993  mycroft Add RCS identifiers.
 1.3 16-Jun-1993  jtc Update source to use posix fnmatch
 1.2 10-Apr-1993  mycroft Reverse sense of fnmatch() to match POSIX.
 1.1 21-Mar-1993  cgd branches: 1.1.1;
Initial revision
 1.1.1.2 07-Mar-1995  cgd from 4.4-Lite
 1.1.1.1 21-Mar-1993  cgd initial import of 386bsd-0.1 sources
 1.36.2.1 22-Jun-2004  tron Pull up revision 1.37 (requested by jmc in ticket #527):
Completely rework how tools/compat is done. Purge all uses/references to
_NETBSD_SOURCE as this makes cross building from older/newer versions of
NetBSD harder, not easier (and also makes the resulting tools 'different')
Wrap all required code with the inclusion of nbtool_config.h, attempt to
only use POSIX code in all places (or when reasonable test w. configure and
provide definitions: ala u_int, etc).
Reviewed by lukem. Tested on FreeBSD 4.9, Redhat Linux ES3, NetBSD 1.6.2 x86
NetBSD current (x86 and amd64) and Solaris 9.
Fixes PR's: PR#17762 PR#25944
 1.39.40.3 22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.39.40.2 30-Oct-2012  yamt sync with head
 1.39.40.1 17-Apr-2012  yamt sync with head
 1.40.2.2 25-Feb-2013  tls resync with head
 1.40.2.1 20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.48.2.1 02-Aug-2025  perseant Sync with HEAD

RSS XML Feed