1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#!/bin/sh 2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# install - install a program, script, or datafile 3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonscriptversion=2009-04-28.21; # UTC 5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# This originates from X11R5 (mit/util/scripts/install.sh), which was 7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# later released in X11R6 (xc/config/util/install.sh) with the 8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# following copyright and license. 9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Copyright (C) 1994 X Consortium 11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Permission is hereby granted, free of charge, to any person obtaining a copy 13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# of this software and associated documentation files (the "Software"), to 14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# deal in the Software without restriction, including without limitation the 15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# sell copies of the Software, and to permit persons to whom the Software is 17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# furnished to do so, subject to the following conditions: 18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# The above copyright notice and this permission notice shall be included in 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# all copies or substantial portions of the Software. 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Except as contained in this notice, the name of the X Consortium shall not 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# be used in advertising or otherwise to promote the sale, use or other deal- 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# ings in this Software without prior written authorization from the X Consor- 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# tium. 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# FSF changes to this file are in the public domain. 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Calling this script install-sh is preferred over install.sh, to prevent 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# `make' implicit rules from creating a file called install from it 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# when there is no Makefile. 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# This script is compatible with the BSD install script, but was written 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# from scratch. 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnl=' 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson' 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIFS=" "" $nl" 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# set DOITPROG to echo to test this script 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Don't use :- since 4.3BSD and earlier shells don't like it. 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondoit=${DOITPROG-} 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test -z "$doit"; then 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson doit_exec=exec 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonelse 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson doit_exec=$doit 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Put in absolute file names if you don't have them in your path; 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# or use environment vars. 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchgrpprog=${CHGRPPROG-chgrp} 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchmodprog=${CHMODPROG-chmod} 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchownprog=${CHOWNPROG-chown} 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoncmpprog=${CMPPROG-cmp} 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoncpprog=${CPPROG-cp} 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmkdirprog=${MKDIRPROG-mkdir} 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmvprog=${MVPROG-mv} 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonrmprog=${RMPROG-rm} 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstripprog=${STRIPPROG-strip} 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonposix_glob='?' 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoninitialize_posix_glob=' 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test "$posix_glob" != "?" || { 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (set -f) 2>/dev/null; then 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson posix_glob= 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson posix_glob=: 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson' 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonposix_mkdir= 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Desired mode of installed file. 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmode=0755 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchgrpcmd= 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchmodcmd=$chmodprog 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonchowncmd= 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonmvcmd=$mvprog 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonrmcmd="$rmprog -f" 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstripcmd= 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonsrc= 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondst= 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondir_arg= 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondst_arg= 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoncopy_on_change=false 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonno_target_directory= 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusage="\ 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson or: $0 [OPTION]... SRCFILES... DIRECTORY 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson or: $0 [OPTION]... -d DIRECTORIES... 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIn the 1st form, copy SRCFILE to DSTFILE. 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIn the 4th, create DIRECTORIES. 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonOptions: 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson --help display this help and exit. 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson --version display version info and exit. 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -c (ignored) 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -C install only if different (preserve the last data modification time) 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -d create directories instead of installing files. 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -g GROUP $chgrpprog installed files to GROUP. 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -m MODE $chmodprog installed files to MODE. 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -o USER $chownprog installed files to USER. 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -s $stripprog installed files. 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -t DIRECTORY install into DIRECTORY. 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -T report an error if DSTFILE is a directory. 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonEnvironment variables override the default commands: 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson RMPROG STRIPPROG 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson" 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonwhile test $# -ne 0; do 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $1 in 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -c) ;; 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -C) copy_on_change=true;; 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -d) dir_arg=true;; 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -g) chgrpcmd="$chgrpprog $2" 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift;; 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson --help) echo "$usage"; exit $?;; 143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -m) mode=$2 145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $mode in 146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *' '* | *' '* | *' 147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson'* | *'*'* | *'?'* | *'['*) 148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson echo "$0: invalid mode: $mode" >&2 149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exit 1;; 150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift;; 152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -o) chowncmd="$chownprog $2" 154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift;; 155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -s) stripcmd=$stripprog;; 157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -t) dst_arg=$2 159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift;; 160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -T) no_target_directory=true;; 162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson --version) echo "$0 $scriptversion"; exit $?;; 164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson --) shift 166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson break;; 167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -*) echo "$0: invalid option: $1" >&2 169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exit 1;; 170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *) break;; 172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift 174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondone 175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # When -d is used, all remaining arguments are directories to create. 178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # When -t is used, the destination is already specified. 179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Otherwise, the last argument is the destination. Remove it from $@. 180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for arg 181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson do 182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -n "$dst_arg"; then 183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # $@ is not empty: it contains at least $arg. 184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson set fnord "$@" "$dst_arg" 185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift # fnord 186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift # arg 188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dst_arg=$arg 189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson done 190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi 191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test $# -eq 0; then 193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -z "$dir_arg"; then 194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson echo "$0: no input file specified." >&2 195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exit 1 196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # It's OK to call `install-sh -d' without argument. 198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # This can happen when creating conditional directories. 199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exit 0 200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi 201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonif test -z "$dir_arg"; then 203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson trap '(exit $?); exit' 1 2 13 15 204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Set umask so as not to create temps with too-generous modes. 206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # However, 'strip' requires both read and write access to temps. 207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $mode in 208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Optimize common cases. 209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *644) cp_umask=133;; 210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *755) cp_umask=22;; 211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *[0-7]) 213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -z "$stripcmd"; then 214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson u_plus_rw= 215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson u_plus_rw='% 200' 217f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 218f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 219f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *) 220f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -z "$stripcmd"; then 221f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson u_plus_rw= 222f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 223f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson u_plus_rw=,u+rw 224f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 225f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson cp_umask=$mode$u_plus_rw;; 226f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 227f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfi 228f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 229f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonfor src 230f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondo 231f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Protect names starting with `-'. 232f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $src in 233f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -*) src=./$src;; 234f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 235f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 236f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -n "$dir_arg"; then 237f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dst=$src 238f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dstdir=$dst 239f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test -d "$dstdir" 240f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dstdir_status=$? 241f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 242f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 243f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 244f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # might cause directories to be created, which would be especially bad 245f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # if $src (and thus $dsttmp) contains '*'. 246f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test ! -f "$src" && test ! -d "$src"; then 247f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson echo "$0: $src does not exist." >&2 248f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exit 1 249f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 250f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 251f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -z "$dst_arg"; then 252f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson echo "$0: no destination specified." >&2 253f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exit 1 254f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 255f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 256f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dst=$dst_arg 257f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Protect names starting with `-'. 258f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $dst in 259f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -*) dst=./$dst;; 260f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 261f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 262f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # If destination is a directory, append the input filename; won't work 263f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # if double slashes aren't ignored. 264f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -d "$dst"; then 265f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -n "$no_target_directory"; then 266f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson echo "$0: $dst_arg: Is a directory" >&2 267f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exit 1 268f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 269f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dstdir=$dst 270f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dst=$dstdir/`basename "$src"` 271f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dstdir_status=0 272f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 273f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Prefer dirname, but fall back on a substitute if dirname fails. 274f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dstdir=` 275f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (dirname "$dst") 2>/dev/null || 276f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 277f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson X"$dst" : 'X\(//\)[^/]' \| \ 278f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson X"$dst" : 'X\(//\)$' \| \ 279f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson X"$dst" : 'X\(/\)' \| . 2>/dev/null || 280f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson echo X"$dst" | 281f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 282f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson s//\1/ 283f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson q 284f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 285f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson /^X\(\/\/\)[^/].*/{ 286f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson s//\1/ 287f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson q 288f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 289f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson /^X\(\/\/\)$/{ 290f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson s//\1/ 291f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson q 292f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 293f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson /^X\(\/\).*/{ 294f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson s//\1/ 295f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson q 296f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 297f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson s/.*/./; q' 298f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ` 299f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 300f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test -d "$dstdir" 301f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dstdir_status=$? 302f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 303f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 304f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 305f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson obsolete_mkdir_used=false 306f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 307f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test $dstdir_status != 0; then 308f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $posix_mkdir in 309f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson '') 310f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Create intermediate dirs using mode 755 as modified by the umask. 311f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # This is like FreeBSD 'install' as of 1997-10-28. 312f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson umask=`umask` 313f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $stripcmd.$umask in 314f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Optimize common cases. 315f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *[2367][2367]) mkdir_umask=$umask;; 316f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 317f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 318f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *[0-7]) 319f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mkdir_umask=`expr $umask + 22 \ 320f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson - $umask % 100 % 40 + $umask % 20 \ 321f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson - $umask % 10 % 4 + $umask % 2 322f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson `;; 323f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *) mkdir_umask=$umask,go-w;; 324f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 325f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 326f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # With -d, create the new directory with the user-specified mode. 327f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Otherwise, rely on $mkdir_umask. 328f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -n "$dir_arg"; then 329f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mkdir_mode=-m$mode 330f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 331f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mkdir_mode= 332f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 333f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 334f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson posix_mkdir=false 335f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $umask in 336f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *[123567][0-7][0-7]) 337f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # POSIX mkdir -p sets u+wx bits regardless of umask, which 338f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 339f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ;; 340f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *) 341f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 342f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 343f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 344f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (umask $mkdir_umask && 345f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 346f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson then 347f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -z "$dir_arg" || { 348f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Check for POSIX incompatibilities with -m. 349f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 350f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # other-writeable bit of parent directory when it shouldn't. 351f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 352f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ls_ld_tmpdir=`ls -ld "$tmpdir"` 353f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $ls_ld_tmpdir in 354f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson d????-?r-*) different_mode=700;; 355f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson d????-?--*) different_mode=755;; 356f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *) false;; 357f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac && 358f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $mkdirprog -m$different_mode -p -- "$tmpdir" && { 359f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 360f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 361f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 362f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 363f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson then posix_mkdir=: 364f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 365f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson rmdir "$tmpdir/d" "$tmpdir" 366f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 367f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Remove any dirs left behind by ancient mkdir implementations. 368f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 369f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 370f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson trap '' 0;; 371f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac;; 372f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 373f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 374f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if 375f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $posix_mkdir && ( 376f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson umask $mkdir_umask && 377f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 378f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ) 379f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson then : 380f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 381f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 382f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # The umask is ridiculous, or mkdir does not conform to POSIX, 383f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # or it failed possibly due to a race condition. Create the 384f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # directory the slow way, step by step, checking for races as we go. 385f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 386f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $dstdir in 387f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson /*) prefix='/';; 388f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson -*) prefix='./';; 389f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *) prefix='';; 390f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 391f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 392f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson eval "$initialize_posix_glob" 393f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 394f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson oIFS=$IFS 395f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson IFS=/ 396f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $posix_glob set -f 397f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson set fnord $dstdir 398f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson shift 399f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $posix_glob set +f 400f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson IFS=$oIFS 401f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 402f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson prefixes= 403f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 404f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for d 405f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson do 406f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test -z "$d" && continue 407f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 408f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson prefix=$prefix$d 409f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -d "$prefix"; then 410f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson prefixes= 411f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 412f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if $posix_mkdir; then 413f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (umask=$mkdir_umask && 414f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 415f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Don't fail if two instances are running concurrently. 416f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test -d "$prefix" || exit 1 417f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 418f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case $prefix in 419f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 420f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *) qprefix=$prefix;; 421f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson esac 422f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson prefixes="$prefixes '$qprefix'" 423f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 424f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 425f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson prefix=$prefix/ 426f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson done 427f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 428f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -n "$prefixes"; then 429f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Don't fail if two instances are running concurrently. 430f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (umask $mkdir_umask && 431f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson eval "\$doit_exec \$mkdirprog $prefixes") || 432f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test -d "$dstdir" || exit 1 433f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson obsolete_mkdir_used=true 434f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 435f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 436f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 437f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 438f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if test -n "$dir_arg"; then 439f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 440f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 441f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 442f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 443f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 444f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 445f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Make a couple of temp file names in the proper directory. 446f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dsttmp=$dstdir/_inst.$$_ 447f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson rmtmp=$dstdir/_rm.$$_ 448f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 449f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Trap to clean up those temp files at exit. 450f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 451f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 452f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Copy the file name to the temp name. 453f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 454f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 455f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # and set any options; do chmod last to preserve setuid bits. 456f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # 457f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # If any of these fail, we abort the whole thing. If we want to 458f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # ignore errors from any of these, just make sure not to ignore 459f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # errors from the above "$doit $cpprog $src $dsttmp" command. 460f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # 461f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 462f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 463f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 464f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 465f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 466f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # If -C, don't bother to copy if it wouldn't change the file. 467f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if $copy_on_change && 468f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 469f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 470f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 471f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson eval "$initialize_posix_glob" && 472f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $posix_glob set -f && 473f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson set X $old && old=:$2:$4:$5:$6 && 474f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson set X $new && new=:$2:$4:$5:$6 && 475f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $posix_glob set +f && 476f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 477f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test "$old" = "$new" && 478f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 479f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson then 480f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson rm -f "$dsttmp" 481f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 482f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Rename the file to the real destination. 483f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 484f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 485f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # The rename failed, perhaps because mv can't rename something else 486f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # to itself, or perhaps because mv is so ancient that it does not 487f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # support -f. 488f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { 489f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Now remove or move aside any old file at destination location. 490f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # We try this two ways since rm can't unlink itself on some 491f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # systems and the destination file might be busy for other 492f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # reasons. In this case, the final cleanup might fail but the new 493f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # file should still install successfully. 494f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { 495f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson test ! -f "$dst" || 496f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $doit $rmcmd -f "$dst" 2>/dev/null || 497f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 498f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 499f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } || 500f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson { echo "$0: cannot unlink or rename $dst" >&2 501f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (exit 1); exit 1 502f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 503f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } && 504f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 505f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson # Now rename the file to the real destination. 506f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson $doit $mvcmd "$dsttmp" "$dst" 507f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 508f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi || exit 1 509f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 510f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson trap '' 0 511f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fi 512f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsondone 513f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 514f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# Local variables: 515f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# eval: (add-hook 'write-file-hooks 'time-stamp) 516f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-start: "scriptversion=" 517f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-format: "%:y-%02m-%02d.%02H" 518f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-time-zone: "UTC" 519f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# time-stamp-end: "; # UTC" 520f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson# End: 521