xref: /freebsd/contrib/tcpdump/install-sh (revision 4edb46e9a85ca35d3bed523171d11a748861ce82)
14edb46e9SPaul Traina#! /bin/sh
24edb46e9SPaul Traina#
34edb46e9SPaul Traina# install - install a program, script, or datafile
44edb46e9SPaul Traina# This comes from X11R5.
54edb46e9SPaul Traina#
64edb46e9SPaul Traina# Calling this script install-sh is preferred over install.sh, to prevent
74edb46e9SPaul Traina# `make' implicit rules from creating a file called install from it
84edb46e9SPaul Traina# when there is no Makefile.
94edb46e9SPaul Traina#
104edb46e9SPaul Traina# This script is compatible with the BSD install script, but was written
114edb46e9SPaul Traina# from scratch.
124edb46e9SPaul Traina#
134edb46e9SPaul Traina
144edb46e9SPaul Traina
154edb46e9SPaul Traina# set DOITPROG to echo to test this script
164edb46e9SPaul Traina
174edb46e9SPaul Traina# Don't use :- since 4.3BSD and earlier shells don't like it.
184edb46e9SPaul Trainadoit="${DOITPROG-}"
194edb46e9SPaul Traina
204edb46e9SPaul Traina
214edb46e9SPaul Traina# put in absolute paths if you don't have them in your path; or use env. vars.
224edb46e9SPaul Traina
234edb46e9SPaul Trainamvprog="${MVPROG-mv}"
244edb46e9SPaul Trainacpprog="${CPPROG-cp}"
254edb46e9SPaul Trainachmodprog="${CHMODPROG-chmod}"
264edb46e9SPaul Trainachownprog="${CHOWNPROG-chown}"
274edb46e9SPaul Trainachgrpprog="${CHGRPPROG-chgrp}"
284edb46e9SPaul Trainastripprog="${STRIPPROG-strip}"
294edb46e9SPaul Trainarmprog="${RMPROG-rm}"
304edb46e9SPaul Trainamkdirprog="${MKDIRPROG-mkdir}"
314edb46e9SPaul Traina
324edb46e9SPaul Trainatransformbasename=""
334edb46e9SPaul Trainatransform_arg=""
344edb46e9SPaul Trainainstcmd="$mvprog"
354edb46e9SPaul Trainachmodcmd="$chmodprog 0755"
364edb46e9SPaul Trainachowncmd=""
374edb46e9SPaul Trainachgrpcmd=""
384edb46e9SPaul Trainastripcmd=""
394edb46e9SPaul Trainarmcmd="$rmprog -f"
404edb46e9SPaul Trainamvcmd="$mvprog"
414edb46e9SPaul Trainasrc=""
424edb46e9SPaul Trainadst=""
434edb46e9SPaul Trainadir_arg=""
444edb46e9SPaul Traina
454edb46e9SPaul Trainawhile [ x"$1" != x ]; do
464edb46e9SPaul Traina    case $1 in
474edb46e9SPaul Traina	-c) instcmd="$cpprog"
484edb46e9SPaul Traina	    shift
494edb46e9SPaul Traina	    continue;;
504edb46e9SPaul Traina
514edb46e9SPaul Traina	-d) dir_arg=true
524edb46e9SPaul Traina	    shift
534edb46e9SPaul Traina	    continue;;
544edb46e9SPaul Traina
554edb46e9SPaul Traina	-m) chmodcmd="$chmodprog $2"
564edb46e9SPaul Traina	    shift
574edb46e9SPaul Traina	    shift
584edb46e9SPaul Traina	    continue;;
594edb46e9SPaul Traina
604edb46e9SPaul Traina	-o) chowncmd="$chownprog $2"
614edb46e9SPaul Traina	    shift
624edb46e9SPaul Traina	    shift
634edb46e9SPaul Traina	    continue;;
644edb46e9SPaul Traina
654edb46e9SPaul Traina	-g) chgrpcmd="$chgrpprog $2"
664edb46e9SPaul Traina	    shift
674edb46e9SPaul Traina	    shift
684edb46e9SPaul Traina	    continue;;
694edb46e9SPaul Traina
704edb46e9SPaul Traina	-s) stripcmd="$stripprog"
714edb46e9SPaul Traina	    shift
724edb46e9SPaul Traina	    continue;;
734edb46e9SPaul Traina
744edb46e9SPaul Traina	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
754edb46e9SPaul Traina	    shift
764edb46e9SPaul Traina	    continue;;
774edb46e9SPaul Traina
784edb46e9SPaul Traina	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
794edb46e9SPaul Traina	    shift
804edb46e9SPaul Traina	    continue;;
814edb46e9SPaul Traina
824edb46e9SPaul Traina	*)  if [ x"$src" = x ]
834edb46e9SPaul Traina	    then
844edb46e9SPaul Traina		src=$1
854edb46e9SPaul Traina	    else
864edb46e9SPaul Traina		# this colon is to work around a 386BSD /bin/sh bug
874edb46e9SPaul Traina		:
884edb46e9SPaul Traina		dst=$1
894edb46e9SPaul Traina	    fi
904edb46e9SPaul Traina	    shift
914edb46e9SPaul Traina	    continue;;
924edb46e9SPaul Traina    esac
934edb46e9SPaul Trainadone
944edb46e9SPaul Traina
954edb46e9SPaul Trainaif [ x"$src" = x ]
964edb46e9SPaul Trainathen
974edb46e9SPaul Traina	echo "install:	no input file specified"
984edb46e9SPaul Traina	exit 1
994edb46e9SPaul Trainaelse
1004edb46e9SPaul Traina	true
1014edb46e9SPaul Trainafi
1024edb46e9SPaul Traina
1034edb46e9SPaul Trainaif [ x"$dir_arg" != x ]; then
1044edb46e9SPaul Traina	dst=$src
1054edb46e9SPaul Traina	src=""
1064edb46e9SPaul Traina
1074edb46e9SPaul Traina	if [ -d $dst ]; then
1084edb46e9SPaul Traina		instcmd=:
1094edb46e9SPaul Traina	else
1104edb46e9SPaul Traina		instcmd=mkdir
1114edb46e9SPaul Traina	fi
1124edb46e9SPaul Trainaelse
1134edb46e9SPaul Traina
1144edb46e9SPaul Traina# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
1154edb46e9SPaul Traina# might cause directories to be created, which would be especially bad
1164edb46e9SPaul Traina# if $src (and thus $dsttmp) contains '*'.
1174edb46e9SPaul Traina
1184edb46e9SPaul Traina	if [ -f $src -o -d $src ]
1194edb46e9SPaul Traina	then
1204edb46e9SPaul Traina		true
1214edb46e9SPaul Traina	else
1224edb46e9SPaul Traina		echo "install:  $src does not exist"
1234edb46e9SPaul Traina		exit 1
1244edb46e9SPaul Traina	fi
1254edb46e9SPaul Traina
1264edb46e9SPaul Traina	if [ x"$dst" = x ]
1274edb46e9SPaul Traina	then
1284edb46e9SPaul Traina		echo "install:	no destination specified"
1294edb46e9SPaul Traina		exit 1
1304edb46e9SPaul Traina	else
1314edb46e9SPaul Traina		true
1324edb46e9SPaul Traina	fi
1334edb46e9SPaul Traina
1344edb46e9SPaul Traina# If destination is a directory, append the input filename; if your system
1354edb46e9SPaul Traina# does not like double slashes in filenames, you may need to add some logic
1364edb46e9SPaul Traina
1374edb46e9SPaul Traina	if [ -d $dst ]
1384edb46e9SPaul Traina	then
1394edb46e9SPaul Traina		dst="$dst"/`basename $src`
1404edb46e9SPaul Traina	else
1414edb46e9SPaul Traina		true
1424edb46e9SPaul Traina	fi
1434edb46e9SPaul Trainafi
1444edb46e9SPaul Traina
1454edb46e9SPaul Traina## this sed command emulates the dirname command
1464edb46e9SPaul Trainadstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
1474edb46e9SPaul Traina
1484edb46e9SPaul Traina# Make sure that the destination directory exists.
1494edb46e9SPaul Traina#  this part is taken from Noah Friedman's mkinstalldirs script
1504edb46e9SPaul Traina
1514edb46e9SPaul Traina# Skip lots of stat calls in the usual case.
1524edb46e9SPaul Trainaif [ ! -d "$dstdir" ]; then
1534edb46e9SPaul TrainadefaultIFS='
1544edb46e9SPaul Traina'
1554edb46e9SPaul TrainaIFS="${IFS-${defaultIFS}}"
1564edb46e9SPaul Traina
1574edb46e9SPaul TrainaoIFS="${IFS}"
1584edb46e9SPaul Traina# Some sh's can't handle IFS=/ for some reason.
1594edb46e9SPaul TrainaIFS='%'
1604edb46e9SPaul Trainaset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
1614edb46e9SPaul TrainaIFS="${oIFS}"
1624edb46e9SPaul Traina
1634edb46e9SPaul Trainapathcomp=''
1644edb46e9SPaul Traina
1654edb46e9SPaul Trainawhile [ $# -ne 0 ] ; do
1664edb46e9SPaul Traina	pathcomp="${pathcomp}${1}"
1674edb46e9SPaul Traina	shift
1684edb46e9SPaul Traina
1694edb46e9SPaul Traina	if [ ! -d "${pathcomp}" ] ;
1704edb46e9SPaul Traina        then
1714edb46e9SPaul Traina		$mkdirprog "${pathcomp}"
1724edb46e9SPaul Traina	else
1734edb46e9SPaul Traina		true
1744edb46e9SPaul Traina	fi
1754edb46e9SPaul Traina
1764edb46e9SPaul Traina	pathcomp="${pathcomp}/"
1774edb46e9SPaul Trainadone
1784edb46e9SPaul Trainafi
1794edb46e9SPaul Traina
1804edb46e9SPaul Trainaif [ x"$dir_arg" != x ]
1814edb46e9SPaul Trainathen
1824edb46e9SPaul Traina	$doit $instcmd $dst &&
1834edb46e9SPaul Traina
1844edb46e9SPaul Traina	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
1854edb46e9SPaul Traina	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
1864edb46e9SPaul Traina	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
1874edb46e9SPaul Traina	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
1884edb46e9SPaul Trainaelse
1894edb46e9SPaul Traina
1904edb46e9SPaul Traina# If we're going to rename the final executable, determine the name now.
1914edb46e9SPaul Traina
1924edb46e9SPaul Traina	if [ x"$transformarg" = x ]
1934edb46e9SPaul Traina	then
1944edb46e9SPaul Traina		dstfile=`basename $dst`
1954edb46e9SPaul Traina	else
1964edb46e9SPaul Traina		dstfile=`basename $dst $transformbasename |
1974edb46e9SPaul Traina			sed $transformarg`$transformbasename
1984edb46e9SPaul Traina	fi
1994edb46e9SPaul Traina
2004edb46e9SPaul Traina# don't allow the sed command to completely eliminate the filename
2014edb46e9SPaul Traina
2024edb46e9SPaul Traina	if [ x"$dstfile" = x ]
2034edb46e9SPaul Traina	then
2044edb46e9SPaul Traina		dstfile=`basename $dst`
2054edb46e9SPaul Traina	else
2064edb46e9SPaul Traina		true
2074edb46e9SPaul Traina	fi
2084edb46e9SPaul Traina
2094edb46e9SPaul Traina# Make a temp file name in the proper directory.
2104edb46e9SPaul Traina
2114edb46e9SPaul Traina	dsttmp=$dstdir/#inst.$$#
2124edb46e9SPaul Traina
2134edb46e9SPaul Traina# Move or copy the file name to the temp name
2144edb46e9SPaul Traina
2154edb46e9SPaul Traina	$doit $instcmd $src $dsttmp &&
2164edb46e9SPaul Traina
2174edb46e9SPaul Traina	trap "rm -f ${dsttmp}" 0 &&
2184edb46e9SPaul Traina
2194edb46e9SPaul Traina# and set any options; do chmod last to preserve setuid bits
2204edb46e9SPaul Traina
2214edb46e9SPaul Traina# If any of these fail, we abort the whole thing.  If we want to
2224edb46e9SPaul Traina# ignore errors from any of these, just make sure not to ignore
2234edb46e9SPaul Traina# errors from the above "$doit $instcmd $src $dsttmp" command.
2244edb46e9SPaul Traina
2254edb46e9SPaul Traina	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
2264edb46e9SPaul Traina	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
2274edb46e9SPaul Traina	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
2284edb46e9SPaul Traina	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
2294edb46e9SPaul Traina
2304edb46e9SPaul Traina# Now rename the file to the real destination.
2314edb46e9SPaul Traina
2324edb46e9SPaul Traina	$doit $rmcmd -f $dstdir/$dstfile &&
2334edb46e9SPaul Traina	$doit $mvcmd $dsttmp $dstdir/$dstfile
2344edb46e9SPaul Traina
2354edb46e9SPaul Trainafi &&
2364edb46e9SPaul Traina
2374edb46e9SPaul Traina
2384edb46e9SPaul Trainaexit 0
239