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