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