insufficient flag handling in tools/install.sh
Alexander Best
arundel at freebsd.org
Fri Feb 4 10:22:21 UTC 2011
On Fri Feb 4 11, Eygene Ryabinkin wrote:
> Alexander, good day.
hi eygene. thanks a lot for your patch. i made two changes:
1) also catch the -v option for install(1).
2) install(1) accepts multiple directories as arguments, when he -d flag has
been specified. so i don't think it's necessary to iterate through all the
directories passed to install.sh and invoke install(1) with only one
argument at a time.
could you take a look at the attached patch?
thanks.
alex
>
> Thu, Feb 03, 2011 at 07:43:06PM +0000, Alexander Best wrote:
> > it seems the -d flag breaks the semantics of tools/install.sh entirely and
> > using the script in such a case simply passes all args over to install(1).
> >
> > simply adding the -d flag to the first switch statement won't work, since we
> > need to tell install(1) that it should only expect a single directory as
> > argument. so the -d flag needs to be passed over to install(1), while options
> > such as -o X, -g X, etc. need to be stripped away.
>
> The attached patch should fix this:
> {{{
> $ sh install.sh.orig -d -m 700 `pwd`/a-test
> $ ls -ld a-test
> drwx------ 2 rea rea 512 4 Feb 10:03 a-test
> $ sh install.sh -d -m 700 `pwd`/a-test
> $ ls -ld a-test
> drwxr-xr-x 2 rea rea 512 4 Feb 10:03 a-test
> }}}
>
> It also adds some proper quoting for the remaining arguments (plain $*
> vs quoted "$@") to the install.sh (this is a pathological case, but it
> is better to fix this too, while we're on topic):
> {{{
> $ rm -rf 1; mkdir 1; cd 1; sh -x ../install.sh.orig -d -m 512 "this is a test"; ls -l; cd ..
> + [ 4 -gt 0 ]
> + break
> + exec install -p -d -m 512 this is a test
> total 8
> dr-x--x-w- 2 rea rea 512 Feb 4 10:10 a
> dr-x--x-w- 2 rea rea 512 Feb 4 10:10 is
> dr-x--x-w- 2 rea rea 512 Feb 4 10:10 test
> dr-x--x-w- 2 rea rea 512 Feb 4 10:10 this
>
> $ rm -rf 1; mkdir 1; cd 1; sh -x ../install.sh -d -m 512 "this is a test"; ls -l; cd ..
> + dirmode=''
> + [ 4 -gt 0 ]
> + dirmode=YES
> + shift
> + [ 3 -gt 0 ]
> + shift
> + shift
> + [ 1 -gt 0 ]
> + break
> + [ 1 -eq 0 ]
> + [ -z YES ]
> + install -d 'this is a test'
> total 2
> drwxr-xr-x 2 rea rea 512 Feb 4 10:10 this is a test
> }}}
> --
> Eygene Ryabinkin ,,,^..^,,,
> [ Life's unfair - but root password helps! | codelabs.ru ]
> [ 82FE 06BC D497 C0DE 49EC 4FF0 16AF 9EAE 8152 ECFB | freebsd.org ]
--
a13x
-------------- next part --------------
Index: tools/install.sh
===================================================================
--- tools/install.sh (revision 218217)
+++ tools/install.sh (working copy)
@@ -29,14 +29,25 @@
# $FreeBSD$
# parse install's options and ignore them completely.
+dirmode=""
while [ $# -gt 0 ]; do
case $1 in
- -[bCcMpSs]) shift;;
+ -d) dirmode="YES"; shift;;
+ -[bCcMpSsv]) shift;;
-[Bfgmo]) shift; shift;;
-[Bfgmo]*) shift;;
*) break;
esac
done
+if [ "$#" -eq 0 ]; then
+ echo "Nothing to do: no files/dirs specified" >&2
+ exit 1
+fi
+
# the remaining arguments are assumed to be files/dirs only.
-exec install -p $*
+if [ -z "$dirmode" ]; then
+ exec install -p "$@"
+else
+ exec install -d "$@"
+fi
More information about the freebsd-hackers
mailing list