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