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