13aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#!/bin/sh 23aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# install - install a program, script, or datafile 33aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 43aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevscriptversion=2009-04-28.21; # UTC 53aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 63aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# This originates from X11R5 (mit/util/scripts/install.sh), which was 73aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# later released in X11R6 (xc/config/util/install.sh) with the 83aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# following copyright and license. 93aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Copyright (C) 1994 X Consortium 113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Permission is hereby granted, free of charge, to any person obtaining a copy 133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# of this software and associated documentation files (the "Software"), to 143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# deal in the Software without restriction, including without limitation the 153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# sell copies of the Software, and to permit persons to whom the Software is 173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# furnished to do so, subject to the following conditions: 183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# The above copyright notice and this permission notice shall be included in 203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# all copies or substantial portions of the Software. 213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Except as contained in this notice, the name of the X Consortium shall not 303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# be used in advertising or otherwise to promote the sale, use or other deal- 313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# ings in this Software without prior written authorization from the X Consor- 323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# tium. 333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# FSF changes to this file are in the public domain. 363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Calling this script install-sh is preferred over install.sh, to prevent 383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# `make' implicit rules from creating a file called install from it 393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# when there is no Makefile. 403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# 413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# This script is compatible with the BSD install script, but was written 423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# from scratch. 433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevnl=' 453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev' 463aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevIFS=" "" $nl" 473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# set DOITPROG to echo to test this script 493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Don't use :- since 4.3BSD and earlier shells don't like it. 513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevdoit=${DOITPROG-} 523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test -z "$doit"; then 533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev doit_exec=exec 543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevelse 553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev doit_exec=$doit 563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi 573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Put in absolute file names if you don't have them in your path; 593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# or use environment vars. 603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevchgrpprog=${CHGRPPROG-chgrp} 623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevchmodprog=${CHMODPROG-chmod} 633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevchownprog=${CHOWNPROG-chown} 643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevcmpprog=${CMPPROG-cmp} 653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevcpprog=${CPPROG-cp} 663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevmkdirprog=${MKDIRPROG-mkdir} 673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevmvprog=${MVPROG-mv} 683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevrmprog=${RMPROG-rm} 693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstripprog=${STRIPPROG-strip} 703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevposix_glob='?' 723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevinitialize_posix_glob=' 733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test "$posix_glob" != "?" || { 743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if (set -f) 2>/dev/null; then 753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev posix_glob= 763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev posix_glob=: 783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev' 813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevposix_mkdir= 833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Desired mode of installed file. 853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevmode=0755 863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevchgrpcmd= 883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevchmodcmd=$chmodprog 893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevchowncmd= 903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevmvcmd=$mvprog 913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevrmcmd="$rmprog -f" 923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstripcmd= 933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevsrc= 953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevdst= 963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevdir_arg= 973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevdst_arg= 983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevcopy_on_change=false 1003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevno_target_directory= 1013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevusage="\ 1033aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 1043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev or: $0 [OPTION]... SRCFILES... DIRECTORY 1053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev or: $0 [OPTION]... -t DIRECTORY SRCFILES... 1063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev or: $0 [OPTION]... -d DIRECTORIES... 1073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1083aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevIn the 1st form, copy SRCFILE to DSTFILE. 1093aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 1103aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevIn the 4th, create DIRECTORIES. 1113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1123aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevOptions: 1133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev --help display this help and exit. 1143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev --version display version info and exit. 1153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -c (ignored) 1173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -C install only if different (preserve the last data modification time) 1183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -d create directories instead of installing files. 1193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -g GROUP $chgrpprog installed files to GROUP. 1203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -m MODE $chmodprog installed files to MODE. 1213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -o USER $chownprog installed files to USER. 1223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -s $stripprog installed files. 1233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -t DIRECTORY install into DIRECTORY. 1243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -T report an error if DSTFILE is a directory. 1253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1263aa430dc5437a98734b36f996f9b17081a589143Yavor GoulishevEnvironment variables override the default commands: 1273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 1283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev RMPROG STRIPPROG 1293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev" 1303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevwhile test $# -ne 0; do 1323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $1 in 1333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -c) ;; 1343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -C) copy_on_change=true;; 1363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -d) dir_arg=true;; 1383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -g) chgrpcmd="$chgrpprog $2" 1403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift;; 1413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev --help) echo "$usage"; exit $?;; 1433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -m) mode=$2 1453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $mode in 1463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *' '* | *' '* | *' 1473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev'* | *'*'* | *'?'* | *'['*) 1483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev echo "$0: invalid mode: $mode" >&2 1493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit 1;; 1503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 1513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift;; 1523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -o) chowncmd="$chownprog $2" 1543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift;; 1553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -s) stripcmd=$stripprog;; 1573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -t) dst_arg=$2 1593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift;; 1603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -T) no_target_directory=true;; 1623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev --version) echo "$0 $scriptversion"; exit $?;; 1643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev --) shift 1663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev break;; 1673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -*) echo "$0: invalid option: $1" >&2 1693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit 1;; 1703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *) break;; 1723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 1733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift 1743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevdone 1753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 1773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # When -d is used, all remaining arguments are directories to create. 1783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # When -t is used, the destination is already specified. 1793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Otherwise, the last argument is the destination. Remove it from $@. 1803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev for arg 1813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev do 1823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -n "$dst_arg"; then 1833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # $@ is not empty: it contains at least $arg. 1843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev set fnord "$@" "$dst_arg" 1853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift # fnord 1863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 1873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift # arg 1883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dst_arg=$arg 1893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev done 1903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi 1913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test $# -eq 0; then 1933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -z "$dir_arg"; then 1943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev echo "$0: no input file specified." >&2 1953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit 1 1963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 1973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # It's OK to call `install-sh -d' without argument. 1983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # This can happen when creating conditional directories. 1993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit 0 2003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi 2013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevif test -z "$dir_arg"; then 2033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev trap '(exit $?); exit' 1 2 13 15 2043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Set umask so as not to create temps with too-generous modes. 2063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # However, 'strip' requires both read and write access to temps. 2073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $mode in 2083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Optimize common cases. 2093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *644) cp_umask=133;; 2103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *755) cp_umask=22;; 2113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *[0-7]) 2133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -z "$stripcmd"; then 2143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev u_plus_rw= 2153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 2163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev u_plus_rw='% 200' 2173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 2183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *) 2203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -z "$stripcmd"; then 2213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev u_plus_rw= 2223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 2233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev u_plus_rw=,u+rw 2243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 2253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev cp_umask=$mode$u_plus_rw;; 2263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 2273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfi 2283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevfor src 2303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevdo 2313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Protect names starting with `-'. 2323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $src in 2333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -*) src=./$src;; 2343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 2353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -n "$dir_arg"; then 2373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dst=$src 2383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dstdir=$dst 2393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test -d "$dstdir" 2403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dstdir_status=$? 2413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 2423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 2443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # might cause directories to be created, which would be especially bad 2453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # if $src (and thus $dsttmp) contains '*'. 2463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test ! -f "$src" && test ! -d "$src"; then 2473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev echo "$0: $src does not exist." >&2 2483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit 1 2493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 2503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -z "$dst_arg"; then 2523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev echo "$0: no destination specified." >&2 2533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit 1 2543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 2553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dst=$dst_arg 2573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Protect names starting with `-'. 2583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $dst in 2593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -*) dst=./$dst;; 2603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 2613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 2623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # If destination is a directory, append the input filename; won't work 2633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # if double slashes aren't ignored. 2643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -d "$dst"; then 2653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -n "$no_target_directory"; then 2663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev echo "$0: $dst_arg: Is a directory" >&2 2673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit 1 2683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 2693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dstdir=$dst 2703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dst=$dstdir/`basename "$src"` 2713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dstdir_status=0 2723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 2733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Prefer dirname, but fall back on a substitute if dirname fails. 2743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dstdir=` 2753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev (dirname "$dst") 2>/dev/null || 2763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 2773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev X"$dst" : 'X\(//\)[^/]' \| \ 2783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev X"$dst" : 'X\(//\)$' \| \ 2793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev X"$dst" : 'X\(/\)' \| . 2>/dev/null || 2803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev echo X"$dst" | 2813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 2823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev s//\1/ 2833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev q 2843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 2853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev /^X\(\/\/\)[^/].*/{ 2863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev s//\1/ 2873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev q 2883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 2893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev /^X\(\/\/\)$/{ 2903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev s//\1/ 2913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev q 2923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 2933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev /^X\(\/\).*/{ 2943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev s//\1/ 2953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev q 2963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 2973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev s/.*/./; q' 2983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ` 2993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test -d "$dstdir" 3013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dstdir_status=$? 3023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 3033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 3043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev obsolete_mkdir_used=false 3063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test $dstdir_status != 0; then 3083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $posix_mkdir in 3093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev '') 3103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Create intermediate dirs using mode 755 as modified by the umask. 3113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # This is like FreeBSD 'install' as of 1997-10-28. 3123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev umask=`umask` 3133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $stripcmd.$umask in 3143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Optimize common cases. 3153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *[2367][2367]) mkdir_umask=$umask;; 3163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 3173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *[0-7]) 3193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev mkdir_umask=`expr $umask + 22 \ 3203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev - $umask % 100 % 40 + $umask % 20 \ 3213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev - $umask % 10 % 4 + $umask % 2 3223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev `;; 3233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *) mkdir_umask=$umask,go-w;; 3243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 3253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # With -d, create the new directory with the user-specified mode. 3273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Otherwise, rely on $mkdir_umask. 3283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -n "$dir_arg"; then 3293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev mkdir_mode=-m$mode 3303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 3313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev mkdir_mode= 3323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 3333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev posix_mkdir=false 3353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $umask in 3363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *[123567][0-7][0-7]) 3373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # POSIX mkdir -p sets u+wx bits regardless of umask, which 3383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 3393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ;; 3403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *) 3413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 3433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if (umask $mkdir_umask && 3453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 3463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev then 3473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -z "$dir_arg" || { 3483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Check for POSIX incompatibilities with -m. 3493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 3503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # other-writeable bit of parent directory when it shouldn't. 3513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ls_ld_tmpdir=`ls -ld "$tmpdir"` 3533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $ls_ld_tmpdir in 3543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev d????-?r-*) different_mode=700;; 3553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev d????-?--*) different_mode=755;; 3563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *) false;; 3573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac && 3583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $mkdirprog -m$different_mode -p -- "$tmpdir" && { 3593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 3603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 3623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 3633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev then posix_mkdir=: 3643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 3653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev rmdir "$tmpdir/d" "$tmpdir" 3663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 3673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Remove any dirs left behind by ancient mkdir implementations. 3683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 3693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 3703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev trap '' 0;; 3713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac;; 3723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 3733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if 3753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $posix_mkdir && ( 3763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev umask $mkdir_umask && 3773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ) 3793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev then : 3803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 3813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # The umask is ridiculous, or mkdir does not conform to POSIX, 3833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # or it failed possibly due to a race condition. Create the 3843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # directory the slow way, step by step, checking for races as we go. 3853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $dstdir in 3873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev /*) prefix='/';; 3883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev -*) prefix='./';; 3893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *) prefix='';; 3903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 3913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev eval "$initialize_posix_glob" 3933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 3943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev oIFS=$IFS 3953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev IFS=/ 3963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $posix_glob set -f 3973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev set fnord $dstdir 3983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev shift 3993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $posix_glob set +f 4003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev IFS=$oIFS 4013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev prefixes= 4033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev for d 4053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev do 4063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test -z "$d" && continue 4073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev prefix=$prefix$d 4093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -d "$prefix"; then 4103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev prefixes= 4113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 4123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if $posix_mkdir; then 4133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev (umask=$mkdir_umask && 4143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 4153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Don't fail if two instances are running concurrently. 4163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test -d "$prefix" || exit 1 4173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 4183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case $prefix in 4193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 4203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *) qprefix=$prefix;; 4213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev esac 4223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev prefixes="$prefixes '$qprefix'" 4233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 4243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 4253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev prefix=$prefix/ 4263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev done 4273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -n "$prefixes"; then 4293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Don't fail if two instances are running concurrently. 4303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev (umask $mkdir_umask && 4313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev eval "\$doit_exec \$mkdirprog $prefixes") || 4323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test -d "$dstdir" || exit 1 4333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev obsolete_mkdir_used=true 4343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 4353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 4363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 4373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if test -n "$dir_arg"; then 4393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 4433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 4443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Make a couple of temp file names in the proper directory. 4463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dsttmp=$dstdir/_inst.$$_ 4473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev rmtmp=$dstdir/_rm.$$_ 4483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Trap to clean up those temp files at exit. 4503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 4513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Copy the file name to the temp name. 4533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 4543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # and set any options; do chmod last to preserve setuid bits. 4563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # 4573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # If any of these fail, we abort the whole thing. If we want to 4583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # ignore errors from any of these, just make sure not to ignore 4593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # errors from the above "$doit $cpprog $src $dsttmp" command. 4603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # 4613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 4623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 4633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 4643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 4653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # If -C, don't bother to copy if it wouldn't change the file. 4673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if $copy_on_change && 4683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 4693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 4703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev eval "$initialize_posix_glob" && 4723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $posix_glob set -f && 4733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev set X $old && old=:$2:$4:$5:$6 && 4743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev set X $new && new=:$2:$4:$5:$6 && 4753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $posix_glob set +f && 4763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test "$old" = "$new" && 4783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 4793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev then 4803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev rm -f "$dsttmp" 4813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else 4823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Rename the file to the real destination. 4833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 4843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 4853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # The rename failed, perhaps because mv can't rename something else 4863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # to itself, or perhaps because mv is so ancient that it does not 4873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # support -f. 4883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { 4893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Now remove or move aside any old file at destination location. 4903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # We try this two ways since rm can't unlink itself on some 4913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # systems and the destination file might be busy for other 4923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # reasons. In this case, the final cleanup might fail but the new 4933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # file should still install successfully. 4943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { 4953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev test ! -f "$dst" || 4963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $doit $rmcmd -f "$dst" 2>/dev/null || 4973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 4983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 4993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } || 5003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev { echo "$0: cannot unlink or rename $dst" >&2 5013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev (exit 1); exit 1 5023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 5033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } && 5043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 5053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev # Now rename the file to the real destination. 5063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev $doit $mvcmd "$dsttmp" "$dst" 5073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 5083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi || exit 1 5093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 5103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev trap '' 0 5113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fi 5123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevdone 5133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 5143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# Local variables: 5153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# eval: (add-hook 'write-file-hooks 'time-stamp) 5163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# time-stamp-start: "scriptversion=" 5173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# time-stamp-format: "%:y-%02m-%02d.%02H" 5183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# time-stamp-time-zone: "UTC" 5193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# time-stamp-end: "; # UTC" 5203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev# End: 521