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