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