18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#!/bin/sh 28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# install - install a program, script, or datafile 38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsscriptversion=2005-05-14.22 58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# This originates from X11R5 (mit/util/scripts/install.sh), which was 78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# later released in X11R6 (xc/config/util/install.sh) with the 88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# following copyright and license. 98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Copyright (C) 1994 X Consortium 118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Permission is hereby granted, free of charge, to any person obtaining a copy 138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# of this software and associated documentation files (the "Software"), to 148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# deal in the Software without restriction, including without limitation the 158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# sell copies of the Software, and to permit persons to whom the Software is 178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# furnished to do so, subject to the following conditions: 188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# The above copyright notice and this permission notice shall be included in 208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# all copies or substantial portions of the Software. 218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Except as contained in this notice, the name of the X Consortium shall not 308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# be used in advertising or otherwise to promote the sale, use or other deal- 318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# ings in this Software without prior written authorization from the X Consor- 328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# tium. 338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# FSF changes to this file are in the public domain. 368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Calling this script install-sh is preferred over install.sh, to prevent 388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# `make' implicit rules from creating a file called install from it 398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# when there is no Makefile. 408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# 418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# This script is compatible with the BSD install script, but was written 428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# from scratch. It can only install one file at a time, a restriction 438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# shared with many OS's install programs. 448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# set DOITPROG to echo to test this script 468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Don't use :- since 4.3BSD and earlier shells don't like it. 488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdoit="${DOITPROG-}" 498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# put in absolute paths if you don't have them in your path; or use env. vars. 518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmvprog="${MVPROG-mv}" 538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscpprog="${CPPROG-cp}" 548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschmodprog="${CHMODPROG-chmod}" 558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschownprog="${CHOWNPROG-chown}" 568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschgrpprog="${CHGRPPROG-chgrp}" 578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstripprog="${STRIPPROG-strip}" 588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrmprog="${RMPROG-rm}" 598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmkdirprog="${MKDIRPROG-mkdir}" 608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschmodcmd="$chmodprog 0755" 628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschowncmd= 638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschgrpcmd= 648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstripcmd= 658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrmcmd="$rmprog -f" 668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmvcmd="$mvprog" 678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssrc= 688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdst= 698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdir_arg= 708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdstarg= 718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsno_target_directory= 728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsusage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels or: $0 [OPTION]... SRCFILES... DIRECTORY 758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels or: $0 [OPTION]... -t DIRECTORY SRCFILES... 768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels or: $0 [OPTION]... -d DIRECTORIES... 778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIn the 1st form, copy SRCFILE to DSTFILE. 798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIn the 4th, create DIRECTORIES. 818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsOptions: 838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-c (ignored) 848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-d create directories instead of installing files. 858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-g GROUP $chgrpprog installed files to GROUP. 868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-m MODE $chmodprog installed files to MODE. 878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-o USER $chownprog installed files to USER. 888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-s $stripprog installed files. 898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-t DIRECTORY install into DIRECTORY. 908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels-T report an error if DSTFILE is a directory. 918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels--help display this help and exit. 928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels--version display version info and exit. 938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsEnvironment variables override the default commands: 958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG 968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels" 978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswhile test -n "$1"; do 998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels case $1 in 1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -c) shift 1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -d) dir_arg=true 1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -g) chgrpcmd="$chgrpprog $2" 1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels --help) echo "$usage"; exit $?;; 1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -m) chmodcmd="$chmodprog $2" 1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -o) chowncmd="$chownprog $2" 1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -s) stripcmd=$stripprog 1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -t) dstarg=$2 1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -T) no_target_directory=true 1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels continue;; 1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels --version) echo "$0 $scriptversion"; exit $?;; 1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *) # When -d is used, all remaining arguments are directories to create. 1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # When -t is used, the destination is already specified. 1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels test -n "$dir_arg$dstarg" && break 1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Otherwise, the last argument is the destination. Remove it from $@. 1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for arg 1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels do 1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -n "$dstarg"; then 1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # $@ is not empty: it contains at least $arg. 1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels set fnord "$@" "$dstarg" 1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift # fnord 1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift # arg 1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dstarg=$arg 1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels done 1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels break;; 1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels esac 1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdone 1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsif test -z "$1"; then 1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -z "$dir_arg"; then 1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels echo "$0: no input file specified." >&2 1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit 1 1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # It's OK to call `install-sh -d' without argument. 1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # This can happen when creating conditional directories. 1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit 0 1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfi 1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfor src 1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdo 1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Protect names starting with `-'. 1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels case $src in 1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -*) src=./$src ;; 1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels esac 1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -n "$dir_arg"; then 1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dst=$src 1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels src= 1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -d "$dst"; then 1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mkdircmd=: 1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels chmodcmd= 1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels mkdircmd=$mkdirprog 1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # might cause directories to be created, which would be especially bad 1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # if $src (and thus $dsttmp) contains '*'. 1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test ! -f "$src" && test ! -d "$src"; then 1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels echo "$0: $src does not exist." >&2 1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit 1 1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -z "$dstarg"; then 1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels echo "$0: no destination specified." >&2 1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit 1 1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dst=$dstarg 1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Protect names starting with `-'. 2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels case $dst in 2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels -*) dst=./$dst ;; 2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels esac 2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # If destination is a directory, append the input filename; won't work 2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # if double slashes aren't ignored. 2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -d "$dst"; then 2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -n "$no_target_directory"; then 2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels echo "$0: $dstarg: Is a directory" >&2 2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels exit 1 2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dst=$dst/`basename "$src"` 2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # This sed command emulates the dirname command. 2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` 2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Make sure that the destination directory exists. 2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Skip lots of stat calls in the usual case. 2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test ! -d "$dstdir"; then 2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels defaultIFS=' 2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ' 2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels IFS="${IFS-$defaultIFS}" 2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels oIFS=$IFS 2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Some sh's can't handle IFS=/ for some reason. 2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels IFS='%' 2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` 2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels IFS=$oIFS 2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pathcomp= 2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels while test $# -ne 0 ; do 2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pathcomp=$pathcomp$1 2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels shift 2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test ! -d "$pathcomp"; then 2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels $mkdirprog "$pathcomp" 2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # mkdir can fail with a `File exist' error in case several 2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # install-sh are creating the directory concurrently. This 2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # is OK. 2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels test -d "$pathcomp" || exit 2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels pathcomp=$pathcomp/ 2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels done 2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -n "$dir_arg"; then 2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels $doit $mkdircmd "$dst" \ 2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ 2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ 2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ 2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } 2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dstfile=`basename "$dst"` 2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Make a couple of temp file names in the proper directory. 2608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dsttmp=$dstdir/_inst.$$_ 2618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels rmtmp=$dstdir/_rm.$$_ 2628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Trap to clean up those temp files at exit. 2648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 2658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels trap '(exit $?); exit' 1 2 13 15 2668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Copy the file name to the temp name. 2688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels $doit $cpprog "$src" "$dsttmp" && 2698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # and set any options; do chmod last to preserve setuid bits. 2718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # 2728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # If any of these fail, we abort the whole thing. If we want to 2738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # ignore errors from any of these, just make sure not to ignore 2748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # errors from the above "$doit $cpprog $src $dsttmp" command. 2758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # 2768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ 2778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ 2788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ 2798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && 2808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Now rename the file to the real destination. 2828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ 2838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels || { 2848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # The rename failed, perhaps because mv can't rename something else 2858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # to itself, or perhaps because mv is so ancient that it does not 2868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # support -f. 2878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Now remove or move aside any old file at destination location. 2898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # We try this two ways since rm can't unlink itself on some 2908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # systems and the destination file might be busy for other 2918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # reasons. In this case, the final cleanup might fail but the new 2928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # file should still install successfully. 2938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels { 2948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if test -f "$dstdir/$dstfile"; then 2958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ 2968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ 2978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels || { 2988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 2998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels (exit 1); exit 1 3008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 3028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels : 3038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi 3048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } && 3058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels # Now rename the file to the real destination. 3078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" 3088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi || { (exit 1); exit 1; } 3118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdone 3128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# The final little trick to "correctly" pass the exit status to the exit trap. 3148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels{ 3158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels (exit 0); exit 0 3168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 3178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# Local variables: 3198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# eval: (add-hook 'write-file-hooks 'time-stamp) 3208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-start: "scriptversion=" 3218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-format: "%:y-%02m-%02d.%02H" 3228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# time-stamp-end: "$" 3238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels# End: 324