#!/bin/sh## install - install a program, script, or datafile# This comes 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# documentation for any purpose is hereby granted without fee, provided that# the above copyright notice appear in all copies and that both that# copyright notice and this permission notice appear in supporting# documentation, and that the name of M.I.T. not be used in advertising or# publicity pertaining to distribution of the software without specific,# written prior permission. M.I.T. makes no representations about the# suitability of this software for any purpose. It is provided "as is"# without express or implied warranty.## 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-}"# 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}"chownprog="${CHOWNPROG-chown}"chgrpprog="${CHGRPPROG-chgrp}"stripprog="${STRIPPROG-strip}"rmprog="${RMPROG-rm}"mkdirprog="${MKDIRPROG-mkdir}"transformbasename=""transform_arg=""instcmd="$mvprog"chmodcmd="$chmodprog 0755"chowncmd=""chgrpcmd=""stripcmd=""rmcmd="$rmprog -f"mvcmd="$mvprog"src=""dst=""dir_arg=""while[ x"$1" != x ];docase$1 in
-c)instcmd=$cpprogshiftcontinue;; -d)dir_arg=true shiftcontinue;; -m)chmodcmd="$chmodprog$2"shift shiftcontinue;; -o)chowncmd="$chownprog$2"shift shiftcontinue;; -g)chgrpcmd="$chgrpprog$2"shift shiftcontinue;; -s)stripcmd=$stripprogshiftcontinue;; -t=*)transformarg=`echo$1| sed 's/-t=//'`shiftcontinue;; -b=*)transformbasename=`echo$1| sed 's/-b=//'`shiftcontinue;; *)if[ x"$src"= x ]thensrc=$1else# this colon is to work around a 386BSD /bin/sh bug :
dst=$1fishiftcontinue;;esacdoneif[ x"$src"= x ]thenecho"$0: no input file specified" >&2
exit 1
else :
fiif[ x"$dir_arg" != x ];thendst=$srcsrc=""if[ -d "$dst"];theninstcmd=:
chmodcmd=""elseinstcmd=$mkdirprogfielse# 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"]||[ -d "$src"]then :
elseecho"$0: $src does not exist" >&2
exit 1
fiif[ x"$dst"= x ]thenecho"$0: no destination specified" >&2
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 logicif[ -d "$dst"]thendst=$dst/`basename "$src"`else :
fifi## this sed command emulates the dirname commanddstdir=`echo"$dst"| sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`# Make sure that the destination directory exists.# this part is taken from Noah Friedman's mkinstalldirs script# Skip lots of stat calls in the usual case.if[ ! -d "$dstdir"];thendefaultIFS=' '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=$oIFSpathcomp=''while[$# -ne 0];dopathcomp=$pathcomp$1shiftif[ ! -d "$pathcomp"];then$mkdirprog"$pathcomp"else :
fipathcomp=$pathcomp/
donefiif[ x"$dir_arg" != x ]then$doit$instcmd"$dst"&&if[ x"$chowncmd" != x ];then$doit$chowncmd"$dst";else : ;fi&&if[ x"$chgrpcmd" != x ];then$doit$chgrpcmd"$dst";else : ;fi&&if[ x"$stripcmd" != x ];then$doit$stripcmd"$dst";else : ;fi&&if[ x"$chmodcmd" != x ];then$doit$chmodcmd"$dst";else : ;fielse# If we're going to rename the final executable, determine the name now.if[ x"$transformarg"= x ]thendstfile=`basename "$dst"`elsedstfile=`basename "$dst"$transformbasename| sed $transformarg`$transformbasenamefi# don't allow the sed command to completely eliminate the filenameif[ x"$dstfile"= x ]thendstfile=`basename "$dst"`else :
fi# Make a couple of temp file names in the proper directory.dsttmp=$dstdir/#inst.$$#rmtmp=$dstdir/#rm.$$## Trap to clean up temp files at exit.trap'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
trap'(exit $?); exit'1213 15
# Move or copy the file name to the temp name$doit$instcmd"$src""$dsttmp"&&# 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"$dsttmp";else :;fi&&if[ x"$chmodcmd" != x ];then$doit$chmodcmd"$dsttmp";else :;fi&&# Now remove or move aside any old file at destination location. We try this# two ways since rm can't unlink itself on some systems and the destination# file might be busy for other reasons. In this case, the final cleanup# might fail but the new file should still install successfully.{if[ -f "$dstdir/$dstfile"]then$doit$rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||$doit$mvcmd -f "$dstdir/$dstfile""$rmtmp" 2>/dev/null ||{echo"$0: cannot unlink or rename $dstdir/$dstfile" >&2
(exit 1);exit}else :
fi}&&# Now rename the file to the real destination.$doit$mvcmd"$dsttmp""$dstdir/$dstfile"fi&&# The final little trick to "correctly" pass the exit status to the exit trap.{(exit 0);exit}