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