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