1*ddaa4e7dStsutsui#! /bin/sh 2*ddaa4e7dStsutsui# 3*ddaa4e7dStsutsui# install - install a program, script, or datafile 4*ddaa4e7dStsutsui# This comes from X11R5. 5*ddaa4e7dStsutsui# 6*ddaa4e7dStsutsui# Calling this script install-sh is preferred over install.sh, to prevent 7*ddaa4e7dStsutsui# `make' implicit rules from creating a file called install from it 8*ddaa4e7dStsutsui# when there is no Makefile. 9*ddaa4e7dStsutsui# 10*ddaa4e7dStsutsui# This script is compatible with the BSD install script, but was written 11*ddaa4e7dStsutsui# from scratch. 12*ddaa4e7dStsutsui# 13*ddaa4e7dStsutsui 14*ddaa4e7dStsutsui 15*ddaa4e7dStsutsui# set DOITPROG to echo to test this script 16*ddaa4e7dStsutsui 17*ddaa4e7dStsutsui# Don't use :- since 4.3BSD and earlier shells don't like it. 18*ddaa4e7dStsutsuidoit="${DOITPROG-}" 19*ddaa4e7dStsutsui 20*ddaa4e7dStsutsui 21*ddaa4e7dStsutsui# put in absolute paths if you don't have them in your path; or use env. vars. 22*ddaa4e7dStsutsui 23*ddaa4e7dStsutsuimvprog="${MVPROG-mv}" 24*ddaa4e7dStsutsuicpprog="${CPPROG-cp}" 25*ddaa4e7dStsutsuichmodprog="${CHMODPROG-chmod}" 26*ddaa4e7dStsutsuichownprog="${CHOWNPROG-chown}" 27*ddaa4e7dStsutsuichgrpprog="${CHGRPPROG-chgrp}" 28*ddaa4e7dStsutsuistripprog="${STRIPPROG-strip}" 29*ddaa4e7dStsutsuirmprog="${RMPROG-rm}" 30*ddaa4e7dStsutsuimkdirprog="${MKDIRPROG-mkdir}" 31*ddaa4e7dStsutsui 32*ddaa4e7dStsutsuitransformbasename="" 33*ddaa4e7dStsutsuitransform_arg="" 34*ddaa4e7dStsutsuiinstcmd="$mvprog" 35*ddaa4e7dStsutsuichmodcmd="$chmodprog 0755" 36*ddaa4e7dStsutsuichowncmd="" 37*ddaa4e7dStsutsuichgrpcmd="" 38*ddaa4e7dStsutsuistripcmd="" 39*ddaa4e7dStsutsuirmcmd="$rmprog -f" 40*ddaa4e7dStsutsuimvcmd="$mvprog" 41*ddaa4e7dStsutsuisrc="" 42*ddaa4e7dStsutsuidst="" 43*ddaa4e7dStsutsuidir_arg="" 44*ddaa4e7dStsutsui 45*ddaa4e7dStsutsuiwhile [ x"$1" != x ]; do 46*ddaa4e7dStsutsui case $1 in 47*ddaa4e7dStsutsui -c) instcmd="$cpprog" 48*ddaa4e7dStsutsui shift 49*ddaa4e7dStsutsui continue;; 50*ddaa4e7dStsutsui 51*ddaa4e7dStsutsui -d) dir_arg=true 52*ddaa4e7dStsutsui shift 53*ddaa4e7dStsutsui continue;; 54*ddaa4e7dStsutsui 55*ddaa4e7dStsutsui -m) chmodcmd="$chmodprog $2" 56*ddaa4e7dStsutsui shift 57*ddaa4e7dStsutsui shift 58*ddaa4e7dStsutsui continue;; 59*ddaa4e7dStsutsui 60*ddaa4e7dStsutsui -o) chowncmd="$chownprog $2" 61*ddaa4e7dStsutsui shift 62*ddaa4e7dStsutsui shift 63*ddaa4e7dStsutsui continue;; 64*ddaa4e7dStsutsui 65*ddaa4e7dStsutsui -g) chgrpcmd="$chgrpprog $2" 66*ddaa4e7dStsutsui shift 67*ddaa4e7dStsutsui shift 68*ddaa4e7dStsutsui continue;; 69*ddaa4e7dStsutsui 70*ddaa4e7dStsutsui -s) stripcmd="$stripprog" 71*ddaa4e7dStsutsui shift 72*ddaa4e7dStsutsui continue;; 73*ddaa4e7dStsutsui 74*ddaa4e7dStsutsui -t=*) transformarg=`echo $1 | sed 's/-t=//'` 75*ddaa4e7dStsutsui shift 76*ddaa4e7dStsutsui continue;; 77*ddaa4e7dStsutsui 78*ddaa4e7dStsutsui -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 79*ddaa4e7dStsutsui shift 80*ddaa4e7dStsutsui continue;; 81*ddaa4e7dStsutsui 82*ddaa4e7dStsutsui *) if [ x"$src" = x ] 83*ddaa4e7dStsutsui then 84*ddaa4e7dStsutsui src=$1 85*ddaa4e7dStsutsui else 86*ddaa4e7dStsutsui # this colon is to work around a 386BSD /bin/sh bug 87*ddaa4e7dStsutsui : 88*ddaa4e7dStsutsui dst=$1 89*ddaa4e7dStsutsui fi 90*ddaa4e7dStsutsui shift 91*ddaa4e7dStsutsui continue;; 92*ddaa4e7dStsutsui esac 93*ddaa4e7dStsutsuidone 94*ddaa4e7dStsutsui 95*ddaa4e7dStsutsuiif [ x"$src" = x ] 96*ddaa4e7dStsutsuithen 97*ddaa4e7dStsutsui echo "install: no input file specified" 98*ddaa4e7dStsutsui exit 1 99*ddaa4e7dStsutsuielse 100*ddaa4e7dStsutsui true 101*ddaa4e7dStsutsuifi 102*ddaa4e7dStsutsui 103*ddaa4e7dStsutsuiif [ x"$dir_arg" != x ]; then 104*ddaa4e7dStsutsui dst=$src 105*ddaa4e7dStsutsui src="" 106*ddaa4e7dStsutsui 107*ddaa4e7dStsutsui if [ -d $dst ]; then 108*ddaa4e7dStsutsui instcmd=: 109*ddaa4e7dStsutsui else 110*ddaa4e7dStsutsui instcmd=mkdir 111*ddaa4e7dStsutsui fi 112*ddaa4e7dStsutsuielse 113*ddaa4e7dStsutsui 114*ddaa4e7dStsutsui# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 115*ddaa4e7dStsutsui# might cause directories to be created, which would be especially bad 116*ddaa4e7dStsutsui# if $src (and thus $dsttmp) contains '*'. 117*ddaa4e7dStsutsui 118*ddaa4e7dStsutsui if [ -f $src -o -d $src ] 119*ddaa4e7dStsutsui then 120*ddaa4e7dStsutsui true 121*ddaa4e7dStsutsui else 122*ddaa4e7dStsutsui echo "install: $src does not exist" 123*ddaa4e7dStsutsui exit 1 124*ddaa4e7dStsutsui fi 125*ddaa4e7dStsutsui 126*ddaa4e7dStsutsui if [ x"$dst" = x ] 127*ddaa4e7dStsutsui then 128*ddaa4e7dStsutsui echo "install: no destination specified" 129*ddaa4e7dStsutsui exit 1 130*ddaa4e7dStsutsui else 131*ddaa4e7dStsutsui true 132*ddaa4e7dStsutsui fi 133*ddaa4e7dStsutsui 134*ddaa4e7dStsutsui# If destination is a directory, append the input filename; if your system 135*ddaa4e7dStsutsui# does not like double slashes in filenames, you may need to add some logic 136*ddaa4e7dStsutsui 137*ddaa4e7dStsutsui if [ -d $dst ] 138*ddaa4e7dStsutsui then 139*ddaa4e7dStsutsui dst="$dst"/`basename $src` 140*ddaa4e7dStsutsui else 141*ddaa4e7dStsutsui true 142*ddaa4e7dStsutsui fi 143*ddaa4e7dStsutsuifi 144*ddaa4e7dStsutsui 145*ddaa4e7dStsutsui## this sed command emulates the dirname command 146*ddaa4e7dStsutsuidstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 147*ddaa4e7dStsutsui 148*ddaa4e7dStsutsui# Make sure that the destination directory exists. 149*ddaa4e7dStsutsui# this part is taken from Noah Friedman's mkinstalldirs script 150*ddaa4e7dStsutsui 151*ddaa4e7dStsutsui# Skip lots of stat calls in the usual case. 152*ddaa4e7dStsutsuiif [ ! -d "$dstdir" ]; then 153*ddaa4e7dStsutsuidefaultIFS=' 154*ddaa4e7dStsutsui' 155*ddaa4e7dStsutsuiIFS="${IFS-${defaultIFS}}" 156*ddaa4e7dStsutsui 157*ddaa4e7dStsutsuioIFS="${IFS}" 158*ddaa4e7dStsutsui# Some sh's can't handle IFS=/ for some reason. 159*ddaa4e7dStsutsuiIFS='%' 160*ddaa4e7dStsutsuiset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 161*ddaa4e7dStsutsuiIFS="${oIFS}" 162*ddaa4e7dStsutsui 163*ddaa4e7dStsutsuipathcomp='' 164*ddaa4e7dStsutsui 165*ddaa4e7dStsutsuiwhile [ $# -ne 0 ] ; do 166*ddaa4e7dStsutsui pathcomp="${pathcomp}${1}" 167*ddaa4e7dStsutsui shift 168*ddaa4e7dStsutsui 169*ddaa4e7dStsutsui if [ ! -d "${pathcomp}" ] ; 170*ddaa4e7dStsutsui then 171*ddaa4e7dStsutsui $mkdirprog "${pathcomp}" 172*ddaa4e7dStsutsui else 173*ddaa4e7dStsutsui true 174*ddaa4e7dStsutsui fi 175*ddaa4e7dStsutsui 176*ddaa4e7dStsutsui pathcomp="${pathcomp}/" 177*ddaa4e7dStsutsuidone 178*ddaa4e7dStsutsuifi 179*ddaa4e7dStsutsui 180*ddaa4e7dStsutsuiif [ x"$dir_arg" != x ] 181*ddaa4e7dStsutsuithen 182*ddaa4e7dStsutsui $doit $instcmd $dst && 183*ddaa4e7dStsutsui 184*ddaa4e7dStsutsui if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 185*ddaa4e7dStsutsui if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 186*ddaa4e7dStsutsui if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 187*ddaa4e7dStsutsui if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 188*ddaa4e7dStsutsuielse 189*ddaa4e7dStsutsui 190*ddaa4e7dStsutsui# If we're going to rename the final executable, determine the name now. 191*ddaa4e7dStsutsui 192*ddaa4e7dStsutsui if [ x"$transformarg" = x ] 193*ddaa4e7dStsutsui then 194*ddaa4e7dStsutsui dstfile=`basename $dst` 195*ddaa4e7dStsutsui else 196*ddaa4e7dStsutsui dstfile=`basename $dst $transformbasename | 197*ddaa4e7dStsutsui sed $transformarg`$transformbasename 198*ddaa4e7dStsutsui fi 199*ddaa4e7dStsutsui 200*ddaa4e7dStsutsui# don't allow the sed command to completely eliminate the filename 201*ddaa4e7dStsutsui 202*ddaa4e7dStsutsui if [ x"$dstfile" = x ] 203*ddaa4e7dStsutsui then 204*ddaa4e7dStsutsui dstfile=`basename $dst` 205*ddaa4e7dStsutsui else 206*ddaa4e7dStsutsui true 207*ddaa4e7dStsutsui fi 208*ddaa4e7dStsutsui 209*ddaa4e7dStsutsui# Make a temp file name in the proper directory. 210*ddaa4e7dStsutsui 211*ddaa4e7dStsutsui dsttmp=$dstdir/#inst.$$# 212*ddaa4e7dStsutsui 213*ddaa4e7dStsutsui# Move or copy the file name to the temp name 214*ddaa4e7dStsutsui 215*ddaa4e7dStsutsui $doit $instcmd $src $dsttmp && 216*ddaa4e7dStsutsui 217*ddaa4e7dStsutsui trap "rm -f ${dsttmp}" 0 && 218*ddaa4e7dStsutsui 219*ddaa4e7dStsutsui# and set any options; do chmod last to preserve setuid bits 220*ddaa4e7dStsutsui 221*ddaa4e7dStsutsui# If any of these fail, we abort the whole thing. If we want to 222*ddaa4e7dStsutsui# ignore errors from any of these, just make sure not to ignore 223*ddaa4e7dStsutsui# errors from the above "$doit $instcmd $src $dsttmp" command. 224*ddaa4e7dStsutsui 225*ddaa4e7dStsutsui if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 226*ddaa4e7dStsutsui if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 227*ddaa4e7dStsutsui if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 228*ddaa4e7dStsutsui if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 229*ddaa4e7dStsutsui 230*ddaa4e7dStsutsui# Now rename the file to the real destination. 231*ddaa4e7dStsutsui 232*ddaa4e7dStsutsui $doit $rmcmd -f $dstdir/$dstfile && 233*ddaa4e7dStsutsui $doit $mvcmd $dsttmp $dstdir/$dstfile 234*ddaa4e7dStsutsui 235*ddaa4e7dStsutsuifi && 236*ddaa4e7dStsutsui 237*ddaa4e7dStsutsui 238*ddaa4e7dStsutsuiexit 0 239