Blame install-sh

Packit Service af52df
#!/bin/sh
Packit Service af52df
# install - install a program, script, or datafile
Packit Service af52df
Packit Service af52df
scriptversion=2011-11-20.07; # UTC
Packit Service af52df
Packit Service af52df
# This originates from X11R5 (mit/util/scripts/install.sh), which was
Packit Service af52df
# later released in X11R6 (xc/config/util/install.sh) with the
Packit Service af52df
# following copyright and license.
Packit Service af52df
#
Packit Service af52df
# Copyright (C) 1994 X Consortium
Packit Service af52df
#
Packit Service af52df
# Permission is hereby granted, free of charge, to any person obtaining a copy
Packit Service af52df
# of this software and associated documentation files (the "Software"), to
Packit Service af52df
# deal in the Software without restriction, including without limitation the
Packit Service af52df
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit Service af52df
# sell copies of the Software, and to permit persons to whom the Software is
Packit Service af52df
# furnished to do so, subject to the following conditions:
Packit Service af52df
#
Packit Service af52df
# The above copyright notice and this permission notice shall be included in
Packit Service af52df
# all copies or substantial portions of the Software.
Packit Service af52df
#
Packit Service af52df
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service af52df
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service af52df
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Service af52df
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Service af52df
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
Packit Service af52df
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service af52df
#
Packit Service af52df
# Except as contained in this notice, the name of the X Consortium shall not
Packit Service af52df
# be used in advertising or otherwise to promote the sale, use or other deal-
Packit Service af52df
# ings in this Software without prior written authorization from the X Consor-
Packit Service af52df
# tium.
Packit Service af52df
#
Packit Service af52df
#
Packit Service af52df
# FSF changes to this file are in the public domain.
Packit Service af52df
#
Packit Service af52df
# Calling this script install-sh is preferred over install.sh, to prevent
Packit Service af52df
# 'make' implicit rules from creating a file called install from it
Packit Service af52df
# when there is no Makefile.
Packit Service af52df
#
Packit Service af52df
# This script is compatible with the BSD install script, but was written
Packit Service af52df
# from scratch.
Packit Service af52df
Packit Service af52df
nl='
Packit Service af52df
'
Packit Service af52df
IFS=" ""	$nl"
Packit Service af52df
Packit Service af52df
# set DOITPROG to echo to test this script
Packit Service af52df
Packit Service af52df
# Don't use :- since 4.3BSD and earlier shells don't like it.
Packit Service af52df
doit=${DOITPROG-}
Packit Service af52df
if test -z "$doit"; then
Packit Service af52df
  doit_exec=exec
Packit Service af52df
else
Packit Service af52df
  doit_exec=$doit
Packit Service af52df
fi
Packit Service af52df
Packit Service af52df
# Put in absolute file names if you don't have them in your path;
Packit Service af52df
# or use environment vars.
Packit Service af52df
Packit Service af52df
chgrpprog=${CHGRPPROG-chgrp}
Packit Service af52df
chmodprog=${CHMODPROG-chmod}
Packit Service af52df
chownprog=${CHOWNPROG-chown}
Packit Service af52df
cmpprog=${CMPPROG-cmp}
Packit Service af52df
cpprog=${CPPROG-cp}
Packit Service af52df
mkdirprog=${MKDIRPROG-mkdir}
Packit Service af52df
mvprog=${MVPROG-mv}
Packit Service af52df
rmprog=${RMPROG-rm}
Packit Service af52df
stripprog=${STRIPPROG-strip}
Packit Service af52df
Packit Service af52df
posix_glob='?'
Packit Service af52df
initialize_posix_glob='
Packit Service af52df
  test "$posix_glob" != "?" || {
Packit Service af52df
    if (set -f) 2>/dev/null; then
Packit Service af52df
      posix_glob=
Packit Service af52df
    else
Packit Service af52df
      posix_glob=:
Packit Service af52df
    fi
Packit Service af52df
  }
Packit Service af52df
'
Packit Service af52df
Packit Service af52df
posix_mkdir=
Packit Service af52df
Packit Service af52df
# Desired mode of installed file.
Packit Service af52df
mode=0755
Packit Service af52df
Packit Service af52df
chgrpcmd=
Packit Service af52df
chmodcmd=$chmodprog
Packit Service af52df
chowncmd=
Packit Service af52df
mvcmd=$mvprog
Packit Service af52df
rmcmd="$rmprog -f"
Packit Service af52df
stripcmd=
Packit Service af52df
Packit Service af52df
src=
Packit Service af52df
dst=
Packit Service af52df
dir_arg=
Packit Service af52df
dst_arg=
Packit Service af52df
Packit Service af52df
copy_on_change=false
Packit Service af52df
no_target_directory=
Packit Service af52df
Packit Service af52df
usage="\
Packit Service af52df
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
Packit Service af52df
   or: $0 [OPTION]... SRCFILES... DIRECTORY
Packit Service af52df
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
Packit Service af52df
   or: $0 [OPTION]... -d DIRECTORIES...
Packit Service af52df
Packit Service af52df
In the 1st form, copy SRCFILE to DSTFILE.
Packit Service af52df
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
Packit Service af52df
In the 4th, create DIRECTORIES.
Packit Service af52df
Packit Service af52df
Options:
Packit Service af52df
     --help     display this help and exit.
Packit Service af52df
     --version  display version info and exit.
Packit Service af52df
Packit Service af52df
  -c            (ignored)
Packit Service af52df
  -C            install only if different (preserve the last data modification time)
Packit Service af52df
  -d            create directories instead of installing files.
Packit Service af52df
  -g GROUP      $chgrpprog installed files to GROUP.
Packit Service af52df
  -m MODE       $chmodprog installed files to MODE.
Packit Service af52df
  -o USER       $chownprog installed files to USER.
Packit Service af52df
  -s            $stripprog installed files.
Packit Service af52df
  -t DIRECTORY  install into DIRECTORY.
Packit Service af52df
  -T            report an error if DSTFILE is a directory.
Packit Service af52df
Packit Service af52df
Environment variables override the default commands:
Packit Service af52df
  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
Packit Service af52df
  RMPROG STRIPPROG
Packit Service af52df
"
Packit Service af52df
Packit Service af52df
while test $# -ne 0; do
Packit Service af52df
  case $1 in
Packit Service af52df
    -c) ;;
Packit Service af52df
Packit Service af52df
    -C) copy_on_change=true;;
Packit Service af52df
Packit Service af52df
    -d) dir_arg=true;;
Packit Service af52df
Packit Service af52df
    -g) chgrpcmd="$chgrpprog $2"
Packit Service af52df
	shift;;
Packit Service af52df
Packit Service af52df
    --help) echo "$usage"; exit $?;;
Packit Service af52df
Packit Service af52df
    -m) mode=$2
Packit Service af52df
	case $mode in
Packit Service af52df
	  *' '* | *'	'* | *'
Packit Service af52df
'*	  | *'*'* | *'?'* | *'['*)
Packit Service af52df
	    echo "$0: invalid mode: $mode" >&2
Packit Service af52df
	    exit 1;;
Packit Service af52df
	esac
Packit Service af52df
	shift;;
Packit Service af52df
Packit Service af52df
    -o) chowncmd="$chownprog $2"
Packit Service af52df
	shift;;
Packit Service af52df
Packit Service af52df
    -s) stripcmd=$stripprog;;
Packit Service af52df
Packit Service af52df
    -t) dst_arg=$2
Packit Service af52df
	# Protect names problematic for 'test' and other utilities.
Packit Service af52df
	case $dst_arg in
Packit Service af52df
	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit Service af52df
	esac
Packit Service af52df
	shift;;
Packit Service af52df
Packit Service af52df
    -T) no_target_directory=true;;
Packit Service af52df
Packit Service af52df
    --version) echo "$0 $scriptversion"; exit $?;;
Packit Service af52df
Packit Service af52df
    --)	shift
Packit Service af52df
	break;;
Packit Service af52df
Packit Service af52df
    -*)	echo "$0: invalid option: $1" >&2
Packit Service af52df
	exit 1;;
Packit Service af52df
Packit Service af52df
    *)  break;;
Packit Service af52df
  esac
Packit Service af52df
  shift
Packit Service af52df
done
Packit Service af52df
Packit Service af52df
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
Packit Service af52df
  # When -d is used, all remaining arguments are directories to create.
Packit Service af52df
  # When -t is used, the destination is already specified.
Packit Service af52df
  # Otherwise, the last argument is the destination.  Remove it from $@.
Packit Service af52df
  for arg
Packit Service af52df
  do
Packit Service af52df
    if test -n "$dst_arg"; then
Packit Service af52df
      # $@ is not empty: it contains at least $arg.
Packit Service af52df
      set fnord "$@" "$dst_arg"
Packit Service af52df
      shift # fnord
Packit Service af52df
    fi
Packit Service af52df
    shift # arg
Packit Service af52df
    dst_arg=$arg
Packit Service af52df
    # Protect names problematic for 'test' and other utilities.
Packit Service af52df
    case $dst_arg in
Packit Service af52df
      -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit Service af52df
    esac
Packit Service af52df
  done
Packit Service af52df
fi
Packit Service af52df
Packit Service af52df
if test $# -eq 0; then
Packit Service af52df
  if test -z "$dir_arg"; then
Packit Service af52df
    echo "$0: no input file specified." >&2
Packit Service af52df
    exit 1
Packit Service af52df
  fi
Packit Service af52df
  # It's OK to call 'install-sh -d' without argument.
Packit Service af52df
  # This can happen when creating conditional directories.
Packit Service af52df
  exit 0
Packit Service af52df
fi
Packit Service af52df
Packit Service af52df
if test -z "$dir_arg"; then
Packit Service af52df
  do_exit='(exit $ret); exit $ret'
Packit Service af52df
  trap "ret=129; $do_exit" 1
Packit Service af52df
  trap "ret=130; $do_exit" 2
Packit Service af52df
  trap "ret=141; $do_exit" 13
Packit Service af52df
  trap "ret=143; $do_exit" 15
Packit Service af52df
Packit Service af52df
  # Set umask so as not to create temps with too-generous modes.
Packit Service af52df
  # However, 'strip' requires both read and write access to temps.
Packit Service af52df
  case $mode in
Packit Service af52df
    # Optimize common cases.
Packit Service af52df
    *644) cp_umask=133;;
Packit Service af52df
    *755) cp_umask=22;;
Packit Service af52df
Packit Service af52df
    *[0-7])
Packit Service af52df
      if test -z "$stripcmd"; then
Packit Service af52df
	u_plus_rw=
Packit Service af52df
      else
Packit Service af52df
	u_plus_rw='% 200'
Packit Service af52df
      fi
Packit Service af52df
      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
Packit Service af52df
    *)
Packit Service af52df
      if test -z "$stripcmd"; then
Packit Service af52df
	u_plus_rw=
Packit Service af52df
      else
Packit Service af52df
	u_plus_rw=,u+rw
Packit Service af52df
      fi
Packit Service af52df
      cp_umask=$mode$u_plus_rw;;
Packit Service af52df
  esac
Packit Service af52df
fi
Packit Service af52df
Packit Service af52df
for src
Packit Service af52df
do
Packit Service af52df
  # Protect names problematic for 'test' and other utilities.
Packit Service af52df
  case $src in
Packit Service af52df
    -* | [=\(\)!]) src=./$src;;
Packit Service af52df
  esac
Packit Service af52df
Packit Service af52df
  if test -n "$dir_arg"; then
Packit Service af52df
    dst=$src
Packit Service af52df
    dstdir=$dst
Packit Service af52df
    test -d "$dstdir"
Packit Service af52df
    dstdir_status=$?
Packit Service af52df
  else
Packit Service af52df
Packit Service af52df
    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
Packit Service af52df
    # might cause directories to be created, which would be especially bad
Packit Service af52df
    # if $src (and thus $dsttmp) contains '*'.
Packit Service af52df
    if test ! -f "$src" && test ! -d "$src"; then
Packit Service af52df
      echo "$0: $src does not exist." >&2
Packit Service af52df
      exit 1
Packit Service af52df
    fi
Packit Service af52df
Packit Service af52df
    if test -z "$dst_arg"; then
Packit Service af52df
      echo "$0: no destination specified." >&2
Packit Service af52df
      exit 1
Packit Service af52df
    fi
Packit Service af52df
    dst=$dst_arg
Packit Service af52df
Packit Service af52df
    # If destination is a directory, append the input filename; won't work
Packit Service af52df
    # if double slashes aren't ignored.
Packit Service af52df
    if test -d "$dst"; then
Packit Service af52df
      if test -n "$no_target_directory"; then
Packit Service af52df
	echo "$0: $dst_arg: Is a directory" >&2
Packit Service af52df
	exit 1
Packit Service af52df
      fi
Packit Service af52df
      dstdir=$dst
Packit Service af52df
      dst=$dstdir/`basename "$src"`
Packit Service af52df
      dstdir_status=0
Packit Service af52df
    else
Packit Service af52df
      # Prefer dirname, but fall back on a substitute if dirname fails.
Packit Service af52df
      dstdir=`
Packit Service af52df
	(dirname "$dst") 2>/dev/null ||
Packit Service af52df
	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
Packit Service af52df
	     X"$dst" : 'X\(//\)[^/]' \| \
Packit Service af52df
	     X"$dst" : 'X\(//\)$' \| \
Packit Service af52df
	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
Packit Service af52df
	echo X"$dst" |
Packit Service af52df
	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
Packit Service af52df
		   s//\1/
Packit Service af52df
		   q
Packit Service af52df
		 }
Packit Service af52df
		 /^X\(\/\/\)[^/].*/{
Packit Service af52df
		   s//\1/
Packit Service af52df
		   q
Packit Service af52df
		 }
Packit Service af52df
		 /^X\(\/\/\)$/{
Packit Service af52df
		   s//\1/
Packit Service af52df
		   q
Packit Service af52df
		 }
Packit Service af52df
		 /^X\(\/\).*/{
Packit Service af52df
		   s//\1/
Packit Service af52df
		   q
Packit Service af52df
		 }
Packit Service af52df
		 s/.*/./; q'
Packit Service af52df
      `
Packit Service af52df
Packit Service af52df
      test -d "$dstdir"
Packit Service af52df
      dstdir_status=$?
Packit Service af52df
    fi
Packit Service af52df
  fi
Packit Service af52df
Packit Service af52df
  obsolete_mkdir_used=false
Packit Service af52df
Packit Service af52df
  if test $dstdir_status != 0; then
Packit Service af52df
    case $posix_mkdir in
Packit Service af52df
      '')
Packit Service af52df
	# Create intermediate dirs using mode 755 as modified by the umask.
Packit Service af52df
	# This is like FreeBSD 'install' as of 1997-10-28.
Packit Service af52df
	umask=`umask`
Packit Service af52df
	case $stripcmd.$umask in
Packit Service af52df
	  # Optimize common cases.
Packit Service af52df
	  *[2367][2367]) mkdir_umask=$umask;;
Packit Service af52df
	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
Packit Service af52df
Packit Service af52df
	  *[0-7])
Packit Service af52df
	    mkdir_umask=`expr $umask + 22 \
Packit Service af52df
	      - $umask % 100 % 40 + $umask % 20 \
Packit Service af52df
	      - $umask % 10 % 4 + $umask % 2
Packit Service af52df
	    `;;
Packit Service af52df
	  *) mkdir_umask=$umask,go-w;;
Packit Service af52df
	esac
Packit Service af52df
Packit Service af52df
	# With -d, create the new directory with the user-specified mode.
Packit Service af52df
	# Otherwise, rely on $mkdir_umask.
Packit Service af52df
	if test -n "$dir_arg"; then
Packit Service af52df
	  mkdir_mode=-m$mode
Packit Service af52df
	else
Packit Service af52df
	  mkdir_mode=
Packit Service af52df
	fi
Packit Service af52df
Packit Service af52df
	posix_mkdir=false
Packit Service af52df
	case $umask in
Packit Service af52df
	  *[123567][0-7][0-7])
Packit Service af52df
	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
Packit Service af52df
	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
Packit Service af52df
	    ;;
Packit Service af52df
	  *)
Packit Service af52df
	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
Packit Service af52df
	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
Packit Service af52df
Packit Service af52df
	    if (umask $mkdir_umask &&
Packit Service af52df
		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
Packit Service af52df
	    then
Packit Service af52df
	      if test -z "$dir_arg" || {
Packit Service af52df
		   # Check for POSIX incompatibilities with -m.
Packit Service af52df
		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
Packit Service af52df
		   # other-writable bit of parent directory when it shouldn't.
Packit Service af52df
		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
Packit Service af52df
		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
Packit Service af52df
		   case $ls_ld_tmpdir in
Packit Service af52df
		     d????-?r-*) different_mode=700;;
Packit Service af52df
		     d????-?--*) different_mode=755;;
Packit Service af52df
		     *) false;;
Packit Service af52df
		   esac &&
Packit Service af52df
		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
Packit Service af52df
		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
Packit Service af52df
		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
Packit Service af52df
		   }
Packit Service af52df
		 }
Packit Service af52df
	      then posix_mkdir=:
Packit Service af52df
	      fi
Packit Service af52df
	      rmdir "$tmpdir/d" "$tmpdir"
Packit Service af52df
	    else
Packit Service af52df
	      # Remove any dirs left behind by ancient mkdir implementations.
Packit Service af52df
	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
Packit Service af52df
	    fi
Packit Service af52df
	    trap '' 0;;
Packit Service af52df
	esac;;
Packit Service af52df
    esac
Packit Service af52df
Packit Service af52df
    if
Packit Service af52df
      $posix_mkdir && (
Packit Service af52df
	umask $mkdir_umask &&
Packit Service af52df
	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
Packit Service af52df
      )
Packit Service af52df
    then :
Packit Service af52df
    else
Packit Service af52df
Packit Service af52df
      # The umask is ridiculous, or mkdir does not conform to POSIX,
Packit Service af52df
      # or it failed possibly due to a race condition.  Create the
Packit Service af52df
      # directory the slow way, step by step, checking for races as we go.
Packit Service af52df
Packit Service af52df
      case $dstdir in
Packit Service af52df
	/*) prefix='/';;
Packit Service af52df
	[-=\(\)!]*) prefix='./';;
Packit Service af52df
	*)  prefix='';;
Packit Service af52df
      esac
Packit Service af52df
Packit Service af52df
      eval "$initialize_posix_glob"
Packit Service af52df
Packit Service af52df
      oIFS=$IFS
Packit Service af52df
      IFS=/
Packit Service af52df
      $posix_glob set -f
Packit Service af52df
      set fnord $dstdir
Packit Service af52df
      shift
Packit Service af52df
      $posix_glob set +f
Packit Service af52df
      IFS=$oIFS
Packit Service af52df
Packit Service af52df
      prefixes=
Packit Service af52df
Packit Service af52df
      for d
Packit Service af52df
      do
Packit Service af52df
	test X"$d" = X && continue
Packit Service af52df
Packit Service af52df
	prefix=$prefix$d
Packit Service af52df
	if test -d "$prefix"; then
Packit Service af52df
	  prefixes=
Packit Service af52df
	else
Packit Service af52df
	  if $posix_mkdir; then
Packit Service af52df
	    (umask=$mkdir_umask &&
Packit Service af52df
	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
Packit Service af52df
	    # Don't fail if two instances are running concurrently.
Packit Service af52df
	    test -d "$prefix" || exit 1
Packit Service af52df
	  else
Packit Service af52df
	    case $prefix in
Packit Service af52df
	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
Packit Service af52df
	      *) qprefix=$prefix;;
Packit Service af52df
	    esac
Packit Service af52df
	    prefixes="$prefixes '$qprefix'"
Packit Service af52df
	  fi
Packit Service af52df
	fi
Packit Service af52df
	prefix=$prefix/
Packit Service af52df
      done
Packit Service af52df
Packit Service af52df
      if test -n "$prefixes"; then
Packit Service af52df
	# Don't fail if two instances are running concurrently.
Packit Service af52df
	(umask $mkdir_umask &&
Packit Service af52df
	 eval "\$doit_exec \$mkdirprog $prefixes") ||
Packit Service af52df
	  test -d "$dstdir" || exit 1
Packit Service af52df
	obsolete_mkdir_used=true
Packit Service af52df
      fi
Packit Service af52df
    fi
Packit Service af52df
  fi
Packit Service af52df
Packit Service af52df
  if test -n "$dir_arg"; then
Packit Service af52df
    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
Packit Service af52df
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
Packit Service af52df
    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
Packit Service af52df
      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
Packit Service af52df
  else
Packit Service af52df
Packit Service af52df
    # Make a couple of temp file names in the proper directory.
Packit Service af52df
    dsttmp=$dstdir/_inst.$$_
Packit Service af52df
    rmtmp=$dstdir/_rm.$$_
Packit Service af52df
Packit Service af52df
    # Trap to clean up those temp files at exit.
Packit Service af52df
    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
Packit Service af52df
Packit Service af52df
    # Copy the file name to the temp name.
Packit Service af52df
    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
Packit Service af52df
Packit Service af52df
    # and set any options; do chmod last to preserve setuid bits.
Packit Service af52df
    #
Packit Service af52df
    # If any of these fail, we abort the whole thing.  If we want to
Packit Service af52df
    # ignore errors from any of these, just make sure not to ignore
Packit Service af52df
    # errors from the above "$doit $cpprog $src $dsttmp" command.
Packit Service af52df
    #
Packit Service af52df
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
Packit Service af52df
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
Packit Service af52df
    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
Packit Service af52df
    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
Packit Service af52df
Packit Service af52df
    # If -C, don't bother to copy if it wouldn't change the file.
Packit Service af52df
    if $copy_on_change &&
Packit Service af52df
       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
Packit Service af52df
       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
Packit Service af52df
Packit Service af52df
       eval "$initialize_posix_glob" &&
Packit Service af52df
       $posix_glob set -f &&
Packit Service af52df
       set X $old && old=:$2:$4:$5:$6 &&
Packit Service af52df
       set X $new && new=:$2:$4:$5:$6 &&
Packit Service af52df
       $posix_glob set +f &&
Packit Service af52df
Packit Service af52df
       test "$old" = "$new" &&
Packit Service af52df
       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
Packit Service af52df
    then
Packit Service af52df
      rm -f "$dsttmp"
Packit Service af52df
    else
Packit Service af52df
      # Rename the file to the real destination.
Packit Service af52df
      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
Packit Service af52df
Packit Service af52df
      # The rename failed, perhaps because mv can't rename something else
Packit Service af52df
      # to itself, or perhaps because mv is so ancient that it does not
Packit Service af52df
      # support -f.
Packit Service af52df
      {
Packit Service af52df
	# Now remove or move aside any old file at destination location.
Packit Service af52df
	# We try this two ways since rm can't unlink itself on some
Packit Service af52df
	# systems and the destination file might be busy for other
Packit Service af52df
	# reasons.  In this case, the final cleanup might fail but the new
Packit Service af52df
	# file should still install successfully.
Packit Service af52df
	{
Packit Service af52df
	  test ! -f "$dst" ||
Packit Service af52df
	  $doit $rmcmd -f "$dst" 2>/dev/null ||
Packit Service af52df
	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
Packit Service af52df
	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
Packit Service af52df
	  } ||
Packit Service af52df
	  { echo "$0: cannot unlink or rename $dst" >&2
Packit Service af52df
	    (exit 1); exit 1
Packit Service af52df
	  }
Packit Service af52df
	} &&
Packit Service af52df
Packit Service af52df
	# Now rename the file to the real destination.
Packit Service af52df
	$doit $mvcmd "$dsttmp" "$dst"
Packit Service af52df
      }
Packit Service af52df
    fi || exit 1
Packit Service af52df
Packit Service af52df
    trap '' 0
Packit Service af52df
  fi
Packit Service af52df
done
Packit Service af52df
Packit Service af52df
# Local variables:
Packit Service af52df
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit Service af52df
# time-stamp-start: "scriptversion="
Packit Service af52df
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit Service af52df
# time-stamp-time-zone: "UTC"
Packit Service af52df
# time-stamp-end: "; # UTC"
Packit Service af52df
# End: