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