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