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