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