summaryrefslogtreecommitdiff
path: root/install-sh
diff options
context:
space:
mode:
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2009-04-22 17:28:12 +0000
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2009-04-22 17:28:12 +0000
commite07d4801f9846b9155d4c63872f51b18d8537d01 (patch)
tree5d86f7517a23788405e78b36d0a91c6898d3390d /install-sh
parent38e73f87814ea3029636fb1850b0483884b3cbbe (diff)
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
Diffstat (limited to 'install-sh')
-rwxr-xr-xinstall-sh279
1 files changed, 119 insertions, 160 deletions
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