1*00b67f09SDavid van Moolenbroek#!/bin/sh 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# NetBSD: install-sh.in,v 1.6 2012/01/11 13:07:31 hans Exp 4*00b67f09SDavid van Moolenbroek# This script now also installs multiple files, but might choke on installing 5*00b67f09SDavid van Moolenbroek# multiple files with spaces in the file names. 6*00b67f09SDavid van Moolenbroek# 7*00b67f09SDavid van Moolenbroek# install - install a program, script, or datafile 8*00b67f09SDavid van Moolenbroek# This comes from X11R5 (mit/util/scripts/install.sh). 9*00b67f09SDavid van Moolenbroek# 10*00b67f09SDavid van Moolenbroek# Copyright 1991 by the Massachusetts Institute of Technology 11*00b67f09SDavid van Moolenbroek# 12*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, distribute, and sell this software and its 13*00b67f09SDavid van Moolenbroek# documentation for any purpose is hereby granted without fee, provided that 14*00b67f09SDavid van Moolenbroek# the above copyright notice appear in all copies and that both that 15*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in supporting 16*00b67f09SDavid van Moolenbroek# documentation, and that the name of M.I.T. not be used in advertising or 17*00b67f09SDavid van Moolenbroek# publicity pertaining to distribution of the software without specific, 18*00b67f09SDavid van Moolenbroek# written prior permission. M.I.T. makes no representations about the 19*00b67f09SDavid van Moolenbroek# suitability of this software for any purpose. It is provided "as is" 20*00b67f09SDavid van Moolenbroek# without express or implied warranty. 21*00b67f09SDavid van Moolenbroek# 22*00b67f09SDavid van Moolenbroek# Calling this script install-sh is preferred over install.sh, to prevent 23*00b67f09SDavid van Moolenbroek# `make' implicit rules from creating a file called install from it 24*00b67f09SDavid van Moolenbroek# when there is no Makefile. 25*00b67f09SDavid van Moolenbroek# 26*00b67f09SDavid van Moolenbroek# This script is compatible with the BSD install script, but was written 27*00b67f09SDavid van Moolenbroek# from scratch. 28*00b67f09SDavid van Moolenbroek 29*00b67f09SDavid van Moolenbroek# set DOITPROG to echo to test this script 30*00b67f09SDavid van Moolenbroek 31*00b67f09SDavid van Moolenbroek# Don't use :- since 4.3BSD and earlier shells don't like it. 32*00b67f09SDavid van Moolenbroekdoit="${DOITPROG-}" 33*00b67f09SDavid van Moolenbroek 34*00b67f09SDavid van Moolenbroek 35*00b67f09SDavid van Moolenbroek# put in absolute paths if you don't have them in your path; or use env. vars. 36*00b67f09SDavid van Moolenbroek 37*00b67f09SDavid van Moolenbroekawkprog="${AWKPROG-awk}" 38*00b67f09SDavid van Moolenbroekmvprog="${MVPROG-mv}" 39*00b67f09SDavid van Moolenbroekcpprog="${CPPROG-cp}" 40*00b67f09SDavid van Moolenbroekchmodprog="${CHMODPROG-chmod}" 41*00b67f09SDavid van Moolenbroekchownprog="${CHOWNPROG-chown}" 42*00b67f09SDavid van Moolenbroekchgrpprog="${CHGRPPROG-chgrp}" 43*00b67f09SDavid van Moolenbroekstripprog="${STRIPPROG-strip}" 44*00b67f09SDavid van Moolenbroekrmprog="${RMPROG-rm}" 45*00b67f09SDavid van Moolenbroekmkdirprog="${MKDIRPROG-mkdir}" 46*00b67f09SDavid van Moolenbroek 47*00b67f09SDavid van Moolenbroekinstcmd="$cpprog" 48*00b67f09SDavid van Moolenbroekinstflags="" 49*00b67f09SDavid van Moolenbroekpathcompchmodcmd="$chmodprog 755" 50*00b67f09SDavid van Moolenbroekchmodcmd="$chmodprog 755" 51*00b67f09SDavid van Moolenbroekchowncmd="" 52*00b67f09SDavid van Moolenbroekchgrpcmd="" 53*00b67f09SDavid van Moolenbroekstripcmd="" 54*00b67f09SDavid van Moolenbroekstripflags="" 55*00b67f09SDavid van Moolenbroekrmcmd="$rmprog -f" 56*00b67f09SDavid van Moolenbroekmvcmd="$mvprog" 57*00b67f09SDavid van Moolenbroeksrc="" 58*00b67f09SDavid van Moolenbroekmsrc="" 59*00b67f09SDavid van Moolenbroekdst="" 60*00b67f09SDavid van Moolenbroekdir_arg="" 61*00b67f09SDavid van Moolenbroeksuffix="" 62*00b67f09SDavid van Moolenbroeksuffixfmt="" 63*00b67f09SDavid van Moolenbroek 64*00b67f09SDavid van Moolenbroekwhile [ x"$1" != x ]; do 65*00b67f09SDavid van Moolenbroek case $1 in 66*00b67f09SDavid van Moolenbroek -b) suffix=".old" 67*00b67f09SDavid van Moolenbroek shift 68*00b67f09SDavid van Moolenbroek continue;; 69*00b67f09SDavid van Moolenbroek 70*00b67f09SDavid van Moolenbroek -B) suffixfmt="$2" 71*00b67f09SDavid van Moolenbroek shift 72*00b67f09SDavid van Moolenbroek shift 73*00b67f09SDavid van Moolenbroek continue;; 74*00b67f09SDavid van Moolenbroek 75*00b67f09SDavid van Moolenbroek -c) instcmd="$cpprog" 76*00b67f09SDavid van Moolenbroek shift 77*00b67f09SDavid van Moolenbroek continue;; 78*00b67f09SDavid van Moolenbroek 79*00b67f09SDavid van Moolenbroek -d) dir_arg=true 80*00b67f09SDavid van Moolenbroek shift 81*00b67f09SDavid van Moolenbroek continue;; 82*00b67f09SDavid van Moolenbroek 83*00b67f09SDavid van Moolenbroek -m) chmodcmd="$chmodprog $2" 84*00b67f09SDavid van Moolenbroek shift 85*00b67f09SDavid van Moolenbroek shift 86*00b67f09SDavid van Moolenbroek continue;; 87*00b67f09SDavid van Moolenbroek 88*00b67f09SDavid van Moolenbroek -m*) 89*00b67f09SDavid van Moolenbroek chmodcmd="$chmodprog ${1#-m}" 90*00b67f09SDavid van Moolenbroek shift 91*00b67f09SDavid van Moolenbroek continue;; 92*00b67f09SDavid van Moolenbroek 93*00b67f09SDavid van Moolenbroek -o) chowncmd="$chownprog $2" 94*00b67f09SDavid van Moolenbroek shift 95*00b67f09SDavid van Moolenbroek shift 96*00b67f09SDavid van Moolenbroek continue;; 97*00b67f09SDavid van Moolenbroek 98*00b67f09SDavid van Moolenbroek -g) chgrpcmd="$chgrpprog $2" 99*00b67f09SDavid van Moolenbroek shift 100*00b67f09SDavid van Moolenbroek shift 101*00b67f09SDavid van Moolenbroek continue;; 102*00b67f09SDavid van Moolenbroek 103*00b67f09SDavid van Moolenbroek -s) stripcmd="$stripprog" 104*00b67f09SDavid van Moolenbroek shift 105*00b67f09SDavid van Moolenbroek continue;; 106*00b67f09SDavid van Moolenbroek 107*00b67f09SDavid van Moolenbroek -S) stripcmd="$stripprog" 108*00b67f09SDavid van Moolenbroek stripflags="-S $2 $stripflags" 109*00b67f09SDavid van Moolenbroek shift 110*00b67f09SDavid van Moolenbroek shift 111*00b67f09SDavid van Moolenbroek continue;; 112*00b67f09SDavid van Moolenbroek 113*00b67f09SDavid van Moolenbroek -p) instflags="-p" 114*00b67f09SDavid van Moolenbroek shift 115*00b67f09SDavid van Moolenbroek continue;; 116*00b67f09SDavid van Moolenbroek 117*00b67f09SDavid van Moolenbroek *) if [ x"$msrc" = x ] 118*00b67f09SDavid van Moolenbroek then 119*00b67f09SDavid van Moolenbroek msrc="$dst" 120*00b67f09SDavid van Moolenbroek else 121*00b67f09SDavid van Moolenbroek msrc="$msrc $dst" 122*00b67f09SDavid van Moolenbroek fi 123*00b67f09SDavid van Moolenbroek src="$dst" 124*00b67f09SDavid van Moolenbroek dst="$1" 125*00b67f09SDavid van Moolenbroek shift 126*00b67f09SDavid van Moolenbroek continue;; 127*00b67f09SDavid van Moolenbroek esac 128*00b67f09SDavid van Moolenbroekdone 129*00b67f09SDavid van Moolenbroek 130*00b67f09SDavid van Moolenbroekif [ x"$dir_arg" = x ] 131*00b67f09SDavid van Moolenbroekthen 132*00b67f09SDavid van Moolenbroek dstisfile="" 133*00b67f09SDavid van Moolenbroek if [ ! -d "$dst" ] 134*00b67f09SDavid van Moolenbroek then 135*00b67f09SDavid van Moolenbroek if [ x"$msrc" = x"$src" ] 136*00b67f09SDavid van Moolenbroek then 137*00b67f09SDavid van Moolenbroek dstisfile=true 138*00b67f09SDavid van Moolenbroek else 139*00b67f09SDavid van Moolenbroek echo "install: destination is not a directory" 140*00b67f09SDavid van Moolenbroek exit 1 141*00b67f09SDavid van Moolenbroek fi 142*00b67f09SDavid van Moolenbroek fi 143*00b67f09SDavid van Moolenbroekelse 144*00b67f09SDavid van Moolenbroek msrc="$msrc $dst" 145*00b67f09SDavid van Moolenbroekfi 146*00b67f09SDavid van Moolenbroek 147*00b67f09SDavid van Moolenbroekif [ x"$msrc" = x ] 148*00b67f09SDavid van Moolenbroekthen 149*00b67f09SDavid van Moolenbroek echo "install: no destination specified" 150*00b67f09SDavid van Moolenbroek exit 1 151*00b67f09SDavid van Moolenbroekfi 152*00b67f09SDavid van Moolenbroek 153*00b67f09SDavid van Moolenbroekfor srcarg in $msrc; do 154*00b67f09SDavid van Moolenbroek 155*00b67f09SDavid van Moolenbroekif [ x"$dir_arg" != x ]; then 156*00b67f09SDavid van Moolenbroek 157*00b67f09SDavid van Moolenbroek dstarg="$srcarg" 158*00b67f09SDavid van Moolenbroekelse 159*00b67f09SDavid van Moolenbroek dstarg="$dst" 160*00b67f09SDavid van Moolenbroek 161*00b67f09SDavid van Moolenbroek# Waiting for this to be detected by the "$instcmd $srcarg $dsttmp" command 162*00b67f09SDavid van Moolenbroek# might cause directories to be created, which would be especially bad 163*00b67f09SDavid van Moolenbroek# if $src (and thus $dsttmp) contains '*'. 164*00b67f09SDavid van Moolenbroek 165*00b67f09SDavid van Moolenbroek if [ -f "$srcarg" ] 166*00b67f09SDavid van Moolenbroek then 167*00b67f09SDavid van Moolenbroek doinst="$instcmd $instflags" 168*00b67f09SDavid van Moolenbroek elif [ -d "$srcarg" ] 169*00b67f09SDavid van Moolenbroek then 170*00b67f09SDavid van Moolenbroek echo "install: $srcarg: not a regular file" 171*00b67f09SDavid van Moolenbroek exit 1 172*00b67f09SDavid van Moolenbroek elif [ "$srcarg" = "/dev/null" ] 173*00b67f09SDavid van Moolenbroek then 174*00b67f09SDavid van Moolenbroek doinst="$cpprog" 175*00b67f09SDavid van Moolenbroek else 176*00b67f09SDavid van Moolenbroek echo "install: $srcarg does not exist" 177*00b67f09SDavid van Moolenbroek exit 1 178*00b67f09SDavid van Moolenbroek fi 179*00b67f09SDavid van Moolenbroek 180*00b67f09SDavid van Moolenbroek# If destination is a directory, append the input filename; if your system 181*00b67f09SDavid van Moolenbroek# does not like double slashes in filenames, you may need to add some logic 182*00b67f09SDavid van Moolenbroek 183*00b67f09SDavid van Moolenbroek if [ -d "$dstarg" ] 184*00b67f09SDavid van Moolenbroek then 185*00b67f09SDavid van Moolenbroek dstarg="$dstarg"/`basename "$srcarg"` 186*00b67f09SDavid van Moolenbroek fi 187*00b67f09SDavid van Moolenbroekfi 188*00b67f09SDavid van Moolenbroek 189*00b67f09SDavid van Moolenbroek## this sed command emulates the dirname command 190*00b67f09SDavid van Moolenbroekdstdir=`echo "$dstarg" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 191*00b67f09SDavid van Moolenbroek 192*00b67f09SDavid van Moolenbroek# Make sure that the destination directory exists. 193*00b67f09SDavid van Moolenbroek# this part is taken from Noah Friedman's mkinstalldirs script 194*00b67f09SDavid van Moolenbroek 195*00b67f09SDavid van Moolenbroek# Skip lots of stat calls in the usual case. 196*00b67f09SDavid van Moolenbroekif [ ! -d "$dstdir" ]; then 197*00b67f09SDavid van MoolenbroekdefaultIFS=' 198*00b67f09SDavid van Moolenbroek' 199*00b67f09SDavid van MoolenbroekIFS="${IFS-${defaultIFS}}" 200*00b67f09SDavid van Moolenbroek 201*00b67f09SDavid van MoolenbroekoIFS="${IFS}" 202*00b67f09SDavid van Moolenbroek# Some sh's can't handle IFS=/ for some reason. 203*00b67f09SDavid van MoolenbroekIFS='%' 204*00b67f09SDavid van Moolenbroekset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 205*00b67f09SDavid van MoolenbroekIFS="${oIFS}" 206*00b67f09SDavid van Moolenbroek 207*00b67f09SDavid van Moolenbroekpathcomp='' 208*00b67f09SDavid van Moolenbroek 209*00b67f09SDavid van Moolenbroekwhile [ $# -ne 0 ] ; do 210*00b67f09SDavid van Moolenbroek pathcomp="${pathcomp}${1}" 211*00b67f09SDavid van Moolenbroek shift 212*00b67f09SDavid van Moolenbroek 213*00b67f09SDavid van Moolenbroek if [ ! -d "${pathcomp}" ] ; 214*00b67f09SDavid van Moolenbroek then 215*00b67f09SDavid van Moolenbroek $doit $mkdirprog "${pathcomp}" 216*00b67f09SDavid van Moolenbroek if [ x"$chowncmd" != x ]; then $doit $chowncmd "${pathcomp}"; else true ; fi && 217*00b67f09SDavid van Moolenbroek if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "${pathcomp}"; else true ; fi && 218*00b67f09SDavid van Moolenbroek if [ x"$pathcompchmodcmd" != x ]; then $doit $pathcompchmodcmd "${pathcomp}"; else true ; fi 219*00b67f09SDavid van Moolenbroek 220*00b67f09SDavid van Moolenbroek else 221*00b67f09SDavid van Moolenbroek true 222*00b67f09SDavid van Moolenbroek fi 223*00b67f09SDavid van Moolenbroek 224*00b67f09SDavid van Moolenbroek pathcomp="${pathcomp}/" 225*00b67f09SDavid van Moolenbroekdone 226*00b67f09SDavid van Moolenbroekfi 227*00b67f09SDavid van Moolenbroek 228*00b67f09SDavid van Moolenbroek if [ x"$dir_arg" != x ] 229*00b67f09SDavid van Moolenbroek then 230*00b67f09SDavid van Moolenbroek if [ -d "$dstarg" ]; then 231*00b67f09SDavid van Moolenbroek true 232*00b67f09SDavid van Moolenbroek else 233*00b67f09SDavid van Moolenbroek $doit $mkdirprog "$dstarg" && 234*00b67f09SDavid van Moolenbroek 235*00b67f09SDavid van Moolenbroek if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dstarg"; else true ; fi && 236*00b67f09SDavid van Moolenbroek if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dstarg"; else true ; fi && 237*00b67f09SDavid van Moolenbroek if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dstarg"; else true ; fi 238*00b67f09SDavid van Moolenbroek fi 239*00b67f09SDavid van Moolenbroek else 240*00b67f09SDavid van Moolenbroek 241*00b67f09SDavid van Moolenbroek if [ x"$dstisfile" = x ] 242*00b67f09SDavid van Moolenbroek then 243*00b67f09SDavid van Moolenbroek file=$srcarg 244*00b67f09SDavid van Moolenbroek else 245*00b67f09SDavid van Moolenbroek file=$dst 246*00b67f09SDavid van Moolenbroek fi 247*00b67f09SDavid van Moolenbroek 248*00b67f09SDavid van Moolenbroek dstfile=`basename "$file"` 249*00b67f09SDavid van Moolenbroek dstfinal="$dstdir/$dstfile" 250*00b67f09SDavid van Moolenbroek 251*00b67f09SDavid van Moolenbroek# Make a temp file name in the proper directory. 252*00b67f09SDavid van Moolenbroek 253*00b67f09SDavid van Moolenbroek dsttmp=$dstdir/#inst.$$# 254*00b67f09SDavid van Moolenbroek 255*00b67f09SDavid van Moolenbroek# Make a backup file name in the proper directory. 256*00b67f09SDavid van Moolenbroek case x$suffixfmt in 257*00b67f09SDavid van Moolenbroek *%*) suffix=`echo x | 258*00b67f09SDavid van Moolenbroek $awkprog -v bname="$dstfinal" -v fmt="$suffixfmt" ' 259*00b67f09SDavid van Moolenbroek { cnt = 0; 260*00b67f09SDavid van Moolenbroek do { 261*00b67f09SDavid van Moolenbroek sfx = sprintf(fmt, cnt++); 262*00b67f09SDavid van Moolenbroek name = bname sfx; 263*00b67f09SDavid van Moolenbroek } while (system("test -f " name) == 0); 264*00b67f09SDavid van Moolenbroek print sfx; }' -`;; 265*00b67f09SDavid van Moolenbroek x) ;; 266*00b67f09SDavid van Moolenbroek *) suffix="$suffixfmt";; 267*00b67f09SDavid van Moolenbroek esac 268*00b67f09SDavid van Moolenbroek dstbackup="$dstfinal$suffix" 269*00b67f09SDavid van Moolenbroek 270*00b67f09SDavid van Moolenbroek# Move or copy the file name to the temp name 271*00b67f09SDavid van Moolenbroek 272*00b67f09SDavid van Moolenbroek $doit $doinst $srcarg "$dsttmp" && 273*00b67f09SDavid van Moolenbroek 274*00b67f09SDavid van Moolenbroek trap "rm -f ${dsttmp}" 0 && 275*00b67f09SDavid van Moolenbroek 276*00b67f09SDavid van Moolenbroek# and set any options; do chmod last to preserve setuid bits 277*00b67f09SDavid van Moolenbroek 278*00b67f09SDavid van Moolenbroek# If any of these fail, we abort the whole thing. If we want to 279*00b67f09SDavid van Moolenbroek# ignore errors from any of these, just make sure not to ignore 280*00b67f09SDavid van Moolenbroek# errors from the above "$doit $instcmd $src $dsttmp" command. 281*00b67f09SDavid van Moolenbroek 282*00b67f09SDavid van Moolenbroek if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else true;fi && 283*00b67f09SDavid van Moolenbroek if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else true;fi && 284*00b67f09SDavid van Moolenbroek if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripflags "$dsttmp"; else true;fi && 285*00b67f09SDavid van Moolenbroek if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else true;fi && 286*00b67f09SDavid van Moolenbroek 287*00b67f09SDavid van Moolenbroek# Now rename the file to the real destination. 288*00b67f09SDavid van Moolenbroek 289*00b67f09SDavid van Moolenbroek if [ x"$suffix" != x ] && [ -f "$dstfinal" ] 290*00b67f09SDavid van Moolenbroek then 291*00b67f09SDavid van Moolenbroek $doit $mvcmd "$dstfinal" "$dstbackup" 292*00b67f09SDavid van Moolenbroek else 293*00b67f09SDavid van Moolenbroek $doit $rmcmd -f "$dstfinal" 294*00b67f09SDavid van Moolenbroek fi && 295*00b67f09SDavid van Moolenbroek $doit $mvcmd "$dsttmp" "$dstfinal" 296*00b67f09SDavid van Moolenbroek fi 297*00b67f09SDavid van Moolenbroek 298*00b67f09SDavid van Moolenbroekdone && 299*00b67f09SDavid van Moolenbroek 300*00b67f09SDavid van Moolenbroek 301*00b67f09SDavid van Moolenbroekexit 0 302