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