Subject: Re: chmod(1) and '+X'
To: NetBSD Userlevel Technical Discussion List <tech-userlevel@NetBSD.ORG>
From: Greg A. Woods <woods@weird.com>
List: tech-userlevel
Date: 01/18/2004 19:14:43
[ On Sunday, January 18, 2004 at 18:48:13 (+0100), Jesper Louis Andersen wrote: ]
> Subject: Re: chmod(1) and '+X'
>
> Quoting Perry E. Metzger (perry@piermont.com):
> 
> > > IRIX' chmod and GNU chmod remove the 'x' bit.
> > 
> > If Solaris' does the same, I'd say we have consensus.
> 
> Hmm, is all those anything but old SystemV descendants?

"old" is a relative term here  :-)

If I'm not mistaken each of the SysVr4 derivatives still in relatively
wide distribution has always had a quite independent source tree (and
that no doubt goes double or triple for Sun) and traditionally both Sun
and SGI have been quite enamoured with their own local changes, so
there's still lots of room for disagreement between them.  :-)

I'd guess Sun would be more likely to make a change to the way a tool
like "chmod" would work than SGI would, though I suppose that's not
really relevant.  Sun also have had a tradition of providing separate
standards-compliant tools (xpg4), and SGI may have done the same (I have
much less experience with SGI releases).

>  What about
> 4.4bsd and it's behaviour? 

We can use the source for that comparison.  :-)

From what I can see just from a very quick scan of the diffs of 4.4BSD
setmode.c vs NetBSD's setmode.c, NetBSD's chmod will have diverged in
how it interprets its parameters a bit from 4.4BSD's, though according
to the changelog it's mostly a result of bug fixes by cdg that are not
directly related to the 'X' permissions modifier.


> (no, I am not on sure ground here, I just want to weed out the 
> possibility that there are 2 main ways of doing it)

I NetBSD's manual page (which remains unchanged in this part since
4.4BSD) has as good an explanation of 'X' as any.  Alone this seems to
indicate the documented issue with '-X' is indeed in conflict with the
manual page:

           X       The execute/search bits if the file is a directory or any
                   of the execute/search bits are set in the original (unmodi-
                   fied) mode.  Operations with the perm symbol ``X'' are only
                   meaningful in conjunction with the op symbol ``+'', and are
                   ignored in all other cases.

As for standards-compatability, well as I think has already been quoted,
IEEE Std 1003.1-2001 has this to say:

     The perm symbol X shall represent the execute/search portion of the
     file mode bits if the file is a directory or if the current
     (unmodified) file mode bits have at least one of the execute bits
     (S_IXUSR, S_IXGRP, or S_IXOTH) set.  It shall be ignored if the
     file is not a directory and none of the execute bits are set in the
     current file mode bits.

First off these two sentences seem to contradict themselves w.r.t. what
should happen when the file is not a directory, however I would put more
weight in the second sentence.

The RATIONALE section of IEEE Std 1003.1-2001 explains why the current
behaviour of NetBSD's "chmod" w.r.t. "-X" (and hopefully "=X") is
correct and that our manual page is simply out-of-date:

     The X perm symbol was adopted from BSD-based systems because it
     provides commonly desired functionality when doing recursive (-R
     option) modifications.  Similar functionality is not provided by
     the find utility.  Historical BSD versions of chmod, however, only
     supported X with op+; it has been extended in this volume of IEEE
     Std 1003.1-2001 because it is also useful with op=.  (It has also
     been added for op- even though it duplicates x, in this case,
     because it is intuitive and easier to explain.)

As for acting on non-directories, well if it does then that may be a
separate bug (or deviation from POSIX) in the NetBSD implementation

-- 
						Greg A. Woods

+1 416 218-0098                  VE3TCP            RoboHack <woods@robohack.ca>
Planix, Inc. <woods@planix.com>          Secrets of the Weird <woods@weird.com>