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