Created attachment 166372 [details]
patch to add octal number support for install -f
Let's say you have a file that has file flags, and you need to use install(1) to install a copy of it that doesn't have file flags. After reading the manuals of install(1) and chflags(1), you try this:
# install -f 0 /path/to/foo /path/to/bar
install: 0: invalid flag
It seems that install -f doesn't support octal numbers. There isn't a single keyword that clears all file flags, so to use only install, you'd have to do this:
# install -f noarch,dump,noopaque,nosappnd,noschg,nosunlnk,nouappnd,nouarch,nouchg,nouhidden,nouoffline,nourdonly,nousparse,nousystem,noureparse,nouunlnk /path/to/foo /path/to/bar
A workaround would be to use both install and chflags:
# install /path/to/foo /path/to/bar
# chflags 0 /path/to/bar
I've attached a patch for /head/usr.bin/xinstall/xinstall.c. This patch adds octal number support for install -f.
This change is not necessary for this purpose, since install(1) flags work differently from chflags(1). With chflags(1), you specify changes to the flags but with install(1), if you specify -f, it overrides all the flags. Therefore, you can use
install -f '' /path/to/foo /path/to/bar
If you want to copy flags using stat -f %Sf, you will unfortunately need a special case for no flags, as stat will write '-' which install (and chflags) will not accept.
Something in me does not like proliferating octal numbers further.
Here's what install(1)'s manual shows for -f:
"Specify the target's file flags; see chflags(1) for a list of possible flags and their meanings."
I interpret the first part of this sentence as meaning that the target's file flags will be set to whatever has been defined by -f, not that they will be adjusted like what you'd get by using chflags(1). If I'm interpreting this incorrectly, then maybe this should be reworded to avoid confusion.
When I see chflags(1) for a list of possible flags, the manual shows me that "flags are specified as an octal number or a comma separated list of keywords". I interpret this as meaning that install(1) should support either octal numbers or keywords, but looking at /head/usr.bin/xinstall/xinstall.c, I see support for keywords, and no support for octal numbers.
If the intention is to phase out usage of octal numbers, then maybe a better solution would be to change install(1)'s manual entry for its -f option to something like this:
"Specify the target's file flags; see the keywords section of chflags(1) for a list of possible flags and their meanings. Use -f '' to specify no flags for the target."