tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Increasing FreeBSD compatibility in mtree



In article <20121214223041.GM40927%lor.one-eyed-alien.net@localhost>,
Brooks Davis  <brooks%freebsd.org@localhost> wrote:
>-=-=-=-=-=-
>
>> The -t option is the default on FreeBSD.  My initial approach was to add
>> a -T option to turn it off and make -t the default on FreeBSD.  The
>> advantage of this approach is that existing FreeBSD scripts wouldn't
>> break and portable code could use -T or -t as appropriate.  I didn't get
>> any feedback on this, but it wasn't committed so I'm not sure which
>> direction to go.  Other options are to just turn -t on all the time
>> without a way to disable it since this matches current FreeBSD behavior
>> or to go with the existing behavior which would be consistent, but
>> potentially confusing.  If I merge mtree to our stable branches I will
>> have to go with something that changes the default to avoid breaking
>> scripts there.

That sounds good.

>On FreeBSD the -u flag "updates owner, group, permissions, and
>modification time of existing files to match the specification."  It
>also updates the file flags.  On NetBSD all of that is true except
>that modification times are not updated unless -t is specified and
>the immutable and append flags aren't set without -i.  I think the
>NetBSD default makes more sense, but I'm a little worried it may be too
>disruptive on FreeBSD.  Certainly, if I merge NetBSD's mtree to a stable
>branch I will need to make -u imply -t and -i and emit a warning.
>Documentation may well be sufficient for 10-CURRENT.

That too.

>> I'm considering make -c -i set jflag and print a warning.  The reason
>> for this is that -i only makes sense with -c on FreeBSD and it looks
>> like it's a no-op on NetBSD.  Does this make sense?  This might be best
>> as a FreeBSD specific bit of compatibility code.
>
>On FreeBSD the -i option is equivalent to the new -j option in NetBSD's
>mtree in that it indents the output four spaces for each directory
>level.  It's mostly useless in the face of -C (full path output) but
>likely has users.
>
>On FreeBSD -i only does anything when -c (print a specification) is
>specified.  On NetBSD -i sets the schg or sappnd flags when a hierarchy
>is being verified.  Thus it appears to be a no-opn with -c is given.
>I'd like to propose making -c and -i imply -j with a warning as a
>compatibility measure.  I'm thinking something like the following
>untested diff though I could just do this on FreeBSD:
>
>Index: mtree.c
>===================================================================
>RCS file: /cvsroot/src/usr.sbin/mtree/mtree.c,v
>retrieving revision 1.43
>diff -u -r1.43 mtree.c
>--- mtree.c    12 Dec 2012 15:51:41 -0000      1.43
>+++ mtree.c    14 Dec 2012 22:21:25 -0000
>@@ -235,6 +235,11 @@
>       if (lflag && uflag)
>               mtree_err("-l and -u flags are mutually exclusive");
> 
>+      if (cflag && iflag && !jflag) {
>+              jflag = 1;
>+              warnx("-c and -i used together, assuming -j");
>+      }
>+
>       if (cflag) {
>               cwalk();
>               exit(0);

Perhaps turn off -i too?

>> The remaining known issues are in output format.  Since changing output
>> format is quite disruptive to users I'm leaning toward a -F option to
>> enable FreeBSD compatible output.  Would such an option be acceptable or
>> should I just use #ifdef __FreeBSD__ in our tree?  Obviously, if I merge
>> the code I'd have to make that the default.  The differences I know of
>> are:
>
>In the following, consider the hierarchy under /tmp/a created with "mkdir
>-p /tmp/a/b/c".
>
>>  - A "..\n\n" is printed for the top level directory.
>
>--FreeBSD--
>$ mtree -p /tmp/a -c -i -n
>
>/set type=file uid=3006 gid=0 mode=0755 nlink=1 flags=none
>.               type=dir nlink=3 size=512 time=1355518983.000000000
>
>    b               type=dir nlink=3 size=512 time=1355518986.000000000
>
>        c               type=dir nlink=2 size=512 time=1355518986.000000000
>        ..
>
>    ..
>
>..
>
>--FreeBSD--
>
>--NetBSD--
>$ nmtree -p /tmp/a -c -j -n
>
>/set type=file uid=1001 gid=0 mode=0755 nlink=1 flags=none
>.               type=dir nlink=3 time=1355522292.000000000
>
>    b               type=dir nlink=3 time=1355522292.000000000
>
>        c               type=dir nlink=2 time=1355522292.000000000
>        ..
>
>    ..
>
>--NetBSD--
>
>The delta is the last two lines of the FreeBSD output aren't in the
>NetBSD output.  I don't think this on is a big deal one way or another,
>but I speculate that FreeBSD output may better support concatination.

I am not so sure. Assuming you cd each time you find a directory, the NetBSD
one brings you back where you started, but the FreeBSD one higher?

>
>>  - size keywords are printed for all file types.
>
>As above FreeBSD emits size of all file types.  NetBSD only does so for
>regular files.  

I think this is more consistent, we should probably do that too.

>
>>  - -d mode suppresses most empty lines and uses type=dir in /set statements.
>
>-d mode is directory only for both FreeBSD and NetBSD.  On FreeBSD is
>suppresses blank lines so you can get output like:
>
>--FreeBSD--
>$ mtree -p /tmp/a -c -i -n -d
>/set type=dir uid=3006 gid=0 mode=0755 nlink=1 flags=none
>.               nlink=3 size=512 time=1355518983.000000000
>    b               nlink=3 size=512 time=1355518986.000000000
>        c               nlink=2 size=512 time=1355518986.000000000
>        ..
>    ..
>..
>--FreeBSD--
>
>--NetBSD--
>$ nmtree -p /tmp/a -c -j -n -d
>
>/set type=file uid=1001 gid=0 mode=0755 nlink=1 flags=none
>.               type=dir nlink=3 time=1355522292.000000000
>
>    b               type=dir nlink=3 time=1355522292.000000000
>
>        c               type=dir nlink=2 time=1355522292.000000000
>        ..
>
>    ..
>
>--NetBSD--
>
>NetBSD preserves the blank lines as in the samples above.  Additionally,
>NetBSD unconditionally prints "type=file" in the /set statement which
>means it is overridden on each line.  I believe the modifications to -d
>in FreeBSD were intended to be used along with -i to make it easier to
>maintain the historic /etc/mtree/BSD.*.mtree files.

Perhaps have a new option to suppress empty lines?

>I hope this makes what I'm looking for feedback on more clear.

Thanks for summarizing. I hope the comments are helpful.

christos



Home | Main Index | Thread Index | Old Index