1*b636d99dSDavid van Moolenbroek#! /bin/sh 2*b636d99dSDavid van Moolenbroek# 3*b636d99dSDavid van Moolenbroek# install - install a program, script, or datafile 4*b636d99dSDavid van Moolenbroek# This comes from X11R5 (mit/util/scripts/install.sh). 5*b636d99dSDavid van Moolenbroek# 6*b636d99dSDavid van Moolenbroek# Copyright 1991 by the Massachusetts Institute of Technology 7*b636d99dSDavid van Moolenbroek# 8*b636d99dSDavid van Moolenbroek# Permission to use, copy, modify, distribute, and sell this software and its 9*b636d99dSDavid van Moolenbroek# documentation for any purpose is hereby granted without fee, provided that 10*b636d99dSDavid van Moolenbroek# the above copyright notice appear in all copies and that both that 11*b636d99dSDavid van Moolenbroek# copyright notice and this permission notice appear in supporting 12*b636d99dSDavid van Moolenbroek# documentation, and that the name of M.I.T. not be used in advertising or 13*b636d99dSDavid van Moolenbroek# publicity pertaining to distribution of the software without specific, 14*b636d99dSDavid van Moolenbroek# written prior permission. M.I.T. makes no representations about the 15*b636d99dSDavid van Moolenbroek# suitability of this software for any purpose. It is provided "as is" 16*b636d99dSDavid van Moolenbroek# without express or implied warranty. 17*b636d99dSDavid van Moolenbroek# 18*b636d99dSDavid van Moolenbroek# Calling this script install-sh is preferred over install.sh, to prevent 19*b636d99dSDavid van Moolenbroek# `make' implicit rules from creating a file called install from it 20*b636d99dSDavid van Moolenbroek# when there is no Makefile. 21*b636d99dSDavid van Moolenbroek# 22*b636d99dSDavid van Moolenbroek# This script is compatible with the BSD install script, but was written 23*b636d99dSDavid van Moolenbroek# from scratch. It can only install one file at a time, a restriction 24*b636d99dSDavid van Moolenbroek# shared with many OS's install programs. 25*b636d99dSDavid van Moolenbroek 26*b636d99dSDavid van Moolenbroek 27*b636d99dSDavid van Moolenbroek# set DOITPROG to echo to test this script 28*b636d99dSDavid van Moolenbroek 29*b636d99dSDavid van Moolenbroek# Don't use :- since 4.3BSD and earlier shells don't like it. 30*b636d99dSDavid van Moolenbroekdoit="${DOITPROG-}" 31*b636d99dSDavid van Moolenbroek 32*b636d99dSDavid van Moolenbroek 33*b636d99dSDavid van Moolenbroek# put in absolute paths if you don't have them in your path; or use env. vars. 34*b636d99dSDavid van Moolenbroek 35*b636d99dSDavid van Moolenbroekmvprog="${MVPROG-mv}" 36*b636d99dSDavid van Moolenbroekcpprog="${CPPROG-cp}" 37*b636d99dSDavid van Moolenbroekchmodprog="${CHMODPROG-chmod}" 38*b636d99dSDavid van Moolenbroekchownprog="${CHOWNPROG-chown}" 39*b636d99dSDavid van Moolenbroekchgrpprog="${CHGRPPROG-chgrp}" 40*b636d99dSDavid van Moolenbroekstripprog="${STRIPPROG-strip}" 41*b636d99dSDavid van Moolenbroekrmprog="${RMPROG-rm}" 42*b636d99dSDavid van Moolenbroekmkdirprog="${MKDIRPROG-mkdir}" 43*b636d99dSDavid van Moolenbroek 44*b636d99dSDavid van Moolenbroektransformbasename="" 45*b636d99dSDavid van Moolenbroektransform_arg="" 46*b636d99dSDavid van Moolenbroekinstcmd="$mvprog" 47*b636d99dSDavid van Moolenbroekchmodcmd="$chmodprog 0755" 48*b636d99dSDavid van Moolenbroekchowncmd="" 49*b636d99dSDavid van Moolenbroekchgrpcmd="" 50*b636d99dSDavid van Moolenbroekstripcmd="" 51*b636d99dSDavid van Moolenbroekrmcmd="$rmprog -f" 52*b636d99dSDavid van Moolenbroekmvcmd="$mvprog" 53*b636d99dSDavid van Moolenbroeksrc="" 54*b636d99dSDavid van Moolenbroekdst="" 55*b636d99dSDavid van Moolenbroekdir_arg="" 56*b636d99dSDavid van Moolenbroek 57*b636d99dSDavid van Moolenbroekwhile [ x"$1" != x ]; do 58*b636d99dSDavid van Moolenbroek case $1 in 59*b636d99dSDavid van Moolenbroek -c) instcmd="$cpprog" 60*b636d99dSDavid van Moolenbroek shift 61*b636d99dSDavid van Moolenbroek continue;; 62*b636d99dSDavid van Moolenbroek 63*b636d99dSDavid van Moolenbroek -d) dir_arg=true 64*b636d99dSDavid van Moolenbroek shift 65*b636d99dSDavid van Moolenbroek continue;; 66*b636d99dSDavid van Moolenbroek 67*b636d99dSDavid van Moolenbroek -m) chmodcmd="$chmodprog $2" 68*b636d99dSDavid van Moolenbroek shift 69*b636d99dSDavid van Moolenbroek shift 70*b636d99dSDavid van Moolenbroek continue;; 71*b636d99dSDavid van Moolenbroek 72*b636d99dSDavid van Moolenbroek -o) chowncmd="$chownprog $2" 73*b636d99dSDavid van Moolenbroek shift 74*b636d99dSDavid van Moolenbroek shift 75*b636d99dSDavid van Moolenbroek continue;; 76*b636d99dSDavid van Moolenbroek 77*b636d99dSDavid van Moolenbroek -g) chgrpcmd="$chgrpprog $2" 78*b636d99dSDavid van Moolenbroek shift 79*b636d99dSDavid van Moolenbroek shift 80*b636d99dSDavid van Moolenbroek continue;; 81*b636d99dSDavid van Moolenbroek 82*b636d99dSDavid van Moolenbroek -s) stripcmd="$stripprog" 83*b636d99dSDavid van Moolenbroek shift 84*b636d99dSDavid van Moolenbroek continue;; 85*b636d99dSDavid van Moolenbroek 86*b636d99dSDavid van Moolenbroek -t=*) transformarg=`echo $1 | sed 's/-t=//'` 87*b636d99dSDavid van Moolenbroek shift 88*b636d99dSDavid van Moolenbroek continue;; 89*b636d99dSDavid van Moolenbroek 90*b636d99dSDavid van Moolenbroek -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 91*b636d99dSDavid van Moolenbroek shift 92*b636d99dSDavid van Moolenbroek continue;; 93*b636d99dSDavid van Moolenbroek 94*b636d99dSDavid van Moolenbroek *) if [ x"$src" = x ] 95*b636d99dSDavid van Moolenbroek then 96*b636d99dSDavid van Moolenbroek src=$1 97*b636d99dSDavid van Moolenbroek else 98*b636d99dSDavid van Moolenbroek # this colon is to work around a 386BSD /bin/sh bug 99*b636d99dSDavid van Moolenbroek : 100*b636d99dSDavid van Moolenbroek dst=$1 101*b636d99dSDavid van Moolenbroek fi 102*b636d99dSDavid van Moolenbroek shift 103*b636d99dSDavid van Moolenbroek continue;; 104*b636d99dSDavid van Moolenbroek esac 105*b636d99dSDavid van Moolenbroekdone 106*b636d99dSDavid van Moolenbroek 107*b636d99dSDavid van Moolenbroekif [ x"$src" = x ] 108*b636d99dSDavid van Moolenbroekthen 109*b636d99dSDavid van Moolenbroek echo "install: no input file specified" 110*b636d99dSDavid van Moolenbroek exit 1 111*b636d99dSDavid van Moolenbroekelse 112*b636d99dSDavid van Moolenbroek true 113*b636d99dSDavid van Moolenbroekfi 114*b636d99dSDavid van Moolenbroek 115*b636d99dSDavid van Moolenbroekif [ x"$dir_arg" != x ]; then 116*b636d99dSDavid van Moolenbroek dst=$src 117*b636d99dSDavid van Moolenbroek src="" 118*b636d99dSDavid van Moolenbroek 119*b636d99dSDavid van Moolenbroek if [ -d $dst ]; then 120*b636d99dSDavid van Moolenbroek instcmd=: 121*b636d99dSDavid van Moolenbroek else 122*b636d99dSDavid van Moolenbroek instcmd=mkdir 123*b636d99dSDavid van Moolenbroek fi 124*b636d99dSDavid van Moolenbroekelse 125*b636d99dSDavid van Moolenbroek 126*b636d99dSDavid van Moolenbroek# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 127*b636d99dSDavid van Moolenbroek# might cause directories to be created, which would be especially bad 128*b636d99dSDavid van Moolenbroek# if $src (and thus $dsttmp) contains '*'. 129*b636d99dSDavid van Moolenbroek 130*b636d99dSDavid van Moolenbroek if [ -f $src -o -d $src ] 131*b636d99dSDavid van Moolenbroek then 132*b636d99dSDavid van Moolenbroek true 133*b636d99dSDavid van Moolenbroek else 134*b636d99dSDavid van Moolenbroek echo "install: $src does not exist" 135*b636d99dSDavid van Moolenbroek exit 1 136*b636d99dSDavid van Moolenbroek fi 137*b636d99dSDavid van Moolenbroek 138*b636d99dSDavid van Moolenbroek if [ x"$dst" = x ] 139*b636d99dSDavid van Moolenbroek then 140*b636d99dSDavid van Moolenbroek echo "install: no destination specified" 141*b636d99dSDavid van Moolenbroek exit 1 142*b636d99dSDavid van Moolenbroek else 143*b636d99dSDavid van Moolenbroek true 144*b636d99dSDavid van Moolenbroek fi 145*b636d99dSDavid van Moolenbroek 146*b636d99dSDavid van Moolenbroek# If destination is a directory, append the input filename; if your system 147*b636d99dSDavid van Moolenbroek# does not like double slashes in filenames, you may need to add some logic 148*b636d99dSDavid van Moolenbroek 149*b636d99dSDavid van Moolenbroek if [ -d $dst ] 150*b636d99dSDavid van Moolenbroek then 151*b636d99dSDavid van Moolenbroek dst="$dst"/`basename $src` 152*b636d99dSDavid van Moolenbroek else 153*b636d99dSDavid van Moolenbroek true 154*b636d99dSDavid van Moolenbroek fi 155*b636d99dSDavid van Moolenbroekfi 156*b636d99dSDavid van Moolenbroek 157*b636d99dSDavid van Moolenbroek## this sed command emulates the dirname command 158*b636d99dSDavid van Moolenbroekdstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 159*b636d99dSDavid van Moolenbroek 160*b636d99dSDavid van Moolenbroek# Make sure that the destination directory exists. 161*b636d99dSDavid van Moolenbroek# this part is taken from Noah Friedman's mkinstalldirs script 162*b636d99dSDavid van Moolenbroek 163*b636d99dSDavid van Moolenbroek# Skip lots of stat calls in the usual case. 164*b636d99dSDavid van Moolenbroekif [ ! -d "$dstdir" ]; then 165*b636d99dSDavid van MoolenbroekdefaultIFS=' 166*b636d99dSDavid van Moolenbroek' 167*b636d99dSDavid van MoolenbroekIFS="${IFS-${defaultIFS}}" 168*b636d99dSDavid van Moolenbroek 169*b636d99dSDavid van MoolenbroekoIFS="${IFS}" 170*b636d99dSDavid van Moolenbroek# Some sh's can't handle IFS=/ for some reason. 171*b636d99dSDavid van MoolenbroekIFS='%' 172*b636d99dSDavid van Moolenbroekset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 173*b636d99dSDavid van MoolenbroekIFS="${oIFS}" 174*b636d99dSDavid van Moolenbroek 175*b636d99dSDavid van Moolenbroekpathcomp='' 176*b636d99dSDavid van Moolenbroek 177*b636d99dSDavid van Moolenbroekwhile [ $# -ne 0 ] ; do 178*b636d99dSDavid van Moolenbroek pathcomp="${pathcomp}${1}" 179*b636d99dSDavid van Moolenbroek shift 180*b636d99dSDavid van Moolenbroek 181*b636d99dSDavid van Moolenbroek if [ ! -d "${pathcomp}" ] ; 182*b636d99dSDavid van Moolenbroek then 183*b636d99dSDavid van Moolenbroek $mkdirprog "${pathcomp}" 184*b636d99dSDavid van Moolenbroek else 185*b636d99dSDavid van Moolenbroek true 186*b636d99dSDavid van Moolenbroek fi 187*b636d99dSDavid van Moolenbroek 188*b636d99dSDavid van Moolenbroek pathcomp="${pathcomp}/" 189*b636d99dSDavid van Moolenbroekdone 190*b636d99dSDavid van Moolenbroekfi 191*b636d99dSDavid van Moolenbroek 192*b636d99dSDavid van Moolenbroekif [ x"$dir_arg" != x ] 193*b636d99dSDavid van Moolenbroekthen 194*b636d99dSDavid van Moolenbroek $doit $instcmd $dst && 195*b636d99dSDavid van Moolenbroek 196*b636d99dSDavid van Moolenbroek if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 197*b636d99dSDavid van Moolenbroek if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && 198*b636d99dSDavid van Moolenbroek if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && 199*b636d99dSDavid van Moolenbroek if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi 200*b636d99dSDavid van Moolenbroekelse 201*b636d99dSDavid van Moolenbroek 202*b636d99dSDavid van Moolenbroek# If we're going to rename the final executable, determine the name now. 203*b636d99dSDavid van Moolenbroek 204*b636d99dSDavid van Moolenbroek if [ x"$transformarg" = x ] 205*b636d99dSDavid van Moolenbroek then 206*b636d99dSDavid van Moolenbroek dstfile=`basename $dst` 207*b636d99dSDavid van Moolenbroek else 208*b636d99dSDavid van Moolenbroek dstfile=`basename $dst $transformbasename | 209*b636d99dSDavid van Moolenbroek sed $transformarg`$transformbasename 210*b636d99dSDavid van Moolenbroek fi 211*b636d99dSDavid van Moolenbroek 212*b636d99dSDavid van Moolenbroek# don't allow the sed command to completely eliminate the filename 213*b636d99dSDavid van Moolenbroek 214*b636d99dSDavid van Moolenbroek if [ x"$dstfile" = x ] 215*b636d99dSDavid van Moolenbroek then 216*b636d99dSDavid van Moolenbroek dstfile=`basename $dst` 217*b636d99dSDavid van Moolenbroek else 218*b636d99dSDavid van Moolenbroek true 219*b636d99dSDavid van Moolenbroek fi 220*b636d99dSDavid van Moolenbroek 221*b636d99dSDavid van Moolenbroek# Make a temp file name in the proper directory. 222*b636d99dSDavid van Moolenbroek 223*b636d99dSDavid van Moolenbroek dsttmp=$dstdir/#inst.$$# 224*b636d99dSDavid van Moolenbroek 225*b636d99dSDavid van Moolenbroek# Move or copy the file name to the temp name 226*b636d99dSDavid van Moolenbroek 227*b636d99dSDavid van Moolenbroek $doit $instcmd $src $dsttmp && 228*b636d99dSDavid van Moolenbroek 229*b636d99dSDavid van Moolenbroek trap "rm -f ${dsttmp}" 0 && 230*b636d99dSDavid van Moolenbroek 231*b636d99dSDavid van Moolenbroek# and set any options; do chmod last to preserve setuid bits 232*b636d99dSDavid van Moolenbroek 233*b636d99dSDavid van Moolenbroek# If any of these fail, we abort the whole thing. If we want to 234*b636d99dSDavid van Moolenbroek# ignore errors from any of these, just make sure not to ignore 235*b636d99dSDavid van Moolenbroek# errors from the above "$doit $instcmd $src $dsttmp" command. 236*b636d99dSDavid van Moolenbroek 237*b636d99dSDavid van Moolenbroek if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 238*b636d99dSDavid van Moolenbroek if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 239*b636d99dSDavid van Moolenbroek if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 240*b636d99dSDavid van Moolenbroek if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 241*b636d99dSDavid van Moolenbroek 242*b636d99dSDavid van Moolenbroek# Now rename the file to the real destination. 243*b636d99dSDavid van Moolenbroek 244*b636d99dSDavid van Moolenbroek $doit $rmcmd -f $dstdir/$dstfile && 245*b636d99dSDavid van Moolenbroek $doit $mvcmd $dsttmp $dstdir/$dstfile 246*b636d99dSDavid van Moolenbroek 247*b636d99dSDavid van Moolenbroekfi && 248*b636d99dSDavid van Moolenbroek 249*b636d99dSDavid van Moolenbroek 250*b636d99dSDavid van Moolenbroekexit 0 251