18cf6c252SPaul Traina#! /bin/sh 28cf6c252SPaul Traina# 38cf6c252SPaul Traina# install - install a program, script, or datafile 48cf6c252SPaul Traina# This comes from X11R5. 58cf6c252SPaul Traina# 68cf6c252SPaul Traina# Calling this script install-sh is preferred over install.sh, to prevent 78cf6c252SPaul Traina# `make' implicit rules from creating a file called install from it 88cf6c252SPaul Traina# when there is no Makefile. 98cf6c252SPaul Traina# 108cf6c252SPaul Traina# This script is compatible with the BSD install script, but was written 118cf6c252SPaul Traina# from scratch. 128cf6c252SPaul Traina# 138cf6c252SPaul Traina 148cf6c252SPaul Traina 158cf6c252SPaul Traina# set DOITPROG to echo to test this script 168cf6c252SPaul Traina 178cf6c252SPaul Traina# Don't use :- since 4.3BSD and earlier shells don't like it. 188cf6c252SPaul Trainadoit="${DOITPROG-}" 198cf6c252SPaul Traina 208cf6c252SPaul Traina 218cf6c252SPaul Traina# put in absolute paths if you don't have them in your path; or use env. vars. 228cf6c252SPaul Traina 238cf6c252SPaul Trainamvprog="${MVPROG-mv}" 248cf6c252SPaul Trainacpprog="${CPPROG-cp}" 258cf6c252SPaul Trainachmodprog="${CHMODPROG-chmod}" 268cf6c252SPaul Trainachownprog="${CHOWNPROG-chown}" 278cf6c252SPaul Trainachgrpprog="${CHGRPPROG-chgrp}" 288cf6c252SPaul Trainastripprog="${STRIPPROG-strip}" 298cf6c252SPaul Trainarmprog="${RMPROG-rm}" 308cf6c252SPaul Trainamkdirprog="${MKDIRPROG-mkdir}" 318cf6c252SPaul Traina 328cf6c252SPaul Trainatransformbasename="" 338cf6c252SPaul Trainatransform_arg="" 348cf6c252SPaul Trainainstcmd="$mvprog" 358cf6c252SPaul Trainachmodcmd="$chmodprog 0755" 368cf6c252SPaul Trainachowncmd="" 378cf6c252SPaul Trainachgrpcmd="" 388cf6c252SPaul Trainastripcmd="" 398cf6c252SPaul Trainarmcmd="$rmprog -f" 408cf6c252SPaul Trainamvcmd="$mvprog" 418cf6c252SPaul Trainasrc="" 428cf6c252SPaul Trainadst="" 438cf6c252SPaul Trainadir_arg="" 448cf6c252SPaul Traina 458cf6c252SPaul Trainawhile [ x"$1" != x ]; do 468cf6c252SPaul Traina case $1 in 478cf6c252SPaul Traina -c) instcmd="$cpprog" 488cf6c252SPaul Traina shift 498cf6c252SPaul Traina continue;; 508cf6c252SPaul Traina 518cf6c252SPaul Traina -d) dir_arg=true 528cf6c252SPaul Traina shift 538cf6c252SPaul Traina continue;; 548cf6c252SPaul Traina 558cf6c252SPaul Traina -m) chmodcmd="$chmodprog $2" 568cf6c252SPaul Traina shift 578cf6c252SPaul Traina shift 588cf6c252SPaul Traina continue;; 598cf6c252SPaul Traina 608cf6c252SPaul Traina -o) chowncmd="$chownprog $2" 618cf6c252SPaul Traina shift 628cf6c252SPaul Traina shift 638cf6c252SPaul Traina continue;; 648cf6c252SPaul Traina 658cf6c252SPaul Traina -g) chgrpcmd="$chgrpprog $2" 668cf6c252SPaul Traina shift 678cf6c252SPaul Traina shift 688cf6c252SPaul Traina continue;; 698cf6c252SPaul Traina 708cf6c252SPaul Traina -s) stripcmd="$stripprog" 718cf6c252SPaul Traina shift 728cf6c252SPaul Traina continue;; 738cf6c252SPaul Traina 748cf6c252SPaul Traina -t=*) transformarg=`echo $1 | sed 's/-t=//'` 758cf6c252SPaul Traina shift 768cf6c252SPaul Traina continue;; 778cf6c252SPaul Traina 788cf6c252SPaul Traina -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 798cf6c252SPaul Traina shift 808cf6c252SPaul Traina continue;; 818cf6c252SPaul Traina 828cf6c252SPaul Traina *) if [ x"$src" = x ] 838cf6c252SPaul Traina then 848cf6c252SPaul Traina src=$1 858cf6c252SPaul Traina else 868cf6c252SPaul Traina # this colon is to work around a 386BSD /bin/sh bug 878cf6c252SPaul Traina : 888cf6c252SPaul Traina dst=$1 898cf6c252SPaul Traina fi 908cf6c252SPaul Traina shift 918cf6c252SPaul Traina continue;; 928cf6c252SPaul Traina esac 938cf6c252SPaul Trainadone 948cf6c252SPaul Traina 958cf6c252SPaul Trainaif [ x"$src" = x ] 968cf6c252SPaul Trainathen 978cf6c252SPaul Traina echo "install: no input file specified" 988cf6c252SPaul Traina exit 1 998cf6c252SPaul Trainaelse 1008cf6c252SPaul Traina true 1018cf6c252SPaul Trainafi 1028cf6c252SPaul Traina 1038cf6c252SPaul Trainaif [ x"$dir_arg" != x ]; then 1048cf6c252SPaul Traina dst=$src 1058cf6c252SPaul Traina src="" 1068cf6c252SPaul Traina 1078cf6c252SPaul Traina if [ -d $dst ]; then 1088cf6c252SPaul Traina instcmd=: 1098cf6c252SPaul Traina else 1108cf6c252SPaul Traina instcmd=mkdir 1118cf6c252SPaul Traina fi 1128cf6c252SPaul Trainaelse 1138cf6c252SPaul Traina 1148cf6c252SPaul Traina# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 1158cf6c252SPaul Traina# might cause directories to be created, which would be especially bad 1168cf6c252SPaul Traina# if $src (and thus $dsttmp) contains '*'. 1178cf6c252SPaul Traina 1188cf6c252SPaul Traina if [ -f $src -o -d $src ] 1198cf6c252SPaul Traina then 1208cf6c252SPaul Traina true 1218cf6c252SPaul Traina else 1228cf6c252SPaul Traina echo "install: $src does not exist" 1238cf6c252SPaul Traina exit 1 1248cf6c252SPaul Traina fi 1258cf6c252SPaul Traina 1268cf6c252SPaul Traina if [ x"$dst" = x ] 1278cf6c252SPaul Traina then 1288cf6c252SPaul Traina echo "install: no destination specified" 1298cf6c252SPaul Traina exit 1 1308cf6c252SPaul Traina else 1318cf6c252SPaul Traina true 1328cf6c252SPaul Traina fi 1338cf6c252SPaul Traina 1348cf6c252SPaul Traina# If destination is a directory, append the input filename; if your system 1358cf6c252SPaul Traina# does not like double slashes in filenames, you may need to add some logic 1368cf6c252SPaul Traina 1378cf6c252SPaul Traina if [ -d $dst ] 1388cf6c252SPaul Traina then 1398cf6c252SPaul Traina dst="$dst"/`basename $src` 1408cf6c252SPaul Traina else 1418cf6c252SPaul Traina true 1428cf6c252SPaul Traina fi 1438cf6c252SPaul Trainafi 1448cf6c252SPaul Traina 1458cf6c252SPaul Traina## this sed command emulates the dirname command 1468cf6c252SPaul Trainadstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 1478cf6c252SPaul Traina 1488cf6c252SPaul Traina# Make sure that the destination directory exists. 1498cf6c252SPaul Traina# this part is taken from Noah Friedman's mkinstalldirs script 1508cf6c252SPaul Traina 1518cf6c252SPaul Traina# Skip lots of stat calls in the usual case. 1528cf6c252SPaul Trainaif [ ! -d "$dstdir" ]; then 1538cf6c252SPaul TrainadefaultIFS=' 1548cf6c252SPaul Traina' 1558cf6c252SPaul TrainaIFS="${IFS-${defaultIFS}}" 1568cf6c252SPaul Traina 1578cf6c252SPaul TrainaoIFS="${IFS}" 1588cf6c252SPaul Traina# Some sh's can't handle IFS=/ for some reason. 1598cf6c252SPaul TrainaIFS='%' 1608cf6c252SPaul Trainaset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 1618cf6c252SPaul TrainaIFS="${oIFS}" 1628cf6c252SPaul Traina 1638cf6c252SPaul Trainapathcomp='' 1648cf6c252SPaul Traina 1658cf6c252SPaul Trainawhile [ $# -ne 0 ] ; do 1668cf6c252SPaul Traina pathcomp="${pathcomp}${1}" 1678cf6c252SPaul Traina shift 1688cf6c252SPaul Traina 1698cf6c252SPaul Traina if [ ! -d "${pathcomp}" ] ; 1708cf6c252SPaul Traina then 1718cf6c252SPaul Traina $mkdirprog "${pathcomp}" 1728cf6c252SPaul Traina else 1738cf6c252SPaul Traina true 1748cf6c252SPaul Traina fi 1758cf6c252SPaul Traina 1768cf6c252SPaul Traina pathcomp="${pathcomp}/" 1778cf6c252SPaul Trainadone 1788cf6c252SPaul Trainafi 1798cf6c252SPaul Traina 1808cf6c252SPaul Trainaif [ x"$dir_arg" != x ] 1818cf6c252SPaul Trainathen 1828cf6c252SPaul Traina $doit $instcmd $dst && 1838cf6c252SPaul Traina 1848cf6c252SPaul Traina if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 1858cf6c252SPaul Traina if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 1868cf6c252SPaul Traina if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 1878cf6c252SPaul Traina if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 1888cf6c252SPaul Trainaelse 1898cf6c252SPaul Traina 1908cf6c252SPaul Traina# If we're going to rename the final executable, determine the name now. 1918cf6c252SPaul Traina 1928cf6c252SPaul Traina if [ x"$transformarg" = x ] 1938cf6c252SPaul Traina then 1948cf6c252SPaul Traina dstfile=`basename $dst` 1958cf6c252SPaul Traina else 1968cf6c252SPaul Traina dstfile=`basename $dst $transformbasename | 1978cf6c252SPaul Traina sed $transformarg`$transformbasename 1988cf6c252SPaul Traina fi 1998cf6c252SPaul Traina 2008cf6c252SPaul Traina# don't allow the sed command to completely eliminate the filename 2018cf6c252SPaul Traina 2028cf6c252SPaul Traina if [ x"$dstfile" = x ] 2038cf6c252SPaul Traina then 2048cf6c252SPaul Traina dstfile=`basename $dst` 2058cf6c252SPaul Traina else 2068cf6c252SPaul Traina true 2078cf6c252SPaul Traina fi 2088cf6c252SPaul Traina 2098cf6c252SPaul Traina# Make a temp file name in the proper directory. 2108cf6c252SPaul Traina 2118cf6c252SPaul Traina dsttmp=$dstdir/#inst.$$# 2128cf6c252SPaul Traina 2138cf6c252SPaul Traina# Move or copy the file name to the temp name 2148cf6c252SPaul Traina 2158cf6c252SPaul Traina $doit $instcmd $src $dsttmp && 2168cf6c252SPaul Traina 2178cf6c252SPaul Traina trap "rm -f ${dsttmp}" 0 && 2188cf6c252SPaul Traina 2198cf6c252SPaul Traina# and set any options; do chmod last to preserve setuid bits 2208cf6c252SPaul Traina 2218cf6c252SPaul Traina# If any of these fail, we abort the whole thing. If we want to 2228cf6c252SPaul Traina# ignore errors from any of these, just make sure not to ignore 2238cf6c252SPaul Traina# errors from the above "$doit $instcmd $src $dsttmp" command. 2248cf6c252SPaul Traina 2258cf6c252SPaul Traina if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 2268cf6c252SPaul Traina if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 2278cf6c252SPaul Traina if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 2288cf6c252SPaul Traina if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 2298cf6c252SPaul Traina 2308cf6c252SPaul Traina# Now rename the file to the real destination. 2318cf6c252SPaul Traina 2328cf6c252SPaul Traina $doit $rmcmd -f $dstdir/$dstfile && 2338cf6c252SPaul Traina $doit $mvcmd $dsttmp $dstdir/$dstfile 2348cf6c252SPaul Traina 2358cf6c252SPaul Trainafi && 2368cf6c252SPaul Traina 2378cf6c252SPaul Traina 2388cf6c252SPaul Trainaexit 0 239