summaryrefslogtreecommitdiff
path: root/install-sh
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
committerIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
commit47e6e7c84f008a53061e661f31ae96629bc694ef (patch)
tree648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /install-sh
downloadpcp-47e6e7c84f008a53061e661f31ae96629bc694ef.tar.gz
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'install-sh')
-rwxr-xr-xinstall-sh299
1 files changed, 299 insertions, 0 deletions
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..ac6ff0b
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,299 @@
+#!/bin/sh
+#
+# Copyright (c) 2013 Red Hat.
+# Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# This script emulates bsd install and also recognises
+# two environment variables, with the following semanitcs :-
+#
+# $DIST_MANIFEST - if set, the name of the file to append manifest
+# information in the following format:
+# File : f mode owner group src target
+# Diretory: 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 [-o owner] [-g group] [-m mode] file directory/file"
+ echo "or $prog [-o owner] [-g group] [-m mode] file 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 ""
+ 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}
+}
+
+ID=id
+# Test to use the functional id on Solaris
+test -f /usr/xpg4/bin/id && ID=/usr/xpg4/bin/id
+
+prog=`basename $0`
+HERE=`pwd`
+dflag=false
+Sflag=false
+DIRMODE=755
+FILEMODE=644
+OWNER=`$ID -u 2>/dev/null`
+GROUP=`$ID -g 2>/dev/null`
+if [ -z "$OWNER" -o -z "$GROUP" ]
+then
+ # do it the hardway
+ #
+ OWNER=`$ID | sed -e 's/.*uid=[^(]*(//' -e 's/).*//'`
+ GROUP=`$ID | sed -e 's/.*gid=[^(]*(//' -e 's/).*//'`
+fi
+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
+ RM=rm; CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
+else
+ RM=true; CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
+fi
+
+
+test $REAL_UID -ne 0 && CHOWN=true
+test "$NO_CHOWN" = "true" && CHOWN=true
+
+while getopts "d:g:m:o:S:" c $*
+do
+ case $c in
+ d)
+ dir=`echo $DIST_ROOT/$OPTARG | sed -e 's;//*;/;g'`
+ dflag=true
+ ;;
+ g)
+ GROUP=$OPTARG
+ ;;
+ m)
+ DIRMODE=`expr $OPTARG`
+ FILEMODE=$DIRMODE
+ ;;
+ o)
+ OWNER=$OPTARG
+ ;;
+ S)
+ symlink=$OPTARG
+ Sflag=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 `echo "$dir" | sed -e "s;^$DIST_ROOT;;"`
+elif $Sflag
+then
+ #
+ # fourth usage (symlink)
+ #
+ if [ $# -ne 1 ]
+ then
+ _usage
+ else
+ target=`echo $DIST_ROOT/$1 | sed -e 's;//*;/;g'`
+ fi
+ $RM -f $target
+ dir=`dirname $target | sed -e 's;//*;/;g'`
+ [ ! -d $dir ] && mkdir -p $dir
+ $LN -s -f $symlink $target
+ status=$?
+ $MANIFEST l $symlink `echo "$target" | sed -e "s;^$DIST_ROOT;;"`
+else
+ list=""
+ dir=""
+ if [ $# -eq 2 ]
+ then
+ #
+ # second usage: install file dir/name
+ # target 'name' is not necessarily the same as 'file'
+ # (Note: install file dir is ambiguous and not supported
+ #
+ f=$1
+ dir=$DIST_ROOT/`dirname $2`
+ dir=`echo $dir | sed -e 's;//*;/;g'`
+ t_dir=`echo "$dir" | sed -e "s;^$DIST_ROOT;;" | sed -e 's;//*;/;g'`
+ destfile=`basename $2`
+ if [ -f $f -a -f $f.exe ]
+ then
+ # Windows hack -- executables present as foo and foo.exe,
+ # the foo one is visible to test(1) and ls(1), but not to
+ # cat(1)/cp(1) ... need to $RM/$CP the foo.exe one
+ #
+ if cat $f >/dev/null 2>&1
+ then
+ :
+ else
+ f=$f.exe
+ destfile=$destfile.exe
+ fi
+ fi
+ [ ! -d $dir ] && mkdir -p $dir
+ if [ -d $dir/$destfile ]
+ then
+ echo ERROR: unsupported install usage
+ _usage
+ exit 1
+ else
+ $RM -f $dir/$destfile
+ fi
+ $CP $f $dir/$destfile
+ status=$?
+
+ if [ $status -eq 0 ]
+ then
+ [ ! -d $dir/$destfile ] && $CHMOD $FILEMODE $dir/$destfile
+ status=$?
+ if [ $status -eq 0 ]
+ then
+ $CHOWN $OWNER $GROUP $dir/$destfile
+ status=$?
+ fi
+ $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f $t_dir/$destfile
+ fi
+ [ $status -ne 0 ] && break
+
+ else
+ #
+ # third usage: install file file [file ...] directory
+ #
+ n=1
+ while [ $# -gt 0 ]
+ do
+ if [ $# -gt 1 ]
+ then
+ list="$list $1"
+ else
+ dir=`echo $DIST_ROOT/$1 | sed -e 's;//*;/;g'`
+ fi
+ shift
+ done
+
+ # At this stage, $list is the list of files to install
+ # in $dir. We create $dir if necessary
+
+ # t_dir is for the manifest, i.e. without $DIST_ROOT prefix
+ t_dir=`echo "$dir" | sed -e "s;^$DIST_ROOT;;"`
+
+ for f in $list
+ do
+ if [ -f $f -a -f $f.exe ]
+ then
+ # Windows hack -- executables present as foo and foo.exe,
+ # the foo one is visible to test(1) and ls(1), but not to
+ # cat(1)/cp(1) ... need to $RM/$CP the foo.exe one
+ #
+ if cat $f >/dev/null 2>&1
+ then
+ :
+ else
+ f=$f.exe
+ fi
+ fi
+
+ [ ! -d $dir ] && mkdir -p $dir
+ $RM -f $dir/$f
+ $CP $f $dir/$f
+ 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 $t_dir/$f
+ fi
+ [ $status -ne 0 ] && break
+ done
+ fi
+fi
+
+exit $status