summaryrefslogtreecommitdiff
path: root/install-sh
diff options
context:
space:
mode:
authorNathan Scott <nathans@sgi.com>2001-01-15 03:18:30 +0000
committerNathan Scott <nathans@sgi.com>2001-01-15 03:18:30 +0000
commit02f43564629f54847c04cc32f77cb1b6ba3b89c2 (patch)
treeae1217c94a5d2659dcf985e1385941e20ef2f60f /install-sh
parent82129da6af3a2cddad3334623cfe415058036e4c (diff)
downloadattr-02f43564629f54847c04cc32f77cb1b6ba3b89c2.tar.gz
initial version for reworked extended attributes build environment.
Diffstat (limited to 'install-sh')
-rwxr-xr-xinstall-sh273
1 files changed, 273 insertions, 0 deletions
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..395497a
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,273 @@
+#! /bin/sh
+#
+# Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Further, this software is distributed without any warranty that it is
+# free of the rightful claim of any third person regarding infringement
+# or the like. Any license provided herein, whether implied or
+# otherwise, applies only to this software file. Patent licenses, if
+# any, provided herein do not apply to combinations of this program with
+# other software, or any other product whatsoever.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston MA 02111-1307, USA.
+#
+# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+# Mountain View, CA 94043, or:
+#
+# http://www.sgi.com
+#
+# For further information regarding this notice, see:
+#
+# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+#
+
+#
+# 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 ""
+ 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.quite ] ; then
+ echo '==============================================='
+ echo Ownership of files under ${DIST_ROOT:-/}
+ echo cannot be changed
+ echo '==============================================='
+ if [ -n "$DIST_ROOT" ] ; then
+ touch $DIST_ROOT/.chown.quite
+ 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
+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=:
+
+[ -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:" 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
+ ;;
+ *)
+ _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}
+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