install-sh revision 1b8adde7ba7d5e04395c141c5400dc2cffd7d809
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich#!/bin/sh
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# install - install a program, script, or datafile
e6d40133bc9f858308654afb1262b8b483ec5922Till Mossakowski
d5fe06af711a6912ae028ebf873eada4ee8733f8Christian Maederscriptversion=2004-12-17.09
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# This originates from X11R5 (mit/util/scripts/install.sh), which was
34bff097c14521b5e57ce37279a34256e1f78aa5Klaus Luettich# later released in X11R6 (xc/config/util/install.sh) with the
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# following copyright and license.
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maeder#
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# Copyright (C) 1994 X Consortium
e6d40133bc9f858308654afb1262b8b483ec5922Till Mossakowski#
d543cf2bb0c810781625c76fe135476d46270d88Till Mossakowski# Permission is hereby granted, free of charge, to any person obtaining a copy
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maeder# of this software and associated documentation files (the "Software"), to
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# deal in the Software without restriction, including without limitation the
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# sell copies of the Software, and to permit persons to whom the Software is
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# furnished to do so, subject to the following conditions:
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich#
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder# The above copyright notice and this permission notice shall be included in
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder# all copies or substantial portions of the Software.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich#
8b66de47c89e252c907c8ed3a5ccd16dbccbfb3eChristian Maeder# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
e51568cd733ccb83a799f48f0802095e3f3a8d62Christian Maeder# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich#
87ab788adadc73fd49e3c762caee6a88f844a5bcChristian Maeder# Except as contained in this notice, the name of the X Consortium shall not
87ab788adadc73fd49e3c762caee6a88f844a5bcChristian Maeder# be used in advertising or otherwise to promote the sale, use or other deal-
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# ings in this Software without prior written authorization from the X Consor-
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# tium.
87ab788adadc73fd49e3c762caee6a88f844a5bcChristian Maeder#
87ab788adadc73fd49e3c762caee6a88f844a5bcChristian Maeder#
0a943b3aa43eff8a8d5f42da56fa895e13c7040cKlaus Luettich# FSF changes to this file are in the public domain.
0a943b3aa43eff8a8d5f42da56fa895e13c7040cKlaus Luettich#
0a943b3aa43eff8a8d5f42da56fa895e13c7040cKlaus Luettich# Calling this script install-sh is preferred over install.sh, to prevent
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# `make' implicit rules from creating a file called install from it
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# when there is no Makefile.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich#
87ab788adadc73fd49e3c762caee6a88f844a5bcChristian Maeder# This script is compatible with the BSD install script, but was written
e51568cd733ccb83a799f48f0802095e3f3a8d62Christian Maeder# from scratch. It can only install one file at a time, a restriction
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich# shared with many OS's install programs.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
0a943b3aa43eff8a8d5f42da56fa895e13c7040cKlaus Luettich# set DOITPROG to echo to test this script
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maeder
8b66de47c89e252c907c8ed3a5ccd16dbccbfb3eChristian Maeder# Don't use :- since 4.3BSD and earlier shells don't like it.
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maederdoit="${DOITPROG-}"
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maeder
427aeade34f2771c0295250e9a94b89489bb9204Christian Maeder# put in absolute paths if you don't have them in your path; or use env. vars.
427aeade34f2771c0295250e9a94b89489bb9204Christian Maeder
427aeade34f2771c0295250e9a94b89489bb9204Christian Maedermvprog="${MVPROG-mv}"
427aeade34f2771c0295250e9a94b89489bb9204Christian Maedercpprog="${CPPROG-cp}"
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maederchmodprog="${CHMODPROG-chmod}"
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maederchownprog="${CHOWNPROG-chown}"
427aeade34f2771c0295250e9a94b89489bb9204Christian Maederchgrpprog="${CHGRPPROG-chgrp}"
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maederstripprog="${STRIPPROG-strip}"
427aeade34f2771c0295250e9a94b89489bb9204Christian Maederrmprog="${RMPROG-rm}"
427aeade34f2771c0295250e9a94b89489bb9204Christian Maedermkdirprog="${MKDIRPROG-mkdir}"
427aeade34f2771c0295250e9a94b89489bb9204Christian Maeder
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maederchmodcmd="$chmodprog 0755"
427aeade34f2771c0295250e9a94b89489bb9204Christian Maederchowncmd=
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettichchgrpcmd=
a129422b14eea673dc481d2553cec108e35e72efChristian Maederstripcmd=
a129422b14eea673dc481d2553cec108e35e72efChristian Maederrmcmd="$rmprog -f"
a129422b14eea673dc481d2553cec108e35e72efChristian Maedermvcmd="$mvprog"
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettichsrc=
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettichdst=
8b66de47c89e252c907c8ed3a5ccd16dbccbfb3eChristian Maederdir_arg=
8b66de47c89e252c907c8ed3a5ccd16dbccbfb3eChristian Maederdstarg=
8b66de47c89e252c907c8ed3a5ccd16dbccbfb3eChristian Maederno_target_directory=
8b66de47c89e252c907c8ed3a5ccd16dbccbfb3eChristian Maeder
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maederusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maeder or: $0 [OPTION]... SRCFILES... DIRECTORY
433bc07a43dd58f7ca4c93b6ea5a026a2dcb114dChristian Maeder or: $0 [OPTION]... -t DIRECTORY SRCFILES...
433bc07a43dd58f7ca4c93b6ea5a026a2dcb114dChristian Maeder or: $0 [OPTION]... -d DIRECTORIES...
433bc07a43dd58f7ca4c93b6ea5a026a2dcb114dChristian Maeder
433bc07a43dd58f7ca4c93b6ea5a026a2dcb114dChristian MaederIn the 1st form, copy SRCFILE to DSTFILE.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus LuettichIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus LuettichIn the 4th, create DIRECTORIES.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus LuettichOptions:
10a655fc665d418549eefbc09baccbaaff913670Till Mossakowski-c (ignored)
10a655fc665d418549eefbc09baccbaaff913670Till Mossakowski-d create directories instead of installing files.
10a655fc665d418549eefbc09baccbaaff913670Till Mossakowski-g GROUP $chgrpprog installed files to GROUP.
10a655fc665d418549eefbc09baccbaaff913670Till Mossakowski-m MODE $chmodprog installed files to MODE.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich-o USER $chownprog installed files to USER.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich-s $stripprog installed files.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich-t DIRECTORY install into DIRECTORY.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich-T report an error if DSTFILE is a directory.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich--help display this help and exit.
c1a0a4f5712942d8ef09bfdb5b8d1e3b576ab438Christian Maeder--version display version info and exit.
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus LuettichEnvironment variables override the default commands:
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maeder CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich"
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettichwhile test -n "$1"; do
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich case $1 in
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich -c) shift
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich continue;;
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich -d) dir_arg=true
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich shift
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich continue;;
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich -g) chgrpcmd="$chgrpprog $2"
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich shift
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich shift
9753523d7bfe7c9413207e8f0c7548bd3dc15322Christian Maeder continue;;
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich --help) echo "$usage"; exit 0;;
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich -m) chmodcmd="$chmodprog $2"
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich shift
d9abda6d63cc31c8a81d9c84275c9bd4c8ae8f57Klaus Luettich shift
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder continue;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder -o) chowncmd="$chownprog $2"
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder continue;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder -s) stripcmd=$stripprog
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder continue;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder -t) dstarg=$2
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder continue;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder -T) no_target_directory=true
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder continue;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder --version) echo "$0 $scriptversion"; exit 0;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder *) # When -d is used, all remaining arguments are directories to create.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # When -t is used, the destination is already specified.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder test -n "$dir_arg$dstarg" && break
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # Otherwise, the last argument is the destination. Remove it from $@.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder for arg
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder do
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test -n "$dstarg"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # $@ is not empty: it contains at least $arg.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder set fnord "$@" "$dstarg"
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift # fnord
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder fi
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder shift # arg
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder dstarg=$arg
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder done
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder break;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder esac
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maederdone
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maederif test -z "$1"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test -z "$dir_arg"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder echo "$0: no input file specified." >&2
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder exit 1
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder fi
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # It's OK to call `install-sh -d' without argument.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # This can happen when creating conditional directories.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder exit 0
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maederfi
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maederfor src
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maederdo
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # Protect names starting with `-'.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder case $src in
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder -*) src=./$src ;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder esac
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test -n "$dir_arg"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder dst=$src
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder src=
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test -d "$dst"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder mkdircmd=:
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder chmodcmd=
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder else
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder mkdircmd=$mkdirprog
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder fi
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder else
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # might cause directories to be created, which would be especially bad
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # if $src (and thus $dsttmp) contains '*'.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test ! -f "$src" && test ! -d "$src"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder echo "$0: $src does not exist." >&2
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder exit 1
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder fi
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test -z "$dstarg"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder echo "$0: no destination specified." >&2
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder exit 1
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder fi
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder dst=$dstarg
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # Protect names starting with `-'.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder case $dst in
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder -*) dst=./$dst ;;
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder esac
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # If destination is a directory, append the input filename; won't work
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder # if double slashes aren't ignored.
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test -d "$dst"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder if test -n "$no_target_directory"; then
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder echo "$0: $dstarg: Is a directory" >&2
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder exit 1
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder fi
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder dst=$dst/`basename "$src"`
513ec62039bb1028efafff52f0e0e22d57da261eChristian Maeder fi
fi
# This sed command emulates the dirname command.
dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# Skip lots of stat calls in the usual case.
if test ! -d "$dstdir"; then
defaultIFS='
'
IFS="${IFS-$defaultIFS}"
oIFS=$IFS
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
shift
IFS=$oIFS
pathcomp=
while test $# -ne 0 ; do
pathcomp=$pathcomp$1
shift
if test ! -d "$pathcomp"; then
$mkdirprog "$pathcomp"
# mkdir can fail with a `File exist' error in case several
# install-sh are creating the directory concurrently. This
# is OK.
test -d "$pathcomp" || exit
fi
pathcomp=$pathcomp/
done
fi
if test -n "$dir_arg"; then
$doit $mkdircmd "$dst" \
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
else
dstfile=`basename "$dst"`
# Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_
rmtmp=$dstdir/_rm.$$_
# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
trap '(exit $?); exit' 1 2 13 15
# Copy the file name to the temp name.
$doit $cpprog "$src" "$dsttmp" &&
# and set any options; do chmod last to preserve setuid bits.
#
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $cpprog $src $dsttmp" command.
#
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
# Now rename the file to the real destination.
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|| {
# The rename failed, perhaps because mv can't rename something else
# to itself, or perhaps because mv is so ancient that it does not
# support -f.
# Now remove or move aside any old file at destination location.
# We try this two ways since rm can't unlink itself on some
# systems and the destination file might be busy for other
# reasons. In this case, the final cleanup might fail but the new
# file should still install successfully.
{
if test -f "$dstdir/$dstfile"; then
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|| {
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
(exit 1); exit 1
}
else
:
fi
} &&
# Now rename the file to the real destination.
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
}
}
fi || { (exit 1); exit 1; }
done
# The final little trick to "correctly" pass the exit status to the exit trap.
{
(exit 0); exit 0
}
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End: