xref: /minix3/external/bsd/bind/dist/unit/atf-src/admin/install-sh (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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