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