root/foundation-apps/mxterm-maxx/sinstall.sh

Revision 8, 4.5 KB (checked in by emasson, 3 years ago)

initial import for the community edition

Line 
1#!/bin/sh
2# $XTermId: sinstall.sh,v 1.16 2008/03/02 23:35:02 tom Exp $
3#
4# Install program setuid if the installer is running as root, and if xterm is
5# already installed on the system with setuid privilege.  This is a safeguard
6# for ordinary users installing xterm for themselves on systems where the
7# setuid is not needed to access a PTY, but only for things like utmp.
8#
9# Options:
10#       u+s, g+s as in chmod
11#       -u, -g and -m as in install.  If any options are given, $3 is ignored.
12#
13# Parameters:
14#       $1 = program to invoke as "install"
15#       $2 = program to install
16#       $3 = previously-installed program, for reference
17#       $4 = final installed-path, if different from reference
18
19trace=:
20trace=echo
21
22# override locale...
23# (otherwise GNU ls displays date column in a locale-dependent manner).
24LANG=C;         export LANG
25LANGUAGE=C;     export LANGUAGE
26LC_ALL=C;       export LC_ALL
27LC_CTYPE=C;     export LC_CTYPE
28
29OPTS_SUID=
30OPTS_SGID=
31OPTS_MODE=
32OPTS_USR=
33OPTS_GRP=
34
35while test $# != 0
36do
37        case $1 in
38        -*)
39                OPT="$1"
40                shift
41                if test $# != 0
42                then
43                        case $OPT in
44                        -u)     OPTS_USR="$1"; shift;;
45                        -g)     OPTS_GRP="$1"; shift;;
46                        -m)     OPTS_MODE="$1"; shift;;
47                        esac
48                else
49                        break
50                fi
51                ;;
52        u+s)    shift;  OPTS_SUID=4000;;
53        g+s)    shift;  OPTS_SGID=2000;;
54        *)      break
55                ;;
56        esac
57done
58
59SINSTALL="$1"
60SRC_PROG="$2"
61REF_PROG="$3"
62DST_PROG="$4"
63
64test -z "$SINSTALL" && SINSTALL=install
65test -z "$SRC_PROG" && SRC_PROG=xterm
66test -z "$REF_PROG" && REF_PROG=/usr/bin/X11/xterm
67test -z "$DST_PROG" && DST_PROG="$REF_PROG"
68
69test -n "$OPTS_SUID" && test -n "$OPTS_USR" && REF_PROG=
70test -n "$OPTS_SGID" && test -n "$OPTS_GRP" && REF_PROG=
71
72echo checking for presumed installation-mode
73
74PROG_SUID=
75PROG_SGID=
76PROG_MODE=
77PROG_USR=
78PROG_GRP=
79
80if test -z "$REF_PROG" ; then
81        $trace "... reference program not used"
82elif test -f "$REF_PROG" ; then
83        cf_option="-l -L"
84        MYTEMP=${TMPDIR-/tmp}/sinstall$$
85
86        # Expect listing to have fields like this:
87        #-r--r--r--   1 user      group       34293 Jul 18 16:29 pathname
88        ls $cf_option $REF_PROG
89        ls $cf_option $REF_PROG >$MYTEMP
90        read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest <$MYTEMP
91        $trace "... if \"$cf_rest\" is null, try the ls -g option"
92        if test -z "$cf_rest" ; then
93                cf_option="$cf_option -g"
94                ls $cf_option $REF_PROG
95                ls $cf_option $REF_PROG >$MYTEMP
96                read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest <$MYTEMP
97        fi
98        rm -f $MYTEMP
99
100        # If we have a pathname, and the date fields look right, assume we've
101        # captured the group as well.
102        $trace "... if \"$cf_rest\" is null, we do not look for group"
103        if test -n "$cf_rest" ; then
104                cf_test=`echo "${cf_date2}${cf_date3}" | sed -e 's/[0-9:]//g'`
105                $trace "... if we have date in proper columns ($cf_date1 $cf_date2 $cf_date3), \"$cf_test\" is null"
106                if test -z "$cf_test" ; then
107                        PROG_USR=$cf_usr;
108                        PROG_GRP=$cf_grp;
109                fi
110        fi
111        $trace "... derived user \"$PROG_USR\", group \"$PROG_GRP\" of previously-installed $SRC_PROG"
112
113        $trace "... see if mode \"$cf_mode\" has s-bit set"
114        case ".$cf_mode" in #(vi
115        .???s??s*) #(vi
116                $trace "... both setuid/setgid"
117                PROG_SUID=4000
118                PROG_SGID=2000
119                ;;
120        .???s*) #(vi
121                $trace "... setuid"
122                PROG_SUID=4000
123                PROG_GRP=
124                ;;
125        .??????s*)
126                $trace "... setgid"
127                PROG_SGID=2000
128                PROG_USR=
129                ;;
130        esac
131        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/+//g'`
132fi
133
134# passed-in options override the reference
135test -n "$OPTS_SUID" && PROG_SUID="$OPTS_SUID"
136test -n "$OPTS_SGID" && PROG_SGID="$OPTS_SGID"
137test -n "$OPTS_MODE" && PROG_MODE="$OPTS_MODE"
138test -n "$OPTS_USR"  && PROG_USR="$OPTS_USR"
139test -n "$OPTS_GRP"  && PROG_GRP="$OPTS_GRP"
140
141# we always need a mode
142test -z "$PROG_MODE" && PROG_MODE=755
143
144if test -n "${PROG_USR}${PROG_GRP}" ; then
145        cf_uid=`id | sed -e 's/^[^=]*=//' -e 's/(.*$//'`
146        cf_usr=`id | sed -e 's/^[^(]*(//' -e 's/).*$//'`
147        cf_grp=`id | sed -e 's/^.* gid=[^(]*(//' -e 's/).*$//'`
148        $trace "... installing $SRC_PROG as user \"$cf_usr\", group \"$cf_grp\""
149        if test "$cf_uid" != 0 ; then
150                PROG_SUID=
151                PROG_SGID=
152                PROG_USR=""
153                PROG_GRP=""
154        fi
155        test "$PROG_USR" = "$cf_usr" && PROG_USR=""
156        test "$PROG_GRP" = "$cf_grp" && PROG_GRP=""
157fi
158
159test -n "${PROG_SUID}${PROG_SGID}" && PROG_MODE=`expr $PROG_MODE % 1000`
160test -n "$PROG_SUID" && PROG_MODE=`expr $PROG_SUID + $PROG_MODE`
161test -n "$PROG_SGID" && PROG_MODE=`expr $PROG_SGID + $PROG_MODE`
162
163test -n "$PROG_USR" && PROG_USR="-o $PROG_USR"
164test -n "$PROG_GRP" && PROG_GRP="-g $PROG_GRP"
165
166echo "$SINSTALL -m $PROG_MODE $PROG_USR $PROG_GRP $SRC_PROG $DST_PROG"
167eval "$SINSTALL -m $PROG_MODE $PROG_USR $PROG_GRP $SRC_PROG $DST_PROG"
Note: See TracBrowser for help on using the browser.