1ca236e63SDag-Erling Smørgrav#!/bin/sh 2ca236e63SDag-Erling Smørgrav# install - install a program, script, or datafile 3b33ab329SDag-Erling Smørgrav 4*ce77a8d6SDag-Erling Smørgravscriptversion=2011-11-20.07; # UTC 5b33ab329SDag-Erling Smørgrav 6b33ab329SDag-Erling Smørgrav# This originates from X11R5 (mit/util/scripts/install.sh), which was 7b33ab329SDag-Erling Smørgrav# later released in X11R6 (xc/config/util/install.sh) with the 8b33ab329SDag-Erling Smørgrav# following copyright and license. 9ca236e63SDag-Erling Smørgrav# 10b33ab329SDag-Erling Smørgrav# Copyright (C) 1994 X Consortium 11ca236e63SDag-Erling Smørgrav# 12b33ab329SDag-Erling Smørgrav# Permission is hereby granted, free of charge, to any person obtaining a copy 13b33ab329SDag-Erling Smørgrav# of this software and associated documentation files (the "Software"), to 14b33ab329SDag-Erling Smørgrav# deal in the Software without restriction, including without limitation the 15b33ab329SDag-Erling Smørgrav# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16b33ab329SDag-Erling Smørgrav# sell copies of the Software, and to permit persons to whom the Software is 17b33ab329SDag-Erling Smørgrav# furnished to do so, subject to the following conditions: 18b33ab329SDag-Erling Smørgrav# 19b33ab329SDag-Erling Smørgrav# The above copyright notice and this permission notice shall be included in 20b33ab329SDag-Erling Smørgrav# all copies or substantial portions of the Software. 21b33ab329SDag-Erling Smørgrav# 22b33ab329SDag-Erling Smørgrav# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23b33ab329SDag-Erling Smørgrav# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24b33ab329SDag-Erling Smørgrav# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25b33ab329SDag-Erling Smørgrav# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26b33ab329SDag-Erling Smørgrav# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27b33ab329SDag-Erling Smørgrav# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28b33ab329SDag-Erling Smørgrav# 29b33ab329SDag-Erling Smørgrav# Except as contained in this notice, the name of the X Consortium shall not 30b33ab329SDag-Erling Smørgrav# be used in advertising or otherwise to promote the sale, use or other deal- 31b33ab329SDag-Erling Smørgrav# ings in this Software without prior written authorization from the X Consor- 32b33ab329SDag-Erling Smørgrav# tium. 33b33ab329SDag-Erling Smørgrav# 34b33ab329SDag-Erling Smørgrav# 35b33ab329SDag-Erling Smørgrav# FSF changes to this file are in the public domain. 36ca236e63SDag-Erling Smørgrav# 37ca236e63SDag-Erling Smørgrav# Calling this script install-sh is preferred over install.sh, to prevent 38*ce77a8d6SDag-Erling Smørgrav# 'make' implicit rules from creating a file called install from it 39ca236e63SDag-Erling Smørgrav# when there is no Makefile. 40ca236e63SDag-Erling Smørgrav# 41ca236e63SDag-Erling Smørgrav# This script is compatible with the BSD install script, but was written 427f106882SDag-Erling Smørgrav# from scratch. 437f106882SDag-Erling Smørgrav 447f106882SDag-Erling Smørgravnl=' 457f106882SDag-Erling Smørgrav' 467f106882SDag-Erling SmørgravIFS=" "" $nl" 47ca236e63SDag-Erling Smørgrav 48ca236e63SDag-Erling Smørgrav# set DOITPROG to echo to test this script 49ca236e63SDag-Erling Smørgrav 50ca236e63SDag-Erling Smørgrav# Don't use :- since 4.3BSD and earlier shells don't like it. 517f106882SDag-Erling Smørgravdoit=${DOITPROG-} 527f106882SDag-Erling Smørgravif test -z "$doit"; then 537f106882SDag-Erling Smørgrav doit_exec=exec 547f106882SDag-Erling Smørgravelse 557f106882SDag-Erling Smørgrav doit_exec=$doit 567f106882SDag-Erling Smørgravfi 57ca236e63SDag-Erling Smørgrav 587f106882SDag-Erling Smørgrav# Put in absolute file names if you don't have them in your path; 597f106882SDag-Erling Smørgrav# or use environment vars. 60ca236e63SDag-Erling Smørgrav 617f106882SDag-Erling Smørgravchgrpprog=${CHGRPPROG-chgrp} 627f106882SDag-Erling Smørgravchmodprog=${CHMODPROG-chmod} 637f106882SDag-Erling Smørgravchownprog=${CHOWNPROG-chown} 647f106882SDag-Erling Smørgravcmpprog=${CMPPROG-cmp} 657f106882SDag-Erling Smørgravcpprog=${CPPROG-cp} 667f106882SDag-Erling Smørgravmkdirprog=${MKDIRPROG-mkdir} 677f106882SDag-Erling Smørgravmvprog=${MVPROG-mv} 687f106882SDag-Erling Smørgravrmprog=${RMPROG-rm} 697f106882SDag-Erling Smørgravstripprog=${STRIPPROG-strip} 70ca236e63SDag-Erling Smørgrav 717f106882SDag-Erling Smørgravposix_glob='?' 727f106882SDag-Erling Smørgravinitialize_posix_glob=' 737f106882SDag-Erling Smørgrav test "$posix_glob" != "?" || { 747f106882SDag-Erling Smørgrav if (set -f) 2>/dev/null; then 757f106882SDag-Erling Smørgrav posix_glob= 767f106882SDag-Erling Smørgrav else 777f106882SDag-Erling Smørgrav posix_glob=: 787f106882SDag-Erling Smørgrav fi 797f106882SDag-Erling Smørgrav } 807f106882SDag-Erling Smørgrav' 817f106882SDag-Erling Smørgrav 827f106882SDag-Erling Smørgravposix_mkdir= 837f106882SDag-Erling Smørgrav 847f106882SDag-Erling Smørgrav# Desired mode of installed file. 857f106882SDag-Erling Smørgravmode=0755 867f106882SDag-Erling Smørgrav 87b33ab329SDag-Erling Smørgravchgrpcmd= 887f106882SDag-Erling Smørgravchmodcmd=$chmodprog 897f106882SDag-Erling Smørgravchowncmd= 907f106882SDag-Erling Smørgravmvcmd=$mvprog 91ca236e63SDag-Erling Smørgravrmcmd="$rmprog -f" 927f106882SDag-Erling Smørgravstripcmd= 937f106882SDag-Erling Smørgrav 94b33ab329SDag-Erling Smørgravsrc= 95b33ab329SDag-Erling Smørgravdst= 96b33ab329SDag-Erling Smørgravdir_arg= 977f106882SDag-Erling Smørgravdst_arg= 987f106882SDag-Erling Smørgrav 997f106882SDag-Erling Smørgravcopy_on_change=false 100fe980754SDag-Erling Smørgravno_target_directory= 101ca236e63SDag-Erling Smørgrav 1027f106882SDag-Erling Smørgravusage="\ 1037f106882SDag-Erling SmørgravUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104b33ab329SDag-Erling Smørgrav or: $0 [OPTION]... SRCFILES... DIRECTORY 105fe980754SDag-Erling Smørgrav or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106fe980754SDag-Erling Smørgrav or: $0 [OPTION]... -d DIRECTORIES... 107b33ab329SDag-Erling Smørgrav 108fe980754SDag-Erling SmørgravIn the 1st form, copy SRCFILE to DSTFILE. 109fe980754SDag-Erling SmørgravIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110fe980754SDag-Erling SmørgravIn the 4th, create DIRECTORIES. 111b33ab329SDag-Erling Smørgrav 112b33ab329SDag-Erling SmørgravOptions: 1137f106882SDag-Erling Smørgrav --help display this help and exit. 1147f106882SDag-Erling Smørgrav --version display version info and exit. 1157f106882SDag-Erling Smørgrav 116fe980754SDag-Erling Smørgrav -c (ignored) 1177f106882SDag-Erling Smørgrav -C install only if different (preserve the last data modification time) 118b33ab329SDag-Erling Smørgrav -d create directories instead of installing files. 119fe980754SDag-Erling Smørgrav -g GROUP $chgrpprog installed files to GROUP. 120fe980754SDag-Erling Smørgrav -m MODE $chmodprog installed files to MODE. 121fe980754SDag-Erling Smørgrav -o USER $chownprog installed files to USER. 122fe980754SDag-Erling Smørgrav -s $stripprog installed files. 123fe980754SDag-Erling Smørgrav -t DIRECTORY install into DIRECTORY. 124fe980754SDag-Erling Smørgrav -T report an error if DSTFILE is a directory. 125b33ab329SDag-Erling Smørgrav 126b33ab329SDag-Erling SmørgravEnvironment variables override the default commands: 1277f106882SDag-Erling Smørgrav CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 1287f106882SDag-Erling Smørgrav RMPROG STRIPPROG 129b33ab329SDag-Erling Smørgrav" 130b33ab329SDag-Erling Smørgrav 1317f106882SDag-Erling Smørgravwhile test $# -ne 0; do 132ca236e63SDag-Erling Smørgrav case $1 in 1337f106882SDag-Erling Smørgrav -c) ;; 134ca236e63SDag-Erling Smørgrav 1357f106882SDag-Erling Smørgrav -C) copy_on_change=true;; 1367f106882SDag-Erling Smørgrav 1377f106882SDag-Erling Smørgrav -d) dir_arg=true;; 138ca236e63SDag-Erling Smørgrav 139b33ab329SDag-Erling Smørgrav -g) chgrpcmd="$chgrpprog $2" 1407f106882SDag-Erling Smørgrav shift;; 141b33ab329SDag-Erling Smørgrav 142fe980754SDag-Erling Smørgrav --help) echo "$usage"; exit $?;; 143b33ab329SDag-Erling Smørgrav 1447f106882SDag-Erling Smørgrav -m) mode=$2 1457f106882SDag-Erling Smørgrav case $mode in 1467f106882SDag-Erling Smørgrav *' '* | *' '* | *' 1477f106882SDag-Erling Smørgrav'* | *'*'* | *'?'* | *'['*) 1487f106882SDag-Erling Smørgrav echo "$0: invalid mode: $mode" >&2 1497f106882SDag-Erling Smørgrav exit 1;; 1507f106882SDag-Erling Smørgrav esac 1517f106882SDag-Erling Smørgrav shift;; 152ca236e63SDag-Erling Smørgrav 153ca236e63SDag-Erling Smørgrav -o) chowncmd="$chownprog $2" 1547f106882SDag-Erling Smørgrav shift;; 155ca236e63SDag-Erling Smørgrav 1567f106882SDag-Erling Smørgrav -s) stripcmd=$stripprog;; 157ca236e63SDag-Erling Smørgrav 1587f106882SDag-Erling Smørgrav -t) dst_arg=$2 159*ce77a8d6SDag-Erling Smørgrav # Protect names problematic for 'test' and other utilities. 160*ce77a8d6SDag-Erling Smørgrav case $dst_arg in 161*ce77a8d6SDag-Erling Smørgrav -* | [=\(\)!]) dst_arg=./$dst_arg;; 162*ce77a8d6SDag-Erling Smørgrav esac 1637f106882SDag-Erling Smørgrav shift;; 164ca236e63SDag-Erling Smørgrav 1657f106882SDag-Erling Smørgrav -T) no_target_directory=true;; 166fe980754SDag-Erling Smørgrav 167fe980754SDag-Erling Smørgrav --version) echo "$0 $scriptversion"; exit $?;; 168ca236e63SDag-Erling Smørgrav 1697f106882SDag-Erling Smørgrav --) shift 1707f106882SDag-Erling Smørgrav break;; 1717f106882SDag-Erling Smørgrav 1727f106882SDag-Erling Smørgrav -*) echo "$0: invalid option: $1" >&2 1737f106882SDag-Erling Smørgrav exit 1;; 1747f106882SDag-Erling Smørgrav 1757f106882SDag-Erling Smørgrav *) break;; 1767f106882SDag-Erling Smørgrav esac 1777f106882SDag-Erling Smørgrav shift 1787f106882SDag-Erling Smørgravdone 1797f106882SDag-Erling Smørgrav 1807f106882SDag-Erling Smørgravif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 1817f106882SDag-Erling Smørgrav # When -d is used, all remaining arguments are directories to create. 182fe980754SDag-Erling Smørgrav # When -t is used, the destination is already specified. 183b33ab329SDag-Erling Smørgrav # Otherwise, the last argument is the destination. Remove it from $@. 184b33ab329SDag-Erling Smørgrav for arg 185b33ab329SDag-Erling Smørgrav do 1867f106882SDag-Erling Smørgrav if test -n "$dst_arg"; then 187b33ab329SDag-Erling Smørgrav # $@ is not empty: it contains at least $arg. 1887f106882SDag-Erling Smørgrav set fnord "$@" "$dst_arg" 189b33ab329SDag-Erling Smørgrav shift # fnord 190ca236e63SDag-Erling Smørgrav fi 191b33ab329SDag-Erling Smørgrav shift # arg 1927f106882SDag-Erling Smørgrav dst_arg=$arg 193*ce77a8d6SDag-Erling Smørgrav # Protect names problematic for 'test' and other utilities. 194*ce77a8d6SDag-Erling Smørgrav case $dst_arg in 195*ce77a8d6SDag-Erling Smørgrav -* | [=\(\)!]) dst_arg=./$dst_arg;; 196*ce77a8d6SDag-Erling Smørgrav esac 197b33ab329SDag-Erling Smørgrav done 1987f106882SDag-Erling Smørgravfi 199ca236e63SDag-Erling Smørgrav 2007f106882SDag-Erling Smørgravif test $# -eq 0; then 201b33ab329SDag-Erling Smørgrav if test -z "$dir_arg"; then 202b33ab329SDag-Erling Smørgrav echo "$0: no input file specified." >&2 203ca236e63SDag-Erling Smørgrav exit 1 204b33ab329SDag-Erling Smørgrav fi 205*ce77a8d6SDag-Erling Smørgrav # It's OK to call 'install-sh -d' without argument. 206b33ab329SDag-Erling Smørgrav # This can happen when creating conditional directories. 207b33ab329SDag-Erling Smørgrav exit 0 208ca236e63SDag-Erling Smørgravfi 209ca236e63SDag-Erling Smørgrav 2107f106882SDag-Erling Smørgravif test -z "$dir_arg"; then 211*ce77a8d6SDag-Erling Smørgrav do_exit='(exit $ret); exit $ret' 212*ce77a8d6SDag-Erling Smørgrav trap "ret=129; $do_exit" 1 213*ce77a8d6SDag-Erling Smørgrav trap "ret=130; $do_exit" 2 214*ce77a8d6SDag-Erling Smørgrav trap "ret=141; $do_exit" 13 215*ce77a8d6SDag-Erling Smørgrav trap "ret=143; $do_exit" 15 2167f106882SDag-Erling Smørgrav 2177f106882SDag-Erling Smørgrav # Set umask so as not to create temps with too-generous modes. 2187f106882SDag-Erling Smørgrav # However, 'strip' requires both read and write access to temps. 2197f106882SDag-Erling Smørgrav case $mode in 2207f106882SDag-Erling Smørgrav # Optimize common cases. 2217f106882SDag-Erling Smørgrav *644) cp_umask=133;; 2227f106882SDag-Erling Smørgrav *755) cp_umask=22;; 2237f106882SDag-Erling Smørgrav 2247f106882SDag-Erling Smørgrav *[0-7]) 2257f106882SDag-Erling Smørgrav if test -z "$stripcmd"; then 2267f106882SDag-Erling Smørgrav u_plus_rw= 2277f106882SDag-Erling Smørgrav else 2287f106882SDag-Erling Smørgrav u_plus_rw='% 200' 2297f106882SDag-Erling Smørgrav fi 2307f106882SDag-Erling Smørgrav cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 2317f106882SDag-Erling Smørgrav *) 2327f106882SDag-Erling Smørgrav if test -z "$stripcmd"; then 2337f106882SDag-Erling Smørgrav u_plus_rw= 2347f106882SDag-Erling Smørgrav else 2357f106882SDag-Erling Smørgrav u_plus_rw=,u+rw 2367f106882SDag-Erling Smørgrav fi 2377f106882SDag-Erling Smørgrav cp_umask=$mode$u_plus_rw;; 2387f106882SDag-Erling Smørgrav esac 2397f106882SDag-Erling Smørgravfi 2407f106882SDag-Erling Smørgrav 241b33ab329SDag-Erling Smørgravfor src 242b33ab329SDag-Erling Smørgravdo 243*ce77a8d6SDag-Erling Smørgrav # Protect names problematic for 'test' and other utilities. 244b33ab329SDag-Erling Smørgrav case $src in 245*ce77a8d6SDag-Erling Smørgrav -* | [=\(\)!]) src=./$src;; 246b33ab329SDag-Erling Smørgrav esac 247b33ab329SDag-Erling Smørgrav 248b33ab329SDag-Erling Smørgrav if test -n "$dir_arg"; then 249ca236e63SDag-Erling Smørgrav dst=$src 2507f106882SDag-Erling Smørgrav dstdir=$dst 2517f106882SDag-Erling Smørgrav test -d "$dstdir" 2527f106882SDag-Erling Smørgrav dstdir_status=$? 2537f106882SDag-Erling Smørgrav else 254ca236e63SDag-Erling Smørgrav 255fe980754SDag-Erling Smørgrav # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 256ca236e63SDag-Erling Smørgrav # might cause directories to be created, which would be especially bad 257ca236e63SDag-Erling Smørgrav # if $src (and thus $dsttmp) contains '*'. 258b33ab329SDag-Erling Smørgrav if test ! -f "$src" && test ! -d "$src"; then 259b33ab329SDag-Erling Smørgrav echo "$0: $src does not exist." >&2 260ca236e63SDag-Erling Smørgrav exit 1 261ca236e63SDag-Erling Smørgrav fi 262ca236e63SDag-Erling Smørgrav 2637f106882SDag-Erling Smørgrav if test -z "$dst_arg"; then 264b33ab329SDag-Erling Smørgrav echo "$0: no destination specified." >&2 265ca236e63SDag-Erling Smørgrav exit 1 266ca236e63SDag-Erling Smørgrav fi 2677f106882SDag-Erling Smørgrav dst=$dst_arg 268ca236e63SDag-Erling Smørgrav 269b33ab329SDag-Erling Smørgrav # If destination is a directory, append the input filename; won't work 270b33ab329SDag-Erling Smørgrav # if double slashes aren't ignored. 271b33ab329SDag-Erling Smørgrav if test -d "$dst"; then 272fe980754SDag-Erling Smørgrav if test -n "$no_target_directory"; then 2737f106882SDag-Erling Smørgrav echo "$0: $dst_arg: Is a directory" >&2 274fe980754SDag-Erling Smørgrav exit 1 275fe980754SDag-Erling Smørgrav fi 2767f106882SDag-Erling Smørgrav dstdir=$dst 2777f106882SDag-Erling Smørgrav dst=$dstdir/`basename "$src"` 2787f106882SDag-Erling Smørgrav dstdir_status=0 2797f106882SDag-Erling Smørgrav else 2807f106882SDag-Erling Smørgrav # Prefer dirname, but fall back on a substitute if dirname fails. 2817f106882SDag-Erling Smørgrav dstdir=` 2827f106882SDag-Erling Smørgrav (dirname "$dst") 2>/dev/null || 2837f106882SDag-Erling Smørgrav expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 2847f106882SDag-Erling Smørgrav X"$dst" : 'X\(//\)[^/]' \| \ 2857f106882SDag-Erling Smørgrav X"$dst" : 'X\(//\)$' \| \ 2867f106882SDag-Erling Smørgrav X"$dst" : 'X\(/\)' \| . 2>/dev/null || 2877f106882SDag-Erling Smørgrav echo X"$dst" | 2887f106882SDag-Erling Smørgrav sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 2897f106882SDag-Erling Smørgrav s//\1/ 2907f106882SDag-Erling Smørgrav q 2917f106882SDag-Erling Smørgrav } 2927f106882SDag-Erling Smørgrav /^X\(\/\/\)[^/].*/{ 2937f106882SDag-Erling Smørgrav s//\1/ 2947f106882SDag-Erling Smørgrav q 2957f106882SDag-Erling Smørgrav } 2967f106882SDag-Erling Smørgrav /^X\(\/\/\)$/{ 2977f106882SDag-Erling Smørgrav s//\1/ 2987f106882SDag-Erling Smørgrav q 2997f106882SDag-Erling Smørgrav } 3007f106882SDag-Erling Smørgrav /^X\(\/\).*/{ 3017f106882SDag-Erling Smørgrav s//\1/ 3027f106882SDag-Erling Smørgrav q 3037f106882SDag-Erling Smørgrav } 3047f106882SDag-Erling Smørgrav s/.*/./; q' 3057f106882SDag-Erling Smørgrav ` 3067f106882SDag-Erling Smørgrav 3077f106882SDag-Erling Smørgrav test -d "$dstdir" 3087f106882SDag-Erling Smørgrav dstdir_status=$? 309ca236e63SDag-Erling Smørgrav fi 310ca236e63SDag-Erling Smørgrav fi 311ca236e63SDag-Erling Smørgrav 3127f106882SDag-Erling Smørgrav obsolete_mkdir_used=false 313ca236e63SDag-Erling Smørgrav 3147f106882SDag-Erling Smørgrav if test $dstdir_status != 0; then 3157f106882SDag-Erling Smørgrav case $posix_mkdir in 3167f106882SDag-Erling Smørgrav '') 3177f106882SDag-Erling Smørgrav # Create intermediate dirs using mode 755 as modified by the umask. 3187f106882SDag-Erling Smørgrav # This is like FreeBSD 'install' as of 1997-10-28. 3197f106882SDag-Erling Smørgrav umask=`umask` 3207f106882SDag-Erling Smørgrav case $stripcmd.$umask in 3217f106882SDag-Erling Smørgrav # Optimize common cases. 3227f106882SDag-Erling Smørgrav *[2367][2367]) mkdir_umask=$umask;; 3237f106882SDag-Erling Smørgrav .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 324ca236e63SDag-Erling Smørgrav 3257f106882SDag-Erling Smørgrav *[0-7]) 3267f106882SDag-Erling Smørgrav mkdir_umask=`expr $umask + 22 \ 3277f106882SDag-Erling Smørgrav - $umask % 100 % 40 + $umask % 20 \ 3287f106882SDag-Erling Smørgrav - $umask % 10 % 4 + $umask % 2 3297f106882SDag-Erling Smørgrav `;; 3307f106882SDag-Erling Smørgrav *) mkdir_umask=$umask,go-w;; 3317f106882SDag-Erling Smørgrav esac 3327f106882SDag-Erling Smørgrav 3337f106882SDag-Erling Smørgrav # With -d, create the new directory with the user-specified mode. 3347f106882SDag-Erling Smørgrav # Otherwise, rely on $mkdir_umask. 3357f106882SDag-Erling Smørgrav if test -n "$dir_arg"; then 3367f106882SDag-Erling Smørgrav mkdir_mode=-m$mode 3377f106882SDag-Erling Smørgrav else 3387f106882SDag-Erling Smørgrav mkdir_mode= 3397f106882SDag-Erling Smørgrav fi 3407f106882SDag-Erling Smørgrav 3417f106882SDag-Erling Smørgrav posix_mkdir=false 3427f106882SDag-Erling Smørgrav case $umask in 3437f106882SDag-Erling Smørgrav *[123567][0-7][0-7]) 3447f106882SDag-Erling Smørgrav # POSIX mkdir -p sets u+wx bits regardless of umask, which 3457f106882SDag-Erling Smørgrav # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 3467f106882SDag-Erling Smørgrav ;; 3477f106882SDag-Erling Smørgrav *) 3487f106882SDag-Erling Smørgrav tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 3497f106882SDag-Erling Smørgrav trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 3507f106882SDag-Erling Smørgrav 3517f106882SDag-Erling Smørgrav if (umask $mkdir_umask && 3527f106882SDag-Erling Smørgrav exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 3537f106882SDag-Erling Smørgrav then 3547f106882SDag-Erling Smørgrav if test -z "$dir_arg" || { 3557f106882SDag-Erling Smørgrav # Check for POSIX incompatibilities with -m. 3567f106882SDag-Erling Smørgrav # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 357*ce77a8d6SDag-Erling Smørgrav # other-writable bit of parent directory when it shouldn't. 3587f106882SDag-Erling Smørgrav # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 3597f106882SDag-Erling Smørgrav ls_ld_tmpdir=`ls -ld "$tmpdir"` 3607f106882SDag-Erling Smørgrav case $ls_ld_tmpdir in 3617f106882SDag-Erling Smørgrav d????-?r-*) different_mode=700;; 3627f106882SDag-Erling Smørgrav d????-?--*) different_mode=755;; 3637f106882SDag-Erling Smørgrav *) false;; 3647f106882SDag-Erling Smørgrav esac && 3657f106882SDag-Erling Smørgrav $mkdirprog -m$different_mode -p -- "$tmpdir" && { 3667f106882SDag-Erling Smørgrav ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 3677f106882SDag-Erling Smørgrav test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 3687f106882SDag-Erling Smørgrav } 3697f106882SDag-Erling Smørgrav } 3707f106882SDag-Erling Smørgrav then posix_mkdir=: 3717f106882SDag-Erling Smørgrav fi 3727f106882SDag-Erling Smørgrav rmdir "$tmpdir/d" "$tmpdir" 3737f106882SDag-Erling Smørgrav else 3747f106882SDag-Erling Smørgrav # Remove any dirs left behind by ancient mkdir implementations. 3757f106882SDag-Erling Smørgrav rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 3767f106882SDag-Erling Smørgrav fi 3777f106882SDag-Erling Smørgrav trap '' 0;; 3787f106882SDag-Erling Smørgrav esac;; 3797f106882SDag-Erling Smørgrav esac 3807f106882SDag-Erling Smørgrav 3817f106882SDag-Erling Smørgrav if 3827f106882SDag-Erling Smørgrav $posix_mkdir && ( 3837f106882SDag-Erling Smørgrav umask $mkdir_umask && 3847f106882SDag-Erling Smørgrav $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 3857f106882SDag-Erling Smørgrav ) 3867f106882SDag-Erling Smørgrav then : 3877f106882SDag-Erling Smørgrav else 3887f106882SDag-Erling Smørgrav 3897f106882SDag-Erling Smørgrav # The umask is ridiculous, or mkdir does not conform to POSIX, 3907f106882SDag-Erling Smørgrav # or it failed possibly due to a race condition. Create the 3917f106882SDag-Erling Smørgrav # directory the slow way, step by step, checking for races as we go. 3927f106882SDag-Erling Smørgrav 3937f106882SDag-Erling Smørgrav case $dstdir in 3947f106882SDag-Erling Smørgrav /*) prefix='/';; 395*ce77a8d6SDag-Erling Smørgrav [-=\(\)!]*) prefix='./';; 3967f106882SDag-Erling Smørgrav *) prefix='';; 3977f106882SDag-Erling Smørgrav esac 3987f106882SDag-Erling Smørgrav 3997f106882SDag-Erling Smørgrav eval "$initialize_posix_glob" 400ca236e63SDag-Erling Smørgrav 401b33ab329SDag-Erling Smørgrav oIFS=$IFS 4027f106882SDag-Erling Smørgrav IFS=/ 4037f106882SDag-Erling Smørgrav $posix_glob set -f 4047f106882SDag-Erling Smørgrav set fnord $dstdir 405fe980754SDag-Erling Smørgrav shift 4067f106882SDag-Erling Smørgrav $posix_glob set +f 407b33ab329SDag-Erling Smørgrav IFS=$oIFS 408ca236e63SDag-Erling Smørgrav 4097f106882SDag-Erling Smørgrav prefixes= 410ca236e63SDag-Erling Smørgrav 4117f106882SDag-Erling Smørgrav for d 4127f106882SDag-Erling Smørgrav do 413*ce77a8d6SDag-Erling Smørgrav test X"$d" = X && continue 4147f106882SDag-Erling Smørgrav 4157f106882SDag-Erling Smørgrav prefix=$prefix$d 4167f106882SDag-Erling Smørgrav if test -d "$prefix"; then 4177f106882SDag-Erling Smørgrav prefixes= 4187f106882SDag-Erling Smørgrav else 4197f106882SDag-Erling Smørgrav if $posix_mkdir; then 4207f106882SDag-Erling Smørgrav (umask=$mkdir_umask && 4217f106882SDag-Erling Smørgrav $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 4227f106882SDag-Erling Smørgrav # Don't fail if two instances are running concurrently. 4237f106882SDag-Erling Smørgrav test -d "$prefix" || exit 1 4247f106882SDag-Erling Smørgrav else 4257f106882SDag-Erling Smørgrav case $prefix in 4267f106882SDag-Erling Smørgrav *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 4277f106882SDag-Erling Smørgrav *) qprefix=$prefix;; 4287f106882SDag-Erling Smørgrav esac 4297f106882SDag-Erling Smørgrav prefixes="$prefixes '$qprefix'" 430ca236e63SDag-Erling Smørgrav fi 4317f106882SDag-Erling Smørgrav fi 4327f106882SDag-Erling Smørgrav prefix=$prefix/ 433ca236e63SDag-Erling Smørgrav done 4347f106882SDag-Erling Smørgrav 4357f106882SDag-Erling Smørgrav if test -n "$prefixes"; then 4367f106882SDag-Erling Smørgrav # Don't fail if two instances are running concurrently. 4377f106882SDag-Erling Smørgrav (umask $mkdir_umask && 4387f106882SDag-Erling Smørgrav eval "\$doit_exec \$mkdirprog $prefixes") || 4397f106882SDag-Erling Smørgrav test -d "$dstdir" || exit 1 4407f106882SDag-Erling Smørgrav obsolete_mkdir_used=true 4417f106882SDag-Erling Smørgrav fi 4427f106882SDag-Erling Smørgrav fi 443ca236e63SDag-Erling Smørgrav fi 444ca236e63SDag-Erling Smørgrav 445b33ab329SDag-Erling Smørgrav if test -n "$dir_arg"; then 4467f106882SDag-Erling Smørgrav { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 4477f106882SDag-Erling Smørgrav { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 4487f106882SDag-Erling Smørgrav { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 4497f106882SDag-Erling Smørgrav test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 450ca236e63SDag-Erling Smørgrav else 451ca236e63SDag-Erling Smørgrav 452b33ab329SDag-Erling Smørgrav # Make a couple of temp file names in the proper directory. 453b33ab329SDag-Erling Smørgrav dsttmp=$dstdir/_inst.$$_ 454b33ab329SDag-Erling Smørgrav rmtmp=$dstdir/_rm.$$_ 455ca236e63SDag-Erling Smørgrav 456b33ab329SDag-Erling Smørgrav # Trap to clean up those temp files at exit. 457fe980754SDag-Erling Smørgrav trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 458ca236e63SDag-Erling Smørgrav 459fe980754SDag-Erling Smørgrav # Copy the file name to the temp name. 4607f106882SDag-Erling Smørgrav (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 461ca236e63SDag-Erling Smørgrav 462b33ab329SDag-Erling Smørgrav # and set any options; do chmod last to preserve setuid bits. 463b33ab329SDag-Erling Smørgrav # 464ca236e63SDag-Erling Smørgrav # If any of these fail, we abort the whole thing. If we want to 465ca236e63SDag-Erling Smørgrav # ignore errors from any of these, just make sure not to ignore 466fe980754SDag-Erling Smørgrav # errors from the above "$doit $cpprog $src $dsttmp" command. 467b33ab329SDag-Erling Smørgrav # 4687f106882SDag-Erling Smørgrav { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 4697f106882SDag-Erling Smørgrav { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 4707f106882SDag-Erling Smørgrav { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 4717f106882SDag-Erling Smørgrav { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 472ca236e63SDag-Erling Smørgrav 4737f106882SDag-Erling Smørgrav # If -C, don't bother to copy if it wouldn't change the file. 4747f106882SDag-Erling Smørgrav if $copy_on_change && 4757f106882SDag-Erling Smørgrav old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 4767f106882SDag-Erling Smørgrav new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 4777f106882SDag-Erling Smørgrav 4787f106882SDag-Erling Smørgrav eval "$initialize_posix_glob" && 4797f106882SDag-Erling Smørgrav $posix_glob set -f && 4807f106882SDag-Erling Smørgrav set X $old && old=:$2:$4:$5:$6 && 4817f106882SDag-Erling Smørgrav set X $new && new=:$2:$4:$5:$6 && 4827f106882SDag-Erling Smørgrav $posix_glob set +f && 4837f106882SDag-Erling Smørgrav 4847f106882SDag-Erling Smørgrav test "$old" = "$new" && 4857f106882SDag-Erling Smørgrav $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 4867f106882SDag-Erling Smørgrav then 4877f106882SDag-Erling Smørgrav rm -f "$dsttmp" 4887f106882SDag-Erling Smørgrav else 4897f106882SDag-Erling Smørgrav # Rename the file to the real destination. 4907f106882SDag-Erling Smørgrav $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 4917f106882SDag-Erling Smørgrav 492b33ab329SDag-Erling Smørgrav # The rename failed, perhaps because mv can't rename something else 493b33ab329SDag-Erling Smørgrav # to itself, or perhaps because mv is so ancient that it does not 494b33ab329SDag-Erling Smørgrav # support -f. 4957f106882SDag-Erling Smørgrav { 496b33ab329SDag-Erling Smørgrav # Now remove or move aside any old file at destination location. 497b33ab329SDag-Erling Smørgrav # We try this two ways since rm can't unlink itself on some 498b33ab329SDag-Erling Smørgrav # systems and the destination file might be busy for other 499b33ab329SDag-Erling Smørgrav # reasons. In this case, the final cleanup might fail but the new 500b33ab329SDag-Erling Smørgrav # file should still install successfully. 501b33ab329SDag-Erling Smørgrav { 5027f106882SDag-Erling Smørgrav test ! -f "$dst" || 5037f106882SDag-Erling Smørgrav $doit $rmcmd -f "$dst" 2>/dev/null || 5047f106882SDag-Erling Smørgrav { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 5057f106882SDag-Erling Smørgrav { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 5067f106882SDag-Erling Smørgrav } || 5077f106882SDag-Erling Smørgrav { echo "$0: cannot unlink or rename $dst" >&2 508fe980754SDag-Erling Smørgrav (exit 1); exit 1 509b33ab329SDag-Erling Smørgrav } 510b33ab329SDag-Erling Smørgrav } && 511ca236e63SDag-Erling Smørgrav 512b33ab329SDag-Erling Smørgrav # Now rename the file to the real destination. 5137f106882SDag-Erling Smørgrav $doit $mvcmd "$dsttmp" "$dst" 514b33ab329SDag-Erling Smørgrav } 5157f106882SDag-Erling Smørgrav fi || exit 1 516ca236e63SDag-Erling Smørgrav 5177f106882SDag-Erling Smørgrav trap '' 0 5187f106882SDag-Erling Smørgrav fi 5197f106882SDag-Erling Smørgravdone 520ca236e63SDag-Erling Smørgrav 521b33ab329SDag-Erling Smørgrav# Local variables: 522b33ab329SDag-Erling Smørgrav# eval: (add-hook 'write-file-hooks 'time-stamp) 523b33ab329SDag-Erling Smørgrav# time-stamp-start: "scriptversion=" 524b33ab329SDag-Erling Smørgrav# time-stamp-format: "%:y-%02m-%02d.%02H" 5257f106882SDag-Erling Smørgrav# time-stamp-time-zone: "UTC" 5267f106882SDag-Erling Smørgrav# time-stamp-end: "; # UTC" 527b33ab329SDag-Erling Smørgrav# End: 528