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