1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#!/bin/sh 2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# install - install a program, script, or datafile 3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoscriptversion=2004-09-10.20 5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# This originates from X11R5 (mit/util/scripts/install.sh), which was 7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# later released in X11R6 (xc/config/util/install.sh) with the 8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# following copyright and license. 9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# Copyright (C) 1994 X Consortium 11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# Permission is hereby granted, free of charge, to any person obtaining a copy 13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# of this software and associated documentation files (the "Software"), to 14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# deal in the Software without restriction, including without limitation the 15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# sell copies of the Software, and to permit persons to whom the Software is 17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# furnished to do so, subject to the following conditions: 18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# The above copyright notice and this permission notice shall be included in 20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# all copies or substantial portions of the Software. 21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# Except as contained in this notice, the name of the X Consortium shall not 30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# be used in advertising or otherwise to promote the sale, use or other deal- 31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# ings in this Software without prior written authorization from the X Consor- 32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# tium. 33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# FSF changes to this file are in the public domain. 36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# Calling this script install-sh is preferred over install.sh, to prevent 38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# `make' implicit rules from creating a file called install from it 39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# when there is no Makefile. 40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# 41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# This script is compatible with the BSD install script, but was written 42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# from scratch. It can only install one file at a time, a restriction 43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# shared with many OS's install programs. 44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# set DOITPROG to echo to test this script 46e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 47e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# Don't use :- since 4.3BSD and earlier shells don't like it. 48e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodoit="${DOITPROG-}" 49e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 50e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# put in absolute paths if you don't have them in your path; or use env. vars. 51e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 52e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaomvprog="${MVPROG-mv}" 53e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaocpprog="${CPPROG-cp}" 54e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaochmodprog="${CHMODPROG-chmod}" 55e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaochownprog="${CHOWNPROG-chown}" 56e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaochgrpprog="${CHGRPPROG-chgrp}" 57e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaostripprog="${STRIPPROG-strip}" 58e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaormprog="${RMPROG-rm}" 59e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaomkdirprog="${MKDIRPROG-mkdir}" 60e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 61e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaochmodcmd="$chmodprog 0755" 62e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaochowncmd= 63e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaochgrpcmd= 64e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaostripcmd= 65e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaormcmd="$rmprog -f" 66e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaomvcmd="$mvprog" 67e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaosrc= 68e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodst= 69e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodir_arg= 70e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodstarg= 71e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaono_target_directory= 72e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 73e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaousage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 74e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao or: $0 [OPTION]... SRCFILES... DIRECTORY 75e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao or: $0 [OPTION]... -t DIRECTORY SRCFILES... 76e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao or: $0 [OPTION]... -d DIRECTORIES... 77e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 78e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoIn the 1st form, copy SRCFILE to DSTFILE. 79e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 80e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoIn the 4th, create DIRECTORIES. 81e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 82e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoOptions: 83e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-c (ignored) 84e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-d create directories instead of installing files. 85e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-g GROUP $chgrpprog installed files to GROUP. 86e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-m MODE $chmodprog installed files to MODE. 87e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-o USER $chownprog installed files to USER. 88e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-s $stripprog installed files. 89e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-t DIRECTORY install into DIRECTORY. 90e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao-T report an error if DSTFILE is a directory. 91e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao--help display this help and exit. 92e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao--version display version info and exit. 93e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 94e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoEnvironment variables override the default commands: 95e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG 96e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao" 97e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 98e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaowhile test -n "$1"; do 99e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao case $1 in 100e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -c) shift 101e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 102e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 103e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -d) dir_arg=true 104e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 105e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 106e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 107e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -g) chgrpcmd="$chgrpprog $2" 108e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 109e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 110e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 111e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 112e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao --help) echo "$usage"; exit 0;; 113e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 114e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -m) chmodcmd="$chmodprog $2" 115e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 116e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 117e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 118e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 119e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -o) chowncmd="$chownprog $2" 120e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 121e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 122e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 123e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 124e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -s) stripcmd=$stripprog 125e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 126e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 127e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 128e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -t) dstarg=$2 129e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 130e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 131e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 132e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 133e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -T) no_target_directory=true 134e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 135e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao continue;; 136e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 137e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao --version) echo "$0 $scriptversion"; exit 0;; 138e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 139e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao *) # When -d is used, all remaining arguments are directories to create. 140e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # When -t is used, the destination is already specified. 141e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao test -n "$dir_arg$dstarg" && break 142e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Otherwise, the last argument is the destination. Remove it from $@. 143e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao for arg 144e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao do 145e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -n "$dstarg"; then 146e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # $@ is not empty: it contains at least $arg. 147e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao set fnord "$@" "$dstarg" 148e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift # fnord 149e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 150e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift # arg 151e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dstarg=$arg 152e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao done 153e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao break;; 154e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao esac 155e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodone 156e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 157e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoif test -z "$1"; then 158e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -z "$dir_arg"; then 159e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao echo "$0: no input file specified." >&2 160e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao exit 1 161e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 162e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # It's OK to call `install-sh -d' without argument. 163e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # This can happen when creating conditional directories. 164e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao exit 0 165e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaofi 166e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 167e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaofor src 168e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodo 169e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Protect names starting with `-'. 170e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao case $src in 171e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -*) src=./$src ;; 172e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao esac 173e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 174e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -n "$dir_arg"; then 175e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dst=$src 176e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao src= 177e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 178e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -d "$dst"; then 179e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao mkdircmd=: 180e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao chmodcmd= 181e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao else 182e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao mkdircmd=$mkdirprog 183e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 184e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao else 185e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 186e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # might cause directories to be created, which would be especially bad 187e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # if $src (and thus $dsttmp) contains '*'. 188e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test ! -f "$src" && test ! -d "$src"; then 189e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao echo "$0: $src does not exist." >&2 190e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao exit 1 191e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 192e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 193e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -z "$dstarg"; then 194e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao echo "$0: no destination specified." >&2 195e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao exit 1 196e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 197e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 198e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dst=$dstarg 199e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Protect names starting with `-'. 200e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao case $dst in 201e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao -*) dst=./$dst ;; 202e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao esac 203e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 204e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # If destination is a directory, append the input filename; won't work 205e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # if double slashes aren't ignored. 206e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -d "$dst"; then 207e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -n "$no_target_directory"; then 208e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao echo "$0: $dstarg: Is a directory" >&2 209e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao exit 1 210e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 211e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dst=$dst/`basename "$src"` 212e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 213e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 214e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 215e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # This sed command emulates the dirname command. 216e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 217e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 218e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Make sure that the destination directory exists. 219e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 220e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Skip lots of stat calls in the usual case. 221e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test ! -d "$dstdir"; then 222e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao defaultIFS=' 223e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao ' 224e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao IFS="${IFS-$defaultIFS}" 225e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 226e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao oIFS=$IFS 227e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Some sh's can't handle IFS=/ for some reason. 228e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao IFS='%' 229e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` 230e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao IFS=$oIFS 231e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 232e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao pathcomp= 233e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 234e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao while test $# -ne 0 ; do 235e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao pathcomp=$pathcomp$1 236e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao shift 237e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test ! -d "$pathcomp"; then 238e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao $mkdirprog "$pathcomp" 239e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # mkdir can fail with a `File exist' error in case several 240e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # install-sh are creating the directory concurrently. This 241e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # is OK. 242e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao test -d "$pathcomp" || exit 243e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 244e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao pathcomp=$pathcomp/ 245e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao done 246e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 247e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 248e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -n "$dir_arg"; then 249e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao $doit $mkdircmd "$dst" \ 250e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ 251e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ 252e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ 253e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } 254e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 255e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao else 256e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dstfile=`basename "$dst"` 257e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 258e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Make a couple of temp file names in the proper directory. 259e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao dsttmp=$dstdir/_inst.$$_ 260e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao rmtmp=$dstdir/_rm.$$_ 261e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 262e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Trap to clean up those temp files at exit. 263e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 264e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao trap '(exit $?); exit' 1 2 13 15 265e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 266e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Copy the file name to the temp name. 267e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao $doit $cpprog "$src" "$dsttmp" && 268e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 269e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # and set any options; do chmod last to preserve setuid bits. 270e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # 271e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # If any of these fail, we abort the whole thing. If we want to 272e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # ignore errors from any of these, just make sure not to ignore 273e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # errors from the above "$doit $cpprog $src $dsttmp" command. 274e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # 275e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ 276e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ 277e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ 278e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && 279e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 280e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Now rename the file to the real destination. 281e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ 282e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao || { 283e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # The rename failed, perhaps because mv can't rename something else 284e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # to itself, or perhaps because mv is so ancient that it does not 285e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # support -f. 286e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 287e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Now remove or move aside any old file at destination location. 288e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # We try this two ways since rm can't unlink itself on some 289e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # systems and the destination file might be busy for other 290e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # reasons. In this case, the final cleanup might fail but the new 291e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # file should still install successfully. 292e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { 293e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if test -f "$dstdir/$dstfile"; then 294e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ 295e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ 296e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao || { 297e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 298e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao (exit 1); exit 299e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 300e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao else 301e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao : 302e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi 303e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } && 304e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 305e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao # Now rename the file to the real destination. 306e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" 307e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 308e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 309e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao fi || { (exit 1); exit; } 310e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodone 311e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 312e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# The final little trick to "correctly" pass the exit status to the exit trap. 313e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao{ 314e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao (exit 0); exit 315e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 316e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 317e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# Local variables: 318e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# eval: (add-hook 'write-file-hooks 'time-stamp) 319e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# time-stamp-start: "scriptversion=" 320e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# time-stamp-format: "%:y-%02m-%02d.%02H" 321e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# time-stamp-end: "$" 322e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao# End: 323