xref: /freebsd/crypto/heimdal/lib/roken/install-sh (revision 5e9cd1ae3e10592ed70e7575551cba1bbab04d84)
15e9cd1aeSAssar Westerlund#!/bin/sh
25e9cd1aeSAssar Westerlund#
35e9cd1aeSAssar Westerlund# install - install a program, script, or datafile
45e9cd1aeSAssar Westerlund# This comes from X11R5 (mit/util/scripts/install.sh).
55e9cd1aeSAssar Westerlund#
65e9cd1aeSAssar Westerlund# Copyright 1991 by the Massachusetts Institute of Technology
75e9cd1aeSAssar Westerlund#
85e9cd1aeSAssar Westerlund# Permission to use, copy, modify, distribute, and sell this software and its
95e9cd1aeSAssar Westerlund# documentation for any purpose is hereby granted without fee, provided that
105e9cd1aeSAssar Westerlund# the above copyright notice appear in all copies and that both that
115e9cd1aeSAssar Westerlund# copyright notice and this permission notice appear in supporting
125e9cd1aeSAssar Westerlund# documentation, and that the name of M.I.T. not be used in advertising or
135e9cd1aeSAssar Westerlund# publicity pertaining to distribution of the software without specific,
145e9cd1aeSAssar Westerlund# written prior permission.  M.I.T. makes no representations about the
155e9cd1aeSAssar Westerlund# suitability of this software for any purpose.  It is provided "as is"
165e9cd1aeSAssar Westerlund# without express or implied warranty.
175e9cd1aeSAssar Westerlund#
185e9cd1aeSAssar Westerlund# Calling this script install-sh is preferred over install.sh, to prevent
195e9cd1aeSAssar Westerlund# `make' implicit rules from creating a file called install from it
205e9cd1aeSAssar Westerlund# when there is no Makefile.
215e9cd1aeSAssar Westerlund#
225e9cd1aeSAssar Westerlund# This script is compatible with the BSD install script, but was written
235e9cd1aeSAssar Westerlund# from scratch.  It can only install one file at a time, a restriction
245e9cd1aeSAssar Westerlund# shared with many OS's install programs.
255e9cd1aeSAssar Westerlund
265e9cd1aeSAssar Westerlund
275e9cd1aeSAssar Westerlund# set DOITPROG to echo to test this script
285e9cd1aeSAssar Westerlund
295e9cd1aeSAssar Westerlund# Don't use :- since 4.3BSD and earlier shells don't like it.
305e9cd1aeSAssar Westerlunddoit="${DOITPROG-}"
315e9cd1aeSAssar Westerlund
325e9cd1aeSAssar Westerlund
335e9cd1aeSAssar Westerlund# put in absolute paths if you don't have them in your path; or use env. vars.
345e9cd1aeSAssar Westerlund
355e9cd1aeSAssar Westerlundmvprog="${MVPROG-mv}"
365e9cd1aeSAssar Westerlundcpprog="${CPPROG-cp}"
375e9cd1aeSAssar Westerlundchmodprog="${CHMODPROG-chmod}"
385e9cd1aeSAssar Westerlundchownprog="${CHOWNPROG-chown}"
395e9cd1aeSAssar Westerlundchgrpprog="${CHGRPPROG-chgrp}"
405e9cd1aeSAssar Westerlundstripprog="${STRIPPROG-strip}"
415e9cd1aeSAssar Westerlundrmprog="${RMPROG-rm}"
425e9cd1aeSAssar Westerlundmkdirprog="${MKDIRPROG-mkdir}"
435e9cd1aeSAssar Westerlund
445e9cd1aeSAssar Westerlundtransformbasename=""
455e9cd1aeSAssar Westerlundtransform_arg=""
465e9cd1aeSAssar Westerlundinstcmd="$mvprog"
475e9cd1aeSAssar Westerlundchmodcmd="$chmodprog 0755"
485e9cd1aeSAssar Westerlundchowncmd=""
495e9cd1aeSAssar Westerlundchgrpcmd=""
505e9cd1aeSAssar Westerlundstripcmd=""
515e9cd1aeSAssar Westerlundrmcmd="$rmprog -f"
525e9cd1aeSAssar Westerlundmvcmd="$mvprog"
535e9cd1aeSAssar Westerlundsrc=""
545e9cd1aeSAssar Westerlunddst=""
555e9cd1aeSAssar Westerlunddir_arg=""
565e9cd1aeSAssar Westerlund
575e9cd1aeSAssar Westerlundwhile [ x"$1" != x ]; do
585e9cd1aeSAssar Westerlund    case $1 in
595e9cd1aeSAssar Westerlund	-c) instcmd="$cpprog"
605e9cd1aeSAssar Westerlund	    shift
615e9cd1aeSAssar Westerlund	    continue;;
625e9cd1aeSAssar Westerlund
635e9cd1aeSAssar Westerlund	-d) dir_arg=true
645e9cd1aeSAssar Westerlund	    shift
655e9cd1aeSAssar Westerlund	    continue;;
665e9cd1aeSAssar Westerlund
675e9cd1aeSAssar Westerlund	-m) chmodcmd="$chmodprog $2"
685e9cd1aeSAssar Westerlund	    shift
695e9cd1aeSAssar Westerlund	    shift
705e9cd1aeSAssar Westerlund	    continue;;
715e9cd1aeSAssar Westerlund
725e9cd1aeSAssar Westerlund	-o) chowncmd="$chownprog $2"
735e9cd1aeSAssar Westerlund	    shift
745e9cd1aeSAssar Westerlund	    shift
755e9cd1aeSAssar Westerlund	    continue;;
765e9cd1aeSAssar Westerlund
775e9cd1aeSAssar Westerlund	-g) chgrpcmd="$chgrpprog $2"
785e9cd1aeSAssar Westerlund	    shift
795e9cd1aeSAssar Westerlund	    shift
805e9cd1aeSAssar Westerlund	    continue;;
815e9cd1aeSAssar Westerlund
825e9cd1aeSAssar Westerlund	-s) stripcmd="$stripprog"
835e9cd1aeSAssar Westerlund	    shift
845e9cd1aeSAssar Westerlund	    continue;;
855e9cd1aeSAssar Westerlund
865e9cd1aeSAssar Westerlund	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
875e9cd1aeSAssar Westerlund	    shift
885e9cd1aeSAssar Westerlund	    continue;;
895e9cd1aeSAssar Westerlund
905e9cd1aeSAssar Westerlund	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
915e9cd1aeSAssar Westerlund	    shift
925e9cd1aeSAssar Westerlund	    continue;;
935e9cd1aeSAssar Westerlund
945e9cd1aeSAssar Westerlund	*)  if [ x"$src" = x ]
955e9cd1aeSAssar Westerlund	    then
965e9cd1aeSAssar Westerlund		src=$1
975e9cd1aeSAssar Westerlund	    else
985e9cd1aeSAssar Westerlund		# this colon is to work around a 386BSD /bin/sh bug
995e9cd1aeSAssar Westerlund		:
1005e9cd1aeSAssar Westerlund		dst=$1
1015e9cd1aeSAssar Westerlund	    fi
1025e9cd1aeSAssar Westerlund	    shift
1035e9cd1aeSAssar Westerlund	    continue;;
1045e9cd1aeSAssar Westerlund    esac
1055e9cd1aeSAssar Westerlunddone
1065e9cd1aeSAssar Westerlund
1075e9cd1aeSAssar Westerlundif [ x"$src" = x ]
1085e9cd1aeSAssar Westerlundthen
1095e9cd1aeSAssar Westerlund	echo "install:	no input file specified"
1105e9cd1aeSAssar Westerlund	exit 1
1115e9cd1aeSAssar Westerlundelse
1125e9cd1aeSAssar Westerlund	true
1135e9cd1aeSAssar Westerlundfi
1145e9cd1aeSAssar Westerlund
1155e9cd1aeSAssar Westerlundif [ x"$dir_arg" != x ]; then
1165e9cd1aeSAssar Westerlund	dst=$src
1175e9cd1aeSAssar Westerlund	src=""
1185e9cd1aeSAssar Westerlund
1195e9cd1aeSAssar Westerlund	if [ -d $dst ]; then
1205e9cd1aeSAssar Westerlund		instcmd=:
1215e9cd1aeSAssar Westerlund		chmodcmd=""
1225e9cd1aeSAssar Westerlund	else
1235e9cd1aeSAssar Westerlund		instcmd=mkdir
1245e9cd1aeSAssar Westerlund	fi
1255e9cd1aeSAssar Westerlundelse
1265e9cd1aeSAssar Westerlund
1275e9cd1aeSAssar Westerlund# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
1285e9cd1aeSAssar Westerlund# might cause directories to be created, which would be especially bad
1295e9cd1aeSAssar Westerlund# if $src (and thus $dsttmp) contains '*'.
1305e9cd1aeSAssar Westerlund
1315e9cd1aeSAssar Westerlund	if [ -f $src -o -d $src ]
1325e9cd1aeSAssar Westerlund	then
1335e9cd1aeSAssar Westerlund		true
1345e9cd1aeSAssar Westerlund	else
1355e9cd1aeSAssar Westerlund		echo "install:  $src does not exist"
1365e9cd1aeSAssar Westerlund		exit 1
1375e9cd1aeSAssar Westerlund	fi
1385e9cd1aeSAssar Westerlund
1395e9cd1aeSAssar Westerlund	if [ x"$dst" = x ]
1405e9cd1aeSAssar Westerlund	then
1415e9cd1aeSAssar Westerlund		echo "install:	no destination specified"
1425e9cd1aeSAssar Westerlund		exit 1
1435e9cd1aeSAssar Westerlund	else
1445e9cd1aeSAssar Westerlund		true
1455e9cd1aeSAssar Westerlund	fi
1465e9cd1aeSAssar Westerlund
1475e9cd1aeSAssar Westerlund# If destination is a directory, append the input filename; if your system
1485e9cd1aeSAssar Westerlund# does not like double slashes in filenames, you may need to add some logic
1495e9cd1aeSAssar Westerlund
1505e9cd1aeSAssar Westerlund	if [ -d $dst ]
1515e9cd1aeSAssar Westerlund	then
1525e9cd1aeSAssar Westerlund		dst="$dst"/`basename $src`
1535e9cd1aeSAssar Westerlund	else
1545e9cd1aeSAssar Westerlund		true
1555e9cd1aeSAssar Westerlund	fi
1565e9cd1aeSAssar Westerlundfi
1575e9cd1aeSAssar Westerlund
1585e9cd1aeSAssar Westerlund## this sed command emulates the dirname command
1595e9cd1aeSAssar Westerlunddstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
1605e9cd1aeSAssar Westerlund
1615e9cd1aeSAssar Westerlund# Make sure that the destination directory exists.
1625e9cd1aeSAssar Westerlund#  this part is taken from Noah Friedman's mkinstalldirs script
1635e9cd1aeSAssar Westerlund
1645e9cd1aeSAssar Westerlund# Skip lots of stat calls in the usual case.
1655e9cd1aeSAssar Westerlundif [ ! -d "$dstdir" ]; then
1665e9cd1aeSAssar WesterlunddefaultIFS='
1675e9cd1aeSAssar Westerlund'
1685e9cd1aeSAssar WesterlundIFS="${IFS-${defaultIFS}}"
1695e9cd1aeSAssar Westerlund
1705e9cd1aeSAssar WesterlundoIFS="${IFS}"
1715e9cd1aeSAssar Westerlund# Some sh's can't handle IFS=/ for some reason.
1725e9cd1aeSAssar WesterlundIFS='%'
1735e9cd1aeSAssar Westerlundset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
1745e9cd1aeSAssar WesterlundIFS="${oIFS}"
1755e9cd1aeSAssar Westerlund
1765e9cd1aeSAssar Westerlundpathcomp=''
1775e9cd1aeSAssar Westerlund
1785e9cd1aeSAssar Westerlundwhile [ $# -ne 0 ] ; do
1795e9cd1aeSAssar Westerlund	pathcomp="${pathcomp}${1}"
1805e9cd1aeSAssar Westerlund	shift
1815e9cd1aeSAssar Westerlund
1825e9cd1aeSAssar Westerlund	if [ ! -d "${pathcomp}" ] ;
1835e9cd1aeSAssar Westerlund        then
1845e9cd1aeSAssar Westerlund		$mkdirprog "${pathcomp}"
1855e9cd1aeSAssar Westerlund	else
1865e9cd1aeSAssar Westerlund		true
1875e9cd1aeSAssar Westerlund	fi
1885e9cd1aeSAssar Westerlund
1895e9cd1aeSAssar Westerlund	pathcomp="${pathcomp}/"
1905e9cd1aeSAssar Westerlunddone
1915e9cd1aeSAssar Westerlundfi
1925e9cd1aeSAssar Westerlund
1935e9cd1aeSAssar Westerlundif [ x"$dir_arg" != x ]
1945e9cd1aeSAssar Westerlundthen
1955e9cd1aeSAssar Westerlund	$doit $instcmd $dst &&
1965e9cd1aeSAssar Westerlund
1975e9cd1aeSAssar Westerlund	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
1985e9cd1aeSAssar Westerlund	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
1995e9cd1aeSAssar Westerlund	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
2005e9cd1aeSAssar Westerlund	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
2015e9cd1aeSAssar Westerlundelse
2025e9cd1aeSAssar Westerlund
2035e9cd1aeSAssar Westerlund# If we're going to rename the final executable, determine the name now.
2045e9cd1aeSAssar Westerlund
2055e9cd1aeSAssar Westerlund	if [ x"$transformarg" = x ]
2065e9cd1aeSAssar Westerlund	then
2075e9cd1aeSAssar Westerlund		dstfile=`basename $dst`
2085e9cd1aeSAssar Westerlund	else
2095e9cd1aeSAssar Westerlund		dstfile=`basename $dst $transformbasename |
2105e9cd1aeSAssar Westerlund			sed $transformarg`$transformbasename
2115e9cd1aeSAssar Westerlund	fi
2125e9cd1aeSAssar Westerlund
2135e9cd1aeSAssar Westerlund# don't allow the sed command to completely eliminate the filename
2145e9cd1aeSAssar Westerlund
2155e9cd1aeSAssar Westerlund	if [ x"$dstfile" = x ]
2165e9cd1aeSAssar Westerlund	then
2175e9cd1aeSAssar Westerlund		dstfile=`basename $dst`
2185e9cd1aeSAssar Westerlund	else
2195e9cd1aeSAssar Westerlund		true
2205e9cd1aeSAssar Westerlund	fi
2215e9cd1aeSAssar Westerlund
2225e9cd1aeSAssar Westerlund# Make a temp file name in the proper directory.
2235e9cd1aeSAssar Westerlund
2245e9cd1aeSAssar Westerlund	dsttmp=$dstdir/#inst.$$#
2255e9cd1aeSAssar Westerlund
2265e9cd1aeSAssar Westerlund# Move or copy the file name to the temp name
2275e9cd1aeSAssar Westerlund
2285e9cd1aeSAssar Westerlund	$doit $instcmd $src $dsttmp &&
2295e9cd1aeSAssar Westerlund
2305e9cd1aeSAssar Westerlund	trap "rm -f ${dsttmp}" 0 &&
2315e9cd1aeSAssar Westerlund
2325e9cd1aeSAssar Westerlund# and set any options; do chmod last to preserve setuid bits
2335e9cd1aeSAssar Westerlund
2345e9cd1aeSAssar Westerlund# If any of these fail, we abort the whole thing.  If we want to
2355e9cd1aeSAssar Westerlund# ignore errors from any of these, just make sure not to ignore
2365e9cd1aeSAssar Westerlund# errors from the above "$doit $instcmd $src $dsttmp" command.
2375e9cd1aeSAssar Westerlund
2385e9cd1aeSAssar Westerlund	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
2395e9cd1aeSAssar Westerlund	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
2405e9cd1aeSAssar Westerlund	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
2415e9cd1aeSAssar Westerlund	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
2425e9cd1aeSAssar Westerlund
2435e9cd1aeSAssar Westerlund# Now rename the file to the real destination.
2445e9cd1aeSAssar Westerlund
2455e9cd1aeSAssar Westerlund	$doit $rmcmd -f $dstdir/$dstfile &&
2465e9cd1aeSAssar Westerlund	$doit $mvcmd $dsttmp $dstdir/$dstfile
2475e9cd1aeSAssar Westerlund
2485e9cd1aeSAssar Westerlundfi &&
2495e9cd1aeSAssar Westerlund
2505e9cd1aeSAssar Westerlund
2515e9cd1aeSAssar Westerlundexit 0
252