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