diff options
Diffstat (limited to 'sinstall.sh')
-rwxr-xr-x | sinstall.sh | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/sinstall.sh b/sinstall.sh new file mode 100755 index 0000000..fa85ec7 --- /dev/null +++ b/sinstall.sh @@ -0,0 +1,198 @@ +#!/bin/sh +# $XTermId: sinstall.sh,v 1.18 2010/03/06 16:19:13 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2008,2010 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Install program setuid if the installer is running as root, and if xterm is +# already installed on the system with setuid privilege. This is a safeguard +# for ordinary users installing xterm for themselves on systems where the +# setuid is not needed to access a PTY, but only for things like utmp. +# +# Options: +# u+s, g+s as in chmod +# -u, -g and -m as in install. If any options are given, $3 is ignored. +# +# Parameters: +# $1 = program to invoke as "install" +# $2 = program to install +# $3 = previously-installed program, for reference +# $4 = final installed-path, if different from reference + +trace=: +trace=echo + +# override locale... +# (otherwise GNU ls displays date column in a locale-dependent manner). +LANG=C; export LANG +LANGUAGE=C; export LANGUAGE +LC_ALL=C; export LC_ALL +LC_CTYPE=C; export LC_CTYPE + +OPTS_SUID= +OPTS_SGID= +OPTS_MODE= +OPTS_USR= +OPTS_GRP= + +while test $# != 0 +do + case $1 in + -*) + OPT="$1" + shift + if test $# != 0 + then + case $OPT in + -u) OPTS_USR="$1"; shift;; + -g) OPTS_GRP="$1"; shift;; + -m) OPTS_MODE="$1"; shift;; + esac + else + break + fi + ;; + u+s) shift; OPTS_SUID=4000;; + g+s) shift; OPTS_SGID=2000;; + *) break + ;; + esac +done + +SINSTALL="$1" +SRC_PROG="$2" +REF_PROG="$3" +DST_PROG="$4" + +test -z "$SINSTALL" && SINSTALL=install +test -z "$SRC_PROG" && SRC_PROG=xterm +test -z "$REF_PROG" && REF_PROG=/usr/bin/X11/xterm +test -z "$DST_PROG" && DST_PROG="$REF_PROG" + +test -n "$OPTS_SUID" && test -n "$OPTS_USR" && REF_PROG= +test -n "$OPTS_SGID" && test -n "$OPTS_GRP" && REF_PROG= + +echo checking for presumed installation-mode + +PROG_SUID= +PROG_SGID= +PROG_MODE= +PROG_USR= +PROG_GRP= + +if test -z "$REF_PROG" ; then + $trace "... reference program not used" +elif test -f "$REF_PROG" ; then + cf_option="-l -L" + MYTEMP=${TMPDIR-/tmp}/sinstall$$ + + # Expect listing to have fields like this: + #-r--r--r-- 1 user group 34293 Jul 18 16:29 pathname + ls $cf_option $REF_PROG + ls $cf_option $REF_PROG >$MYTEMP + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest <$MYTEMP + $trace "... if \"$cf_rest\" is null, try the ls -g option" + if test -z "$cf_rest" ; then + cf_option="$cf_option -g" + ls $cf_option $REF_PROG + ls $cf_option $REF_PROG >$MYTEMP + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest <$MYTEMP + fi + rm -f $MYTEMP + + # If we have a pathname, and the date fields look right, assume we've + # captured the group as well. + $trace "... if \"$cf_rest\" is null, we do not look for group" + if test -n "$cf_rest" ; then + cf_test=`echo "${cf_date2}${cf_date3}" | sed -e 's/[0-9:]//g'` + $trace "... if we have date in proper columns ($cf_date1 $cf_date2 $cf_date3), \"$cf_test\" is null" + if test -z "$cf_test" ; then + PROG_USR=$cf_usr; + PROG_GRP=$cf_grp; + fi + fi + $trace "... derived user \"$PROG_USR\", group \"$PROG_GRP\" of previously-installed $SRC_PROG" + + $trace "... see if mode \"$cf_mode\" has s-bit set" + case ".$cf_mode" in #(vi + .???s??s*) #(vi + $trace "... both setuid/setgid" + PROG_SUID=4000 + PROG_SGID=2000 + ;; + .???s*) #(vi + $trace "... setuid" + PROG_SUID=4000 + PROG_GRP= + ;; + .??????s*) + $trace "... setgid" + PROG_SGID=2000 + PROG_USR= + ;; + esac + PROG_MODE=`echo ".$cf_mode" | sed -e 's/^..//' -e 's/rw./7/g' -e 's/r-./5/g' -e 's/---/0/g' -e 's/--[sxt]/1/g' -e 's/[^0-7]//g'` +fi + +# passed-in options override the reference +test -n "$OPTS_SUID" && PROG_SUID="$OPTS_SUID" +test -n "$OPTS_SGID" && PROG_SGID="$OPTS_SGID" +test -n "$OPTS_MODE" && PROG_MODE="$OPTS_MODE" +test -n "$OPTS_USR" && PROG_USR="$OPTS_USR" +test -n "$OPTS_GRP" && PROG_GRP="$OPTS_GRP" + +# we always need a mode +test -z "$PROG_MODE" && PROG_MODE=755 + +if test -n "${PROG_USR}${PROG_GRP}" ; then + cf_uid=`id | sed -e 's/^[^=]*=//' -e 's/(.*$//'` + cf_usr=`id | sed -e 's/^[^(]*(//' -e 's/).*$//'` + cf_grp=`id | sed -e 's/^.* gid=[^(]*(//' -e 's/).*$//'` + $trace "... installing $SRC_PROG as user \"$cf_usr\", group \"$cf_grp\"" + if test "$cf_uid" != 0 ; then + PROG_SUID= + PROG_SGID= + PROG_USR="" + PROG_GRP="" + fi + test "$PROG_USR" = "$cf_usr" && PROG_USR="" + test "$PROG_GRP" = "$cf_grp" && PROG_GRP="" +fi + +test -n "${PROG_SUID}${PROG_SGID}" && PROG_MODE=`expr $PROG_MODE % 1000` +test -n "$PROG_SUID" && PROG_MODE=`expr $PROG_SUID + $PROG_MODE` +test -n "$PROG_SGID" && PROG_MODE=`expr $PROG_SGID + $PROG_MODE` + +test -n "$PROG_USR" && PROG_USR="-o $PROG_USR" +test -n "$PROG_GRP" && PROG_GRP="-g $PROG_GRP" + +echo "$SINSTALL -m $PROG_MODE $PROG_USR $PROG_GRP $SRC_PROG $DST_PROG" +eval "$SINSTALL -m $PROG_MODE $PROG_USR $PROG_GRP $SRC_PROG $DST_PROG" |