xref: /freebsd/crypto/heimdal/install-sh (revision b528cefc6b8f9670b31a865051741d946cb37085)
1b528cefcSMark Murray#! /bin/sh
2b528cefcSMark Murray#
3b528cefcSMark Murray# install - install a program, script, or datafile
4b528cefcSMark Murray# This comes from X11R5.
5b528cefcSMark Murray#
6b528cefcSMark Murray# Calling this script install-sh is preferred over install.sh, to prevent
7b528cefcSMark Murray# `make' implicit rules from creating a file called install from it
8b528cefcSMark Murray# when there is no Makefile.
9b528cefcSMark Murray#
10b528cefcSMark Murray# This script is compatible with the BSD install script, but was written
11b528cefcSMark Murray# from scratch.
12b528cefcSMark Murray#
13b528cefcSMark Murray
14b528cefcSMark Murray
15b528cefcSMark Murray# set DOITPROG to echo to test this script
16b528cefcSMark Murray
17b528cefcSMark Murray# Don't use :- since 4.3BSD and earlier shells don't like it.
18b528cefcSMark Murraydoit="${DOITPROG-}"
19b528cefcSMark Murray
20b528cefcSMark Murray
21b528cefcSMark Murray# put in absolute paths if you don't have them in your path; or use env. vars.
22b528cefcSMark Murray
23b528cefcSMark Murraymvprog="${MVPROG-mv}"
24b528cefcSMark Murraycpprog="${CPPROG-cp}"
25b528cefcSMark Murraychmodprog="${CHMODPROG-chmod}"
26b528cefcSMark Murraychownprog="${CHOWNPROG-chown}"
27b528cefcSMark Murraychgrpprog="${CHGRPPROG-chgrp}"
28b528cefcSMark Murraystripprog="${STRIPPROG-strip}"
29b528cefcSMark Murrayrmprog="${RMPROG-rm}"
30b528cefcSMark Murraymkdirprog="${MKDIRPROG-mkdir}"
31b528cefcSMark Murray
32b528cefcSMark Murraytranformbasename=""
33b528cefcSMark Murraytransform_arg=""
34b528cefcSMark Murrayinstcmd="$mvprog"
35b528cefcSMark Murraychmodcmd="$chmodprog 0755"
36b528cefcSMark Murraychowncmd=""
37b528cefcSMark Murraychgrpcmd=""
38b528cefcSMark Murraystripcmd=""
39b528cefcSMark Murrayrmcmd="$rmprog -f"
40b528cefcSMark Murraymvcmd="$mvprog"
41b528cefcSMark Murraysrc=""
42b528cefcSMark Murraydst=""
43b528cefcSMark Murraydir_arg=""
44b528cefcSMark Murray
45b528cefcSMark Murraywhile [ x"$1" != x ]; do
46b528cefcSMark Murray    case $1 in
47b528cefcSMark Murray	-c) instcmd="$cpprog"
48b528cefcSMark Murray	    shift
49b528cefcSMark Murray	    continue;;
50b528cefcSMark Murray
51b528cefcSMark Murray	-d) dir_arg=true
52b528cefcSMark Murray	    shift
53b528cefcSMark Murray	    continue;;
54b528cefcSMark Murray
55b528cefcSMark Murray	-m) chmodcmd="$chmodprog $2"
56b528cefcSMark Murray	    shift
57b528cefcSMark Murray	    shift
58b528cefcSMark Murray	    continue;;
59b528cefcSMark Murray
60b528cefcSMark Murray	-o) chowncmd="$chownprog $2"
61b528cefcSMark Murray	    shift
62b528cefcSMark Murray	    shift
63b528cefcSMark Murray	    continue;;
64b528cefcSMark Murray
65b528cefcSMark Murray	-g) chgrpcmd="$chgrpprog $2"
66b528cefcSMark Murray	    shift
67b528cefcSMark Murray	    shift
68b528cefcSMark Murray	    continue;;
69b528cefcSMark Murray
70b528cefcSMark Murray	-s) stripcmd="$stripprog"
71b528cefcSMark Murray	    shift
72b528cefcSMark Murray	    continue;;
73b528cefcSMark Murray
74b528cefcSMark Murray	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
75b528cefcSMark Murray	    shift
76b528cefcSMark Murray	    continue;;
77b528cefcSMark Murray
78b528cefcSMark Murray	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
79b528cefcSMark Murray	    shift
80b528cefcSMark Murray	    continue;;
81b528cefcSMark Murray
82b528cefcSMark Murray	*)  if [ x"$src" = x ]
83b528cefcSMark Murray	    then
84b528cefcSMark Murray		src=$1
85b528cefcSMark Murray	    else
86b528cefcSMark Murray		# this colon is to work around a 386BSD /bin/sh bug
87b528cefcSMark Murray		:
88b528cefcSMark Murray		dst=$1
89b528cefcSMark Murray	    fi
90b528cefcSMark Murray	    shift
91b528cefcSMark Murray	    continue;;
92b528cefcSMark Murray    esac
93b528cefcSMark Murraydone
94b528cefcSMark Murray
95b528cefcSMark Murrayif [ x"$src" = x ]
96b528cefcSMark Murraythen
97b528cefcSMark Murray	echo "install:	no input file specified"
98b528cefcSMark Murray	exit 1
99b528cefcSMark Murrayelse
100b528cefcSMark Murray	true
101b528cefcSMark Murrayfi
102b528cefcSMark Murray
103b528cefcSMark Murrayif [ x"$dir_arg" != x ]; then
104b528cefcSMark Murray	dst=$src
105b528cefcSMark Murray	src=""
106b528cefcSMark Murray
107b528cefcSMark Murray	if [ -d $dst ]; then
108b528cefcSMark Murray		instcmd=:
109b528cefcSMark Murray	else
110b528cefcSMark Murray		instcmd=mkdir
111b528cefcSMark Murray	fi
112b528cefcSMark Murrayelse
113b528cefcSMark Murray
114b528cefcSMark Murray# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
115b528cefcSMark Murray# might cause directories to be created, which would be especially bad
116b528cefcSMark Murray# if $src (and thus $dsttmp) contains '*'.
117b528cefcSMark Murray
118b528cefcSMark Murray	if [ -f $src -o -d $src ]
119b528cefcSMark Murray	then
120b528cefcSMark Murray		true
121b528cefcSMark Murray	else
122b528cefcSMark Murray		echo "install:  $src does not exist"
123b528cefcSMark Murray		exit 1
124b528cefcSMark Murray	fi
125b528cefcSMark Murray
126b528cefcSMark Murray	if [ x"$dst" = x ]
127b528cefcSMark Murray	then
128b528cefcSMark Murray		echo "install:	no destination specified"
129b528cefcSMark Murray		exit 1
130b528cefcSMark Murray	else
131b528cefcSMark Murray		true
132b528cefcSMark Murray	fi
133b528cefcSMark Murray
134b528cefcSMark Murray# If destination is a directory, append the input filename; if your system
135b528cefcSMark Murray# does not like double slashes in filenames, you may need to add some logic
136b528cefcSMark Murray
137b528cefcSMark Murray	if [ -d $dst ]
138b528cefcSMark Murray	then
139b528cefcSMark Murray		dst="$dst"/`basename $src`
140b528cefcSMark Murray	else
141b528cefcSMark Murray		true
142b528cefcSMark Murray	fi
143b528cefcSMark Murrayfi
144b528cefcSMark Murray
145b528cefcSMark Murray## this sed command emulates the dirname command
146b528cefcSMark Murraydstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
147b528cefcSMark Murray
148b528cefcSMark Murray# Make sure that the destination directory exists.
149b528cefcSMark Murray#  this part is taken from Noah Friedman's mkinstalldirs script
150b528cefcSMark Murray
151b528cefcSMark Murray# Skip lots of stat calls in the usual case.
152b528cefcSMark Murrayif [ ! -d "$dstdir" ]; then
153b528cefcSMark MurraydefaultIFS='
154b528cefcSMark Murray'
155b528cefcSMark MurrayIFS="${IFS-${defaultIFS}}"
156b528cefcSMark Murray
157b528cefcSMark MurrayoIFS="${IFS}"
158b528cefcSMark Murray# Some sh's can't handle IFS=/ for some reason.
159b528cefcSMark MurrayIFS='%'
160b528cefcSMark Murrayset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
161b528cefcSMark MurrayIFS="${oIFS}"
162b528cefcSMark Murray
163b528cefcSMark Murraypathcomp=''
164b528cefcSMark Murray
165b528cefcSMark Murraywhile [ $# -ne 0 ] ; do
166b528cefcSMark Murray	pathcomp="${pathcomp}${1}"
167b528cefcSMark Murray	shift
168b528cefcSMark Murray
169b528cefcSMark Murray	if [ ! -d "${pathcomp}" ] ;
170b528cefcSMark Murray        then
171b528cefcSMark Murray		$mkdirprog "${pathcomp}"
172b528cefcSMark Murray	else
173b528cefcSMark Murray		true
174b528cefcSMark Murray	fi
175b528cefcSMark Murray
176b528cefcSMark Murray	pathcomp="${pathcomp}/"
177b528cefcSMark Murraydone
178b528cefcSMark Murrayfi
179b528cefcSMark Murray
180b528cefcSMark Murrayif [ x"$dir_arg" != x ]
181b528cefcSMark Murraythen
182b528cefcSMark Murray	$doit $instcmd $dst &&
183b528cefcSMark Murray
184b528cefcSMark Murray	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
185b528cefcSMark Murray	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
186b528cefcSMark Murray	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
187b528cefcSMark Murray	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
188b528cefcSMark Murrayelse
189b528cefcSMark Murray
190b528cefcSMark Murray# If we're going to rename the final executable, determine the name now.
191b528cefcSMark Murray
192b528cefcSMark Murray	if [ x"$transformarg" = x ]
193b528cefcSMark Murray	then
194b528cefcSMark Murray		dstfile=`basename $dst`
195b528cefcSMark Murray	else
196b528cefcSMark Murray		dstfile=`basename $dst $transformbasename |
197b528cefcSMark Murray			sed $transformarg`$transformbasename
198b528cefcSMark Murray	fi
199b528cefcSMark Murray
200b528cefcSMark Murray# don't allow the sed command to completely eliminate the filename
201b528cefcSMark Murray
202b528cefcSMark Murray	if [ x"$dstfile" = x ]
203b528cefcSMark Murray	then
204b528cefcSMark Murray		dstfile=`basename $dst`
205b528cefcSMark Murray	else
206b528cefcSMark Murray		true
207b528cefcSMark Murray	fi
208b528cefcSMark Murray
209b528cefcSMark Murray# Make a temp file name in the proper directory.
210b528cefcSMark Murray
211b528cefcSMark Murray	dsttmp=$dstdir/#inst.$$#
212b528cefcSMark Murray
213b528cefcSMark Murray# Move or copy the file name to the temp name
214b528cefcSMark Murray
215b528cefcSMark Murray	$doit $instcmd $src $dsttmp &&
216b528cefcSMark Murray
217b528cefcSMark Murray	trap "rm -f ${dsttmp}" 0 &&
218b528cefcSMark Murray
219b528cefcSMark Murray# and set any options; do chmod last to preserve setuid bits
220b528cefcSMark Murray
221b528cefcSMark Murray# If any of these fail, we abort the whole thing.  If we want to
222b528cefcSMark Murray# ignore errors from any of these, just make sure not to ignore
223b528cefcSMark Murray# errors from the above "$doit $instcmd $src $dsttmp" command.
224b528cefcSMark Murray
225b528cefcSMark Murray	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
226b528cefcSMark Murray	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
227b528cefcSMark Murray	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
228b528cefcSMark Murray	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
229b528cefcSMark Murray
230b528cefcSMark Murray# Now rename the file to the real destination.
231b528cefcSMark Murray
232b528cefcSMark Murray	$doit $rmcmd -f $dstdir/$dstfile &&
233b528cefcSMark Murray	$doit $mvcmd $dsttmp $dstdir/$dstfile
234b528cefcSMark Murray
235b528cefcSMark Murrayfi &&
236b528cefcSMark Murray
237b528cefcSMark Murray
238b528cefcSMark Murrayexit 0
239