xfsprogs/install-sh

352 lines
6.8 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved.
#
# This script emulates bsd install and also recognises
# two environment variables, with the following semantics :-
#
# $DIST_MANIFEST - if set, the name of the file to append manifest
# information in the following format:
# File : f mode owner group src target
# Directory: d mode owner group target
# Symlink : l linkval target
#
# $DIST_ROOT - if set, prepend to target
#
# The sematics of all combinations of these two variables
# are as follows:
#
# $DIST_MANIFEST? $DIST_ROOT? | Copy? Append Manifest?
# -----------------------------+--------------------------
# not set not set | yes no
# not set set | yes no
# set not set | no yes
# set set | yes yes
#
_usage() {
echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory"
echo "or $prog [-D] [-o owner] [-g group] [-m mode] file directory/file"
echo "or $prog [-o owner] [-g group] [-m mode] file [file ...] directory"
echo "or $prog -S file target (creates \"target\" symlink)"
echo "or $prog -T lt_arg [-o owner] [-g group] [-m mode] libtool.lai directory"
echo ""
echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the"
echo "behaviour of this command - see comments in the script."
echo "The -D flag is only available for the second usage, and causes"
echo "the target directory to be created before installing the file."
echo ""
exit 1
}
_chown ()
{
_st=255
if [ $# -eq 3 ] ; then
chown $1:$2 $3
_st=$?
if [ $_st -ne 0 ] ; then
if [ $REAL_UID != '0' ] ; then
if [ ! -f $DIST_ROOT/.chown.quiet ] ; then
echo '==============================================='
echo Ownership of files under ${DIST_ROOT:-/}
echo cannot be changed
echo '==============================================='
if [ -n "$DIST_ROOT" ] ; then
touch $DIST_ROOT/.chown.quiet
fi
fi
_st=0
fi
fi
fi
return $_st
}
_manifest ()
{
echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null}
}
prog=`basename $0`
HERE=`pwd`
dflag=false
Dflag=false
Sflag=false
Tflag=false
DIRMODE=755
FILEMODE=644
OWNER=`id -u`
GROUP=`id -g`
REAL_UID=$OWNER
# default is to install and don't append manifest
INSTALL=true
MANIFEST=:
: ${DIST_ROOT:=${DESTDIR}}
[ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false
[ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest"
[ $# -eq 0 ] && _usage
if $INSTALL
then
CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
else
CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
fi
[ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true
while getopts "Dcm:d:S:o:g:T:" c $*
do
case $c in
c)
;;
g)
GROUP=$OPTARG
;;
o)
OWNER=$OPTARG
;;
m)
DIRMODE=`expr $OPTARG`
FILEMODE=$DIRMODE
;;
D)
Dflag=true
;;
S)
symlink=$OPTARG
Sflag=true
;;
d)
dir=$DIST_ROOT/$OPTARG
dflag=true
;;
T)
lt_install=$OPTARG
Tflag=true
;;
*)
_usage
;;
esac
done
shift `expr $OPTIND - 1`
status=0
if $dflag
then
#
# first usage
#
$MKDIR -p $dir
status=$?
if [ $status -eq 0 ]
then
$CHMOD $DIRMODE $dir
status=$?
fi
if [ $status -eq 0 ]
then
$CHOWN $OWNER $GROUP $dir
status=$?
fi
$MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT}
elif $Sflag
then
#
# fourth usage (symlink)
#
if [ $# -ne 1 ]
then
_usage
else
target=$DIST_ROOT/$1
fi
$LN -s -f $symlink $target
status=$?
$MANIFEST l $symlink ${target#$DIST_ROOT}
elif $Tflag
then
#
# -T (install libs built by libtool)
#
if [ $# -ne 2 ]
then
_usage
else
libtool_lai=$1
# source the libtool variables
if [ ! -f $libtool_lai ]
then
echo "$prog: Unable to find libtool library file $libtool_lai"
exit 2
fi
. ./$libtool_lai
target=$DIST_ROOT/$2
fi
case $lt_install in
so_dot_version)
# Loop until we find libfoo.so.x.y.z, then break out.
for solib in $library_names
do
# does it have enough parts? libfoo.so.x.y.z == 5
cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
if [ $cnt -eq 5 ]
then
install_name=$target/$solib
$CP $solib $install_name
status=$?
$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$solib ${install_name#$DIST_ROOT}
break
fi
done
;;
so_*)
case $lt_install in
so_dot_current)
# ln -s libfoo.so.x.y.z to libfoo.so.x
from_parts=5 # libfoo.so.x.y.z
to_parts=3 # libfoo.so.x
;;
so_base)
# ln -s libfoo.so.x to libfoo.so
from_parts=3 # libfoo.so.x
to_parts=2 # libfoo.so
;;
*)
echo "$prog: -T $lt_install invalid"
exit 2
;;
esac
# Loop until we find the names, then break out.
for solib in $library_names
do
# does it have enough parts?
cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
if [ $cnt -eq $from_parts ]
then
from_name=$solib
elif [ $cnt -eq $to_parts ]
then
to_name=$solib
fi
if [ -n "$from_name" ] && [ -n "$to_name" ]
then
install_name=$target/$to_name
$LN -s -f $from_name $install_name
status=$?
$MANIFEST l $from_name ${install_name#$DIST_ROOT}
break
fi
done
;;
old_lib)
install_name=$target/$old_library
$CP $old_library $install_name
status=$?
$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$old_library ${install_name#$DIST_ROOT}
;;
*)
echo "$prog: -T $lt_install invalid"
exit 2
;;
esac
case $lt_install in
old_lib|so_dot_version)
if [ $status -eq 0 ]
then
$CHMOD $FILEMODE $install_name
$CHOWN $OWNER $GROUP $install_name
fi
;;
esac
else
list=""
dir=""
if [ $# -eq 2 ]
then
#
# second usage
#
f=$1
dir=$DIST_ROOT/$2
if $Dflag
then
mkdir -p `dirname $dir`
fi
$CP $f $dir
status=$?
if [ $status -eq 0 ]
then
if [ -f $dir/$f ]
then
$CHMOD $FILEMODE $dir/$f
status=$?
if [ $status -eq 0 ]
then
$CHOWN $OWNER $GROUP $dir/$f
status=$?
fi
$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
else
$CHMOD $FILEMODE $dir
status=$?
if [ $status -eq 0 ]
then
$CHOWN $OWNER $GROUP $dir
status=$?
fi
$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT}
fi
fi
else
#
# third usage
#
n=1
while [ $# -gt 0 ]
do
if [ $# -gt 1 ]
then
list="$list $1"
else
dir=$DIST_ROOT/$1
fi
shift
done
# echo DIR=$dir list=\"$list\"
for f in $list
do
$CP $f $dir
status=$?
if [ $status -eq 0 ]
then
$CHMOD $FILEMODE $dir/$f
status=$?
if [ $status -eq 0 ]
then
$CHOWN $OWNER $GROUP $dir/$f
status=$?
fi
$MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
fi
[ $status -ne 0 ] && break
done
fi
fi
exit $status