165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#!/bin/sh 265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# install - install a program, script, or datafile 365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichscriptversion=2011-11-20.07; # UTC 565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# This originates from X11R5 (mit/util/scripts/install.sh), which was 765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# later released in X11R6 (xc/config/util/install.sh) with the 865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# following copyright and license. 965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 1065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Copyright (C) 1994 X Consortium 1165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 1265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Permission is hereby granted, free of charge, to any person obtaining a copy 1365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# of this software and associated documentation files (the "Software"), to 1465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# deal in the Software without restriction, including without limitation the 1565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 1665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# sell copies of the Software, and to permit persons to whom the Software is 1765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# furnished to do so, subject to the following conditions: 1865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 1965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# The above copyright notice and this permission notice shall be included in 2065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# all copies or substantial portions of the Software. 2165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 2265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 2565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 2765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 2965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Except as contained in this notice, the name of the X Consortium shall not 3065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# be used in advertising or otherwise to promote the sale, use or other deal- 3165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# ings in this Software without prior written authorization from the X Consor- 3265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# tium. 3365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 3465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 3565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# FSF changes to this file are in the public domain. 3665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 3765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Calling this script install-sh is preferred over install.sh, to prevent 3865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 'make' implicit rules from creating a file called install from it 3965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# when there is no Makefile. 4065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# 4165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# This script is compatible with the BSD install script, but was written 4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# from scratch. 4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnl=' 4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich' 4665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIFS=" "" $nl" 4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# set DOITPROG to echo to test this script 4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Don't use :- since 4.3BSD and earlier shells don't like it. 5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdoit=${DOITPROG-} 5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test -z "$doit"; then 5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich doit_exec=exec 5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse 5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich doit_exec=$doit 5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi 5765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Put in absolute file names if you don't have them in your path; 5965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# or use environment vars. 6065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchgrpprog=${CHGRPPROG-chgrp} 6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchmodprog=${CHMODPROG-chmod} 6365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchownprog=${CHOWNPROG-chown} 6465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcmpprog=${CMPPROG-cmp} 6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcpprog=${CPPROG-cp} 6665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmkdirprog=${MKDIRPROG-mkdir} 6765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmvprog=${MVPROG-mv} 6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichrmprog=${RMPROG-rm} 6965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstripprog=${STRIPPROG-strip} 7065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichposix_glob='?' 7265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinitialize_posix_glob=' 7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test "$posix_glob" != "?" || { 7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (set -f) 2>/dev/null; then 7565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich posix_glob= 7665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich posix_glob=: 7865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich' 8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 8265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichposix_mkdir= 8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Desired mode of installed file. 8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmode=0755 8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchgrpcmd= 8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchmodcmd=$chmodprog 8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchowncmd= 9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmvcmd=$mvprog 9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichrmcmd="$rmprog -f" 9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstripcmd= 9365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 9465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsrc= 9565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdst= 9665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdir_arg= 9765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdst_arg= 9865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 9965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcopy_on_change=false 10065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichno_target_directory= 10165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 10265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichusage="\ 10365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 10465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich or: $0 [OPTION]... SRCFILES... DIRECTORY 10565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich or: $0 [OPTION]... -t DIRECTORY SRCFILES... 10665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich or: $0 [OPTION]... -d DIRECTORIES... 10765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 10865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn the 1st form, copy SRCFILE to DSTFILE. 10965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 11065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn the 4th, create DIRECTORIES. 11165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 11265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichOptions: 11365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich --help display this help and exit. 11465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich --version display version info and exit. 11565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 11665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -c (ignored) 11765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -C install only if different (preserve the last data modification time) 11865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -d create directories instead of installing files. 11965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -g GROUP $chgrpprog installed files to GROUP. 12065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -m MODE $chmodprog installed files to MODE. 12165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -o USER $chownprog installed files to USER. 12265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -s $stripprog installed files. 12365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -t DIRECTORY install into DIRECTORY. 12465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -T report an error if DSTFILE is a directory. 12565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 12665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichEnvironment variables override the default commands: 12765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 12865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich RMPROG STRIPPROG 12965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich" 13065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 13165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhile test $# -ne 0; do 13265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $1 in 13365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -c) ;; 13465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 13565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -C) copy_on_change=true;; 13665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 13765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -d) dir_arg=true;; 13865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 13965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -g) chgrpcmd="$chgrpprog $2" 14065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift;; 14165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 14265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich --help) echo "$usage"; exit $?;; 14365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 14465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -m) mode=$2 14565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $mode in 14665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *' '* | *' '* | *' 14765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich'* | *'*'* | *'?'* | *'['*) 14865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich echo "$0: invalid mode: $mode" >&2 14965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exit 1;; 15065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 15165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift;; 15265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 15365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -o) chowncmd="$chownprog $2" 15465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift;; 15565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 15665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -s) stripcmd=$stripprog;; 15765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 15865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -t) dst_arg=$2 15965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Protect names problematic for 'test' and other utilities. 16065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $dst_arg in 16165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -* | [=\(\)!]) dst_arg=./$dst_arg;; 16265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 16365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift;; 16465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 16565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -T) no_target_directory=true;; 16665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 16765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich --version) echo "$0 $scriptversion"; exit $?;; 16865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 16965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich --) shift 17065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break;; 17165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 17265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -*) echo "$0: invalid option: $1" >&2 17365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exit 1;; 17465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 17565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *) break;; 17665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 17765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift 17865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdone 17965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 18065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 18165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # When -d is used, all remaining arguments are directories to create. 18265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # When -t is used, the destination is already specified. 18365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Otherwise, the last argument is the destination. Remove it from $@. 18465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich for arg 18565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich do 18665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -n "$dst_arg"; then 18765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # $@ is not empty: it contains at least $arg. 18865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich set fnord "$@" "$dst_arg" 18965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift # fnord 19065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 19165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift # arg 19265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dst_arg=$arg 19365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Protect names problematic for 'test' and other utilities. 19465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $dst_arg in 19565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -* | [=\(\)!]) dst_arg=./$dst_arg;; 19665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 19765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich done 19865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi 19965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 20065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test $# -eq 0; then 20165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -z "$dir_arg"; then 20265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich echo "$0: no input file specified." >&2 20365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exit 1 20465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 20565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # It's OK to call 'install-sh -d' without argument. 20665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # This can happen when creating conditional directories. 20765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exit 0 20865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi 20965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 21065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif test -z "$dir_arg"; then 21165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich do_exit='(exit $ret); exit $ret' 21265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap "ret=129; $do_exit" 1 21365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap "ret=130; $do_exit" 2 21465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap "ret=141; $do_exit" 13 21565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap "ret=143; $do_exit" 15 21665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 21765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Set umask so as not to create temps with too-generous modes. 21865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # However, 'strip' requires both read and write access to temps. 21965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $mode in 22065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Optimize common cases. 22165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *644) cp_umask=133;; 22265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *755) cp_umask=22;; 22365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 22465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *[0-7]) 22565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -z "$stripcmd"; then 22665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich u_plus_rw= 22765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 22865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich u_plus_rw='% 200' 22965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 23065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 23165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *) 23265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -z "$stripcmd"; then 23365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich u_plus_rw= 23465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 23565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich u_plus_rw=,u+rw 23665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 23765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich cp_umask=$mode$u_plus_rw;; 23865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 23965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfi 24065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 24165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor src 24265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdo 24365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Protect names problematic for 'test' and other utilities. 24465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $src in 24565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich -* | [=\(\)!]) src=./$src;; 24665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 24765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 24865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -n "$dir_arg"; then 24965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dst=$src 25065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dstdir=$dst 25165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test -d "$dstdir" 25265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dstdir_status=$? 25365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 25465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 25565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 25665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # might cause directories to be created, which would be especially bad 25765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # if $src (and thus $dsttmp) contains '*'. 25865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test ! -f "$src" && test ! -d "$src"; then 25965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich echo "$0: $src does not exist." >&2 26065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exit 1 26165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 26265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 26365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -z "$dst_arg"; then 26465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich echo "$0: no destination specified." >&2 26565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exit 1 26665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 26765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dst=$dst_arg 26865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 26965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # If destination is a directory, append the input filename; won't work 27065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # if double slashes aren't ignored. 27165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -d "$dst"; then 27265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -n "$no_target_directory"; then 27365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich echo "$0: $dst_arg: Is a directory" >&2 27465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exit 1 27565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 27665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dstdir=$dst 27765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dst=$dstdir/`basename "$src"` 27865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dstdir_status=0 27965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 28065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Prefer dirname, but fall back on a substitute if dirname fails. 28165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dstdir=` 28265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (dirname "$dst") 2>/dev/null || 28365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 28465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich X"$dst" : 'X\(//\)[^/]' \| \ 28565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich X"$dst" : 'X\(//\)$' \| \ 28665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich X"$dst" : 'X\(/\)' \| . 2>/dev/null || 28765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich echo X"$dst" | 28865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 28965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich s//\1/ 29065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich q 29165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 29265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /^X\(\/\/\)[^/].*/{ 29365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich s//\1/ 29465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich q 29565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 29665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /^X\(\/\/\)$/{ 29765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich s//\1/ 29865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich q 29965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 30065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /^X\(\/\).*/{ 30165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich s//\1/ 30265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich q 30365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 30465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich s/.*/./; q' 30565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich ` 30665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 30765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test -d "$dstdir" 30865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dstdir_status=$? 30965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 31065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 31165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 31265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich obsolete_mkdir_used=false 31365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 31465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test $dstdir_status != 0; then 31565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $posix_mkdir in 31665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich '') 31765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Create intermediate dirs using mode 755 as modified by the umask. 31865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # This is like FreeBSD 'install' as of 1997-10-28. 31965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich umask=`umask` 32065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $stripcmd.$umask in 32165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Optimize common cases. 32265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *[2367][2367]) mkdir_umask=$umask;; 32365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 32465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 32565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *[0-7]) 32665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich mkdir_umask=`expr $umask + 22 \ 32765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich - $umask % 100 % 40 + $umask % 20 \ 32865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich - $umask % 10 % 4 + $umask % 2 32965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich `;; 33065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *) mkdir_umask=$umask,go-w;; 33165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 33265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 33365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # With -d, create the new directory with the user-specified mode. 33465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Otherwise, rely on $mkdir_umask. 33565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -n "$dir_arg"; then 33665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich mkdir_mode=-m$mode 33765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 33865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich mkdir_mode= 33965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 34065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 34165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich posix_mkdir=false 34265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $umask in 34365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *[123567][0-7][0-7]) 34465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # POSIX mkdir -p sets u+wx bits regardless of umask, which 34565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 34665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich ;; 34765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *) 34865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 34965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 35065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 35165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (umask $mkdir_umask && 35265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 35365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich then 35465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -z "$dir_arg" || { 35565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Check for POSIX incompatibilities with -m. 35665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 35765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # other-writable bit of parent directory when it shouldn't. 35865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 35965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich ls_ld_tmpdir=`ls -ld "$tmpdir"` 36065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $ls_ld_tmpdir in 36165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich d????-?r-*) different_mode=700;; 36265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich d????-?--*) different_mode=755;; 36365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *) false;; 36465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac && 36565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $mkdirprog -m$different_mode -p -- "$tmpdir" && { 36665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 36765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 36865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 36965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 37065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich then posix_mkdir=: 37165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 37265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich rmdir "$tmpdir/d" "$tmpdir" 37365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 37465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Remove any dirs left behind by ancient mkdir implementations. 37565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 37665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 37765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap '' 0;; 37865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac;; 37965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 38065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 38165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if 38265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $posix_mkdir && ( 38365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich umask $mkdir_umask && 38465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 38565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich ) 38665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich then : 38765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 38865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 38965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # The umask is ridiculous, or mkdir does not conform to POSIX, 39065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # or it failed possibly due to a race condition. Create the 39165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # directory the slow way, step by step, checking for races as we go. 39265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 39365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $dstdir in 39465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /*) prefix='/';; 39565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich [-=\(\)!]*) prefix='./';; 39665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *) prefix='';; 39765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 39865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 39965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich eval "$initialize_posix_glob" 40065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 40165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich oIFS=$IFS 40265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich IFS=/ 40365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $posix_glob set -f 40465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich set fnord $dstdir 40565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich shift 40665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $posix_glob set +f 40765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich IFS=$oIFS 40865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 40965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich prefixes= 41065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 41165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich for d 41265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich do 41365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test X"$d" = X && continue 41465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 41565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich prefix=$prefix$d 41665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -d "$prefix"; then 41765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich prefixes= 41865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 41965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if $posix_mkdir; then 42065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (umask=$mkdir_umask && 42165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 42265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Don't fail if two instances are running concurrently. 42365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test -d "$prefix" || exit 1 42465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 42565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case $prefix in 42665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 42765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich *) qprefix=$prefix;; 42865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich esac 42965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich prefixes="$prefixes '$qprefix'" 43065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 43165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 43265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich prefix=$prefix/ 43365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich done 43465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 43565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -n "$prefixes"; then 43665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Don't fail if two instances are running concurrently. 43765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (umask $mkdir_umask && 43865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich eval "\$doit_exec \$mkdirprog $prefixes") || 43965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test -d "$dstdir" || exit 1 44065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich obsolete_mkdir_used=true 44165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 44265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 44365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 44465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 44565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if test -n "$dir_arg"; then 44665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 44765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 44865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 44965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 45065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 45165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 45265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Make a couple of temp file names in the proper directory. 45365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich dsttmp=$dstdir/_inst.$$_ 45465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich rmtmp=$dstdir/_rm.$$_ 45565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 45665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Trap to clean up those temp files at exit. 45765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 45865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 45965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Copy the file name to the temp name. 46065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 46165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 46265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # and set any options; do chmod last to preserve setuid bits. 46365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # 46465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # If any of these fail, we abort the whole thing. If we want to 46565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # ignore errors from any of these, just make sure not to ignore 46665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # errors from the above "$doit $cpprog $src $dsttmp" command. 46765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # 46865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 46965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 47065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 47165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 47265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 47365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # If -C, don't bother to copy if it wouldn't change the file. 47465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if $copy_on_change && 47565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 47665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 47765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 47865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich eval "$initialize_posix_glob" && 47965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $posix_glob set -f && 48065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich set X $old && old=:$2:$4:$5:$6 && 48165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich set X $new && new=:$2:$4:$5:$6 && 48265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $posix_glob set +f && 48365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 48465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test "$old" = "$new" && 48565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 48665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich then 48765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich rm -f "$dsttmp" 48865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 48965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Rename the file to the real destination. 49065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 49165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 49265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # The rename failed, perhaps because mv can't rename something else 49365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # to itself, or perhaps because mv is so ancient that it does not 49465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # support -f. 49565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 49665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Now remove or move aside any old file at destination location. 49765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # We try this two ways since rm can't unlink itself on some 49865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # systems and the destination file might be busy for other 49965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # reasons. In this case, the final cleanup might fail but the new 50065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # file should still install successfully. 50165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 50265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich test ! -f "$dst" || 50365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $doit $rmcmd -f "$dst" 2>/dev/null || 50465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 50565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 50665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } || 50765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { echo "$0: cannot unlink or rename $dst" >&2 50865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (exit 1); exit 1 50965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 51065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } && 51165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 51265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich # Now rename the file to the real destination. 51365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich $doit $mvcmd "$dsttmp" "$dst" 51465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 51565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi || exit 1 51665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 51765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich trap '' 0 51865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich fi 51965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdone 52065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 52165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# Local variables: 52265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# eval: (add-hook 'write-file-hooks 'time-stamp) 52365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-start: "scriptversion=" 52465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-format: "%:y-%02m-%02d.%02H" 52565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-time-zone: "UTC" 52665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# time-stamp-end: "; # UTC" 52765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich# End: 528