10e3d5408SPeter Wemm#! /bin/sh 20e3d5408SPeter Wemm# 30e3d5408SPeter Wemm# install - install a program, script, or datafile 415589c42SPeter Wemm# This comes from X11R5 (mit/util/scripts/install.sh). 515589c42SPeter Wemm# 615589c42SPeter Wemm# Copyright 1991 by the Massachusetts Institute of Technology 715589c42SPeter Wemm# 815589c42SPeter Wemm# Permission to use, copy, modify, distribute, and sell this software and its 915589c42SPeter Wemm# documentation for any purpose is hereby granted without fee, provided that 1015589c42SPeter Wemm# the above copyright notice appear in all copies and that both that 1115589c42SPeter Wemm# copyright notice and this permission notice appear in supporting 1215589c42SPeter Wemm# documentation, and that the name of M.I.T. not be used in advertising or 1315589c42SPeter Wemm# publicity pertaining to distribution of the software without specific, 1415589c42SPeter Wemm# written prior permission. M.I.T. makes no representations about the 1515589c42SPeter Wemm# suitability of this software for any purpose. It is provided "as is" 1615589c42SPeter Wemm# without express or implied warranty. 170e3d5408SPeter Wemm# 180e3d5408SPeter Wemm# Calling this script install-sh is preferred over install.sh, to prevent 190e3d5408SPeter Wemm# `make' implicit rules from creating a file called install from it 200e3d5408SPeter Wemm# when there is no Makefile. 210e3d5408SPeter Wemm# 220e3d5408SPeter Wemm# This script is compatible with the BSD install script, but was written 2315589c42SPeter Wemm# from scratch. It can only install one file at a time, a restriction 2415589c42SPeter Wemm# shared with many OS's install programs. 250e3d5408SPeter Wemm 260e3d5408SPeter Wemm 270e3d5408SPeter Wemm# set DOITPROG to echo to test this script 280e3d5408SPeter Wemm 290e3d5408SPeter Wemm# Don't use :- since 4.3BSD and earlier shells don't like it. 300e3d5408SPeter Wemmdoit="${DOITPROG-}" 310e3d5408SPeter Wemm 320e3d5408SPeter Wemm 330e3d5408SPeter Wemm# put in absolute paths if you don't have them in your path; or use env. vars. 340e3d5408SPeter Wemm 350e3d5408SPeter Wemmmvprog="${MVPROG-mv}" 360e3d5408SPeter Wemmcpprog="${CPPROG-cp}" 370e3d5408SPeter Wemmchmodprog="${CHMODPROG-chmod}" 380e3d5408SPeter Wemmchownprog="${CHOWNPROG-chown}" 390e3d5408SPeter Wemmchgrpprog="${CHGRPPROG-chgrp}" 400e3d5408SPeter Wemmstripprog="${STRIPPROG-strip}" 410e3d5408SPeter Wemmrmprog="${RMPROG-rm}" 420e3d5408SPeter Wemmmkdirprog="${MKDIRPROG-mkdir}" 430e3d5408SPeter Wemm 4415589c42SPeter Wemmtransformbasename="" 450e3d5408SPeter Wemmtransform_arg="" 460e3d5408SPeter Wemminstcmd="$mvprog" 470e3d5408SPeter Wemmchmodcmd="$chmodprog 0755" 480e3d5408SPeter Wemmchowncmd="" 490e3d5408SPeter Wemmchgrpcmd="" 500e3d5408SPeter Wemmstripcmd="" 510e3d5408SPeter Wemmrmcmd="$rmprog -f" 520e3d5408SPeter Wemmmvcmd="$mvprog" 530e3d5408SPeter Wemmsrc="" 540e3d5408SPeter Wemmdst="" 550e3d5408SPeter Wemmdir_arg="" 560e3d5408SPeter Wemm 570e3d5408SPeter Wemmwhile [ x"$1" != x ]; do 580e3d5408SPeter Wemm case $1 in 590e3d5408SPeter Wemm -c) instcmd="$cpprog" 600e3d5408SPeter Wemm shift 610e3d5408SPeter Wemm continue;; 620e3d5408SPeter Wemm 630e3d5408SPeter Wemm -d) dir_arg=true 640e3d5408SPeter Wemm shift 650e3d5408SPeter Wemm continue;; 660e3d5408SPeter Wemm 670e3d5408SPeter Wemm -m) chmodcmd="$chmodprog $2" 680e3d5408SPeter Wemm shift 690e3d5408SPeter Wemm shift 700e3d5408SPeter Wemm continue;; 710e3d5408SPeter Wemm 720e3d5408SPeter Wemm -o) chowncmd="$chownprog $2" 730e3d5408SPeter Wemm shift 740e3d5408SPeter Wemm shift 750e3d5408SPeter Wemm continue;; 760e3d5408SPeter Wemm 770e3d5408SPeter Wemm -g) chgrpcmd="$chgrpprog $2" 780e3d5408SPeter Wemm shift 790e3d5408SPeter Wemm shift 800e3d5408SPeter Wemm continue;; 810e3d5408SPeter Wemm 820e3d5408SPeter Wemm -s) stripcmd="$stripprog" 830e3d5408SPeter Wemm shift 840e3d5408SPeter Wemm continue;; 850e3d5408SPeter Wemm 860e3d5408SPeter Wemm -t=*) transformarg=`echo $1 | sed 's/-t=//'` 870e3d5408SPeter Wemm shift 880e3d5408SPeter Wemm continue;; 890e3d5408SPeter Wemm 900e3d5408SPeter Wemm -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 910e3d5408SPeter Wemm shift 920e3d5408SPeter Wemm continue;; 930e3d5408SPeter Wemm 940e3d5408SPeter Wemm *) if [ x"$src" = x ] 950e3d5408SPeter Wemm then 960e3d5408SPeter Wemm src=$1 970e3d5408SPeter Wemm else 980e3d5408SPeter Wemm # this colon is to work around a 386BSD /bin/sh bug 990e3d5408SPeter Wemm : 1000e3d5408SPeter Wemm dst=$1 1010e3d5408SPeter Wemm fi 1020e3d5408SPeter Wemm shift 1030e3d5408SPeter Wemm continue;; 1040e3d5408SPeter Wemm esac 1050e3d5408SPeter Wemmdone 1060e3d5408SPeter Wemm 1070e3d5408SPeter Wemmif [ x"$src" = x ] 1080e3d5408SPeter Wemmthen 1090e3d5408SPeter Wemm echo "install: no input file specified" 1100e3d5408SPeter Wemm exit 1 1110e3d5408SPeter Wemmelse 1120e3d5408SPeter Wemm true 1130e3d5408SPeter Wemmfi 1140e3d5408SPeter Wemm 1150e3d5408SPeter Wemmif [ x"$dir_arg" != x ]; then 1160e3d5408SPeter Wemm dst=$src 1170e3d5408SPeter Wemm src="" 1180e3d5408SPeter Wemm 1190e3d5408SPeter Wemm if [ -d $dst ]; then 1200e3d5408SPeter Wemm instcmd=: 1210e3d5408SPeter Wemm else 1220e3d5408SPeter Wemm instcmd=mkdir 1230e3d5408SPeter Wemm fi 1240e3d5408SPeter Wemmelse 1250e3d5408SPeter Wemm 1260e3d5408SPeter Wemm# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 1270e3d5408SPeter Wemm# might cause directories to be created, which would be especially bad 1280e3d5408SPeter Wemm# if $src (and thus $dsttmp) contains '*'. 1290e3d5408SPeter Wemm 1300e3d5408SPeter Wemm if [ -f $src -o -d $src ] 1310e3d5408SPeter Wemm then 1320e3d5408SPeter Wemm true 1330e3d5408SPeter Wemm else 1340e3d5408SPeter Wemm echo "install: $src does not exist" 1350e3d5408SPeter Wemm exit 1 1360e3d5408SPeter Wemm fi 1370e3d5408SPeter Wemm 1380e3d5408SPeter Wemm if [ x"$dst" = x ] 1390e3d5408SPeter Wemm then 1400e3d5408SPeter Wemm echo "install: no destination specified" 1410e3d5408SPeter Wemm exit 1 1420e3d5408SPeter Wemm else 1430e3d5408SPeter Wemm true 1440e3d5408SPeter Wemm fi 1450e3d5408SPeter Wemm 1460e3d5408SPeter Wemm# If destination is a directory, append the input filename; if your system 1470e3d5408SPeter Wemm# does not like double slashes in filenames, you may need to add some logic 1480e3d5408SPeter Wemm 1490e3d5408SPeter Wemm if [ -d $dst ] 1500e3d5408SPeter Wemm then 1510e3d5408SPeter Wemm dst="$dst"/`basename $src` 1520e3d5408SPeter Wemm else 1530e3d5408SPeter Wemm true 1540e3d5408SPeter Wemm fi 1550e3d5408SPeter Wemmfi 1560e3d5408SPeter Wemm 1570e3d5408SPeter Wemm## this sed command emulates the dirname command 1580e3d5408SPeter Wemmdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 1590e3d5408SPeter Wemm 1600e3d5408SPeter Wemm# Make sure that the destination directory exists. 1610e3d5408SPeter Wemm# this part is taken from Noah Friedman's mkinstalldirs script 1620e3d5408SPeter Wemm 1630e3d5408SPeter Wemm# Skip lots of stat calls in the usual case. 1640e3d5408SPeter Wemmif [ ! -d "$dstdir" ]; then 1650e3d5408SPeter WemmdefaultIFS=' 1660e3d5408SPeter Wemm' 1670e3d5408SPeter WemmIFS="${IFS-${defaultIFS}}" 1680e3d5408SPeter Wemm 1690e3d5408SPeter WemmoIFS="${IFS}" 1700e3d5408SPeter Wemm# Some sh's can't handle IFS=/ for some reason. 1710e3d5408SPeter WemmIFS='%' 1720e3d5408SPeter Wemmset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 1730e3d5408SPeter WemmIFS="${oIFS}" 1740e3d5408SPeter Wemm 1750e3d5408SPeter Wemmpathcomp='' 1760e3d5408SPeter Wemm 1770e3d5408SPeter Wemmwhile [ $# -ne 0 ] ; do 1780e3d5408SPeter Wemm pathcomp="${pathcomp}${1}" 1790e3d5408SPeter Wemm shift 1800e3d5408SPeter Wemm 1810e3d5408SPeter Wemm if [ ! -d "${pathcomp}" ] ; 1820e3d5408SPeter Wemm then 1830e3d5408SPeter Wemm $mkdirprog "${pathcomp}" 1840e3d5408SPeter Wemm else 1850e3d5408SPeter Wemm true 1860e3d5408SPeter Wemm fi 1870e3d5408SPeter Wemm 1880e3d5408SPeter Wemm pathcomp="${pathcomp}/" 1890e3d5408SPeter Wemmdone 1900e3d5408SPeter Wemmfi 1910e3d5408SPeter Wemm 1920e3d5408SPeter Wemmif [ x"$dir_arg" != x ] 1930e3d5408SPeter Wemmthen 1940e3d5408SPeter Wemm $doit $instcmd $dst && 1950e3d5408SPeter Wemm 1960e3d5408SPeter Wemm if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 1970e3d5408SPeter Wemm if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 1980e3d5408SPeter Wemm if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 1990e3d5408SPeter Wemm if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 2000e3d5408SPeter Wemmelse 2010e3d5408SPeter Wemm 2020e3d5408SPeter Wemm# If we're going to rename the final executable, determine the name now. 2030e3d5408SPeter Wemm 2040e3d5408SPeter Wemm if [ x"$transformarg" = x ] 2050e3d5408SPeter Wemm then 2060e3d5408SPeter Wemm dstfile=`basename $dst` 2070e3d5408SPeter Wemm else 2080e3d5408SPeter Wemm dstfile=`basename $dst $transformbasename | 2090e3d5408SPeter Wemm sed $transformarg`$transformbasename 2100e3d5408SPeter Wemm fi 2110e3d5408SPeter Wemm 2120e3d5408SPeter Wemm# don't allow the sed command to completely eliminate the filename 2130e3d5408SPeter Wemm 2140e3d5408SPeter Wemm if [ x"$dstfile" = x ] 2150e3d5408SPeter Wemm then 2160e3d5408SPeter Wemm dstfile=`basename $dst` 2170e3d5408SPeter Wemm else 2180e3d5408SPeter Wemm true 2190e3d5408SPeter Wemm fi 2200e3d5408SPeter Wemm 2210e3d5408SPeter Wemm# Make a temp file name in the proper directory. 2220e3d5408SPeter Wemm 2230e3d5408SPeter Wemm dsttmp=$dstdir/#inst.$$# 2240e3d5408SPeter Wemm 2250e3d5408SPeter Wemm# Move or copy the file name to the temp name 2260e3d5408SPeter Wemm 2270e3d5408SPeter Wemm $doit $instcmd $src $dsttmp && 2280e3d5408SPeter Wemm 2290e3d5408SPeter Wemm trap "rm -f ${dsttmp}" 0 && 2300e3d5408SPeter Wemm 2310e3d5408SPeter Wemm# and set any options; do chmod last to preserve setuid bits 2320e3d5408SPeter Wemm 2330e3d5408SPeter Wemm# If any of these fail, we abort the whole thing. If we want to 2340e3d5408SPeter Wemm# ignore errors from any of these, just make sure not to ignore 2350e3d5408SPeter Wemm# errors from the above "$doit $instcmd $src $dsttmp" command. 2360e3d5408SPeter Wemm 2370e3d5408SPeter Wemm if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 2380e3d5408SPeter Wemm if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 2390e3d5408SPeter Wemm if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 2400e3d5408SPeter Wemm if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 2410e3d5408SPeter Wemm 2420e3d5408SPeter Wemm# Now rename the file to the real destination. 2430e3d5408SPeter Wemm 2440e3d5408SPeter Wemm $doit $rmcmd -f $dstdir/$dstfile && 2450e3d5408SPeter Wemm $doit $mvcmd $dsttmp $dstdir/$dstfile 2460e3d5408SPeter Wemm 2470e3d5408SPeter Wemmfi && 2480e3d5408SPeter Wemm 2490e3d5408SPeter Wemm 2500e3d5408SPeter Wemmexit 0 251