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