119304Speter#!/bin/sh 219304Speter# 319304Speter# install - install a program, script, or datafile 419304Speter# This comes from X11R5. 519304Speter# 619304Speter# Calling this script install-sh is preferred over install.sh, to prevent 719304Speter# `make' implicit rules from creating a file called install from it 819304Speter# when there is no Makefile. 919304Speter# 1019304Speter# This script is compatible with the BSD install script, but was written 1119304Speter# from scratch. 1219304Speter# 1319304Speter 1419304Speter 1519304Speter# set DOITPROG to echo to test this script 1619304Speter 1719304Speter# Don't use :- since 4.3BSD and earlier shells don't like it. 1819304Speterdoit="${DOITPROG-}" 1919304Speter 2019304Speter 2119304Speter# put in absolute paths if you don't have them in your path; or use env. vars. 2219304Speter 2319304Spetermvprog="${MVPROG-mv}" 2419304Spetercpprog="${CPPROG-cp}" 2519304Speterchmodprog="${CHMODPROG-chmod}" 2619304Speterchownprog="${CHOWNPROG-chown}" 2719304Speterchgrpprog="${CHGRPPROG-chgrp}" 2819304Speterstripprog="${STRIPPROG-strip}" 2919304Speterrmprog="${RMPROG-rm}" 3019304Spetermkdirprog="${MKDIRPROG-mkdir}" 3119304Speter 3219304Spetertranformbasename="" 3319304Spetertransform_arg="" 3419304Speterinstcmd="$mvprog" 3519304Speterchmodcmd="$chmodprog 0755" 3619304Speterchowncmd="" 3719304Speterchgrpcmd="" 3819304Speterstripcmd="" 3919304Speterrmcmd="$rmprog -f" 4019304Spetermvcmd="$mvprog" 4119304Spetersrc="" 4219304Speterdst="" 4319304Speterdir_arg="" 4419304Speter 4519304Speterwhile [ x"$1" != x ]; do 4619304Speter case $1 in 4719304Speter -c) instcmd="$cpprog" 4819304Speter shift 4919304Speter continue;; 5019304Speter 5119304Speter -d) dir_arg=true 5219304Speter shift 5319304Speter continue;; 5419304Speter 5519304Speter -m) chmodcmd="$chmodprog $2" 5619304Speter shift 5719304Speter shift 5819304Speter continue;; 5919304Speter 6019304Speter -o) chowncmd="$chownprog $2" 6119304Speter shift 6219304Speter shift 6319304Speter continue;; 6419304Speter 6519304Speter -g) chgrpcmd="$chgrpprog $2" 6619304Speter shift 6719304Speter shift 6819304Speter continue;; 6919304Speter 7019304Speter -s) stripcmd="$stripprog" 7119304Speter shift 7219304Speter continue;; 7319304Speter 7419304Speter -t=*) transformarg=`echo $1 | sed 's/-t=//'` 7519304Speter shift 7619304Speter continue;; 7719304Speter 7819304Speter -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 7919304Speter shift 8019304Speter continue;; 8119304Speter 8219304Speter *) if [ x"$src" = x ] 8319304Speter then 8419304Speter src=$1 8519304Speter else 8619304Speter # this colon is to work around a 386BSD /bin/sh bug 8719304Speter : 8819304Speter dst=$1 8919304Speter fi 9019304Speter shift 9119304Speter continue;; 9219304Speter esac 9319304Speterdone 9419304Speter 9519304Speterif [ x"$src" = x ] 9619304Speterthen 9719304Speter echo "install: no input file specified" 9819304Speter exit 1 9919304Speterelse 10019304Speter true 10119304Speterfi 10219304Speter 10319304Speterif [ x"$dir_arg" != x ]; then 10419304Speter dst=$src 10519304Speter src="" 10619304Speter 10719304Speter if [ -d $dst ]; then 10819304Speter instcmd=: 10919304Speter else 11019304Speter instcmd=mkdir 11119304Speter fi 11219304Speterelse 11319304Speter 11419304Speter# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 11519304Speter# might cause directories to be created, which would be especially bad 11619304Speter# if $src (and thus $dsttmp) contains '*'. 11719304Speter 11819304Speter if [ -f $src -o -d $src ] 11919304Speter then 12019304Speter true 12119304Speter else 12219304Speter echo "install: $src does not exist" 12319304Speter exit 1 12419304Speter fi 12519304Speter 12619304Speter if [ x"$dst" = x ] 12719304Speter then 12819304Speter echo "install: no destination specified" 12919304Speter exit 1 13019304Speter else 13119304Speter true 13219304Speter fi 13319304Speter 13419304Speter# If destination is a directory, append the input filename; if your system 13519304Speter# does not like double slashes in filenames, you may need to add some logic 13619304Speter 13719304Speter if [ -d $dst ] 13819304Speter then 13919304Speter dst="$dst"/`basename $src` 14019304Speter else 14119304Speter true 14219304Speter fi 14319304Speterfi 14419304Speter 14519304Speter## this sed command emulates the dirname command 14619304Speterdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 14719304Speter 14819304Speter# Make sure that the destination directory exists. 14919304Speter# this part is taken from Noah Friedman's mkinstalldirs script 15019304Speter 15119304Speter# Skip lots of stat calls in the usual case. 15219304Speterif [ ! -d "$dstdir" ]; then 15319304SpeterdefaultIFS=' 15419304Speter' 15519304SpeterIFS="${IFS-${defaultIFS}}" 15619304Speter 15719304SpeteroIFS="${IFS}" 15819304Speter# Some sh's can't handle IFS=/ for some reason. 15919304SpeterIFS='%' 16019304Speterset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 16119304SpeterIFS="${oIFS}" 16219304Speter 16319304Speterpathcomp='' 16419304Speter 16519304Speterwhile [ $# -ne 0 ] ; do 16619304Speter pathcomp="${pathcomp}${1}" 16719304Speter shift 16819304Speter 16919304Speter if [ ! -d "${pathcomp}" ] ; 17019304Speter then 17119304Speter $mkdirprog "${pathcomp}" 17219304Speter else 17319304Speter true 17419304Speter fi 17519304Speter 17619304Speter pathcomp="${pathcomp}/" 17719304Speterdone 17819304Speterfi 17919304Speter 18019304Speterif [ x"$dir_arg" != x ] 18119304Speterthen 18219304Speter $doit $instcmd $dst && 18319304Speter 18419304Speter if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 18519304Speter if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 18619304Speter if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 18719304Speter if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 18819304Speterelse 18919304Speter 19019304Speter# If we're going to rename the final executable, determine the name now. 19119304Speter 19219304Speter if [ x"$transformarg" = x ] 19319304Speter then 19419304Speter dstfile=`basename $dst` 19519304Speter else 19619304Speter dstfile=`basename $dst $transformbasename | 19719304Speter sed $transformarg`$transformbasename 19819304Speter fi 19919304Speter 20019304Speter# don't allow the sed command to completely eliminate the filename 20119304Speter 20219304Speter if [ x"$dstfile" = x ] 20319304Speter then 20419304Speter dstfile=`basename $dst` 20519304Speter else 20619304Speter true 20719304Speter fi 20819304Speter 20919304Speter# Make a temp file name in the proper directory. 21019304Speter 21119304Speter dsttmp=$dstdir/#inst.$$# 21219304Speter 21319304Speter# Move or copy the file name to the temp name 21419304Speter 21519304Speter $doit $instcmd $src $dsttmp && 21619304Speter 21719304Speter trap "rm -f ${dsttmp}" 0 && 21819304Speter 21919304Speter# and set any options; do chmod last to preserve setuid bits 22019304Speter 22119304Speter# If any of these fail, we abort the whole thing. If we want to 22219304Speter# ignore errors from any of these, just make sure not to ignore 22319304Speter# errors from the above "$doit $instcmd $src $dsttmp" command. 22419304Speter 22519304Speter if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 22619304Speter if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 22719304Speter if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 22819304Speter if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 22919304Speter 23019304Speter# Now rename the file to the real destination. 23119304Speter 23219304Speter $doit $rmcmd -f $dstdir/$dstfile && 23319304Speter $doit $mvcmd $dsttmp $dstdir/$dstfile 23419304Speter 23519304Speterfi && 23619304Speter 23719304Speter 23819304Speterexit 0 239