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