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