From e07d4801f9846b9155d4c63872f51b18d8537d01 Mon Sep 17 00:00:00 2001 From: msweet Date: Wed, 22 Apr 2009 17:28:12 +0000 Subject: Merge changes from CUPS 1.4svn-r8540. git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@1432 a1ca3aef-8c08-0410-bb20-df032aa958be --- install-sh | 279 ++++++++++++++++++++++++++----------------------------------- 1 file changed, 119 insertions(+), 160 deletions(-) (limited to 'install-sh') diff --git a/install-sh b/install-sh index 2c4a67c2d..be1adf563 100755 --- a/install-sh +++ b/install-sh @@ -1,9 +1,19 @@ #!/bin/sh # -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). +# "$Id$" # -# Library stripping changes Copyright 2008 by Apple Inc. +# Install a program, script, or datafile. +# +# Copyright 2008-2009 by Apple Inc. +# +# This script is not compatible with BSD (or any other) install program, as it +# allows owner and group changes to fail with a warning and makes sure that the +# destination directory permissions are as specified - BSD install and the +# original X11 install script did not change permissions of existing +# directories. It also does not support the transform options since CUPS does +# not use them... +# +# Original script from X11R5 (mit/util/scripts/install.sh) # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its @@ -19,20 +29,15 @@ # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - # set DOITPROG to echo to test this script - # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" +# Force umask to 022... +umask 022 # put in absolute paths if you don't have them in your path; or use env. vars. - mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" @@ -56,172 +61,136 @@ dst="" dir_arg="" while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; + case $1 in + -c) + instcmd="$cpprog" + shift + continue + ;; + + -d) + dir_arg=true + shift + continue + ;; + + -m) + chmodcmd="$chmodprog $2" + shift + shift + continue + ;; + + -o) + chowncmd="$chownprog $2" + shift + shift + continue + ;; + + -g) + chgrpcmd="$chgrpprog $2" + shift + shift + continue + ;; + + -s) + stripcmd="$stripprog" + shift + continue + ;; - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac + *) + if [ x"$src" = x ]; then + src="$1" + else + dst="$1" + fi + shift + continue + ;; + esac done -if [ x"$src" = x ] -then - echo "install: no input file specified" +if [ x"$src" = x ]; then + echo "install-sh: No input file specified" exit 1 -else - : fi if [ x"$dir_arg" != x ]; then - dst=$src + dst="$src" src="" - if [ -d $dst ]; then + if [ -d "$dst" ]; then instcmd=: - chmodcmd="" else instcmd=$mkdirprog fi else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - : - else - echo "install: $src does not exist" + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if [ ! -f "$src" -a ! -d "$src" ]; then + echo "install: $src does not exist" exit 1 fi - if [ x"$dst" = x ] - then - echo "install: no destination specified" + if [ x"$dst" = x ]; then + echo "install: No destination specified" exit 1 - else - : fi -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - : + # If destination is a directory, append the input filename. + if [ -d "$dst" ]; then + dst="$dst/`basename $src`" fi fi ## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` +dstdir="`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`" # Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script +# This part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then -defaultIFS=' + defaultIFS=' ' -IFS="${IFS-${defaultIFS}}" + IFS="${IFS-${defaultIFS}}" -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" + oIFS="${IFS}" + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS="${oIFS}" -pathcomp='' + pathcomp='' -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift + while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" && - if [ x"$chowncmd" != x ]; then $doit $chowncmd "$pathcomp"; else : ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$pathcomp"; else : ; fi - else - : - fi + if [ ! -d "${pathcomp}" ]; then $doit $mkdirprog "${pathcomp}"; fi - pathcomp="${pathcomp}/" -done + pathcomp="${pathcomp}/" + done fi -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && +if [ x"$dir_arg" != x ]; then + # Make a directory... + $doit $instcmd $dst || exit 1 - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi + # Allow chown/chgrp to fail, but log a warning + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst || echo "warning: Unable to change owner of $dst!"; fi + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst || echo "warning: Unable to change group of $dst!"; fi + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst || exit 1; fi else + # Install a file... + dstfile="`basename $dst`" -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - : - fi - -# Check the destination file - for libraries just use the "-x" option to strip + # Check the destination file - for libraries just use the "-x" option + # to strip... case "$dstfile" in *.a | *.dylib | *.sl | *.sl.* | *.so | *.so.*) stripopt="-x" @@ -231,33 +200,23 @@ else ;; esac -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# + # Make a temp file name in the proper directory. + dsttmp="$dstdir/#inst.$$#" -# Move or copy the file name to the temp name + # Move or copy the file name to the temp name + $doit $instcmd $src $dsttmp || exit 1 - $doit $instcmd $src $dsttmp && + # Update permissions and strip as needed, then move to the final name. + # If the chmod, strip, rm, or mv commands fail, remove the installed + # file... + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp" || echo "warning: Unable to change owner of $dst!"; fi + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp" || echo "warning: Unable to change group of $dst!"; fi trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripopt $dsttmp; else :;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - + if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripopt "$dsttmp"; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; fi && + $doit $rmcmd -f "$dstdir/$dstfile" && + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" +fi exit 0 -- cgit v1.2.3