#!/bin/ksh -p
#
# ident "@(#)bbrootsession.sh	1.13 02/06/06 SMI"
#
# Copyright 2000-2002 Sun Microsystems, Inc.  All rights reserved.
#

trap remove_lock 0 9 15 

. $BBROOT/etc/opt/SUNWbb/blackbox.rc

BBUSER=""
BBUSERLOCK=""
UTDEVICE_SESSION=""
UTSESSION_FILE=""
UTDPYDIR=/var/opt/SUNWut/displays
UTSESSION_DIR=/tmp/SUNWut/session_info
UTDEVMGRPIPE=/tmp/SUNWut/.utdevmgr

send2door() {
        #
        # "unhangable" method of writing down the pipe
        #
        typeset i=5             # 5 second timeout
        echo "$@" > $DOOR &
        while [ i -gt 0 ]; do
                if kill -0 $! >/dev/null 2>&1; then
                        sleep 1
                else
                        return
                fi
                let i-=1
        done
        kill -9 $! >/dev/null 2>&1
}

remove_lock() {

	if [[ "$BBUSER" != "" ]]; then
		/bin/ps -e -o "user,pid" | \
		nawk -v U=$BBUSER '{ 
			if ( $1 == U ) system( "kill -9 "$2 ) 
		}'
		( USER=$BBUSER $BBPATH/bin/bbkillproc 0 0 bbstartd; exit $? )
        	if [ $? = 0 -a "$DOOR" != "" -a -p $DOOR ]; then
			send2door stop
        	fi    
	fi
	# remove the device tree
	if [ "$UTSESSION_FILE" != "" ]; then
		/bin/rm -f $UTSESSION_FILE 
	fi
	if [ "$UTDEVICE_SESSION" != "" -a -p $UTDEVMGRPIPE ]; then
		echo destroy $UTDEVICE_SESSION > $UTDEVMGRPIPE
	fi
	if [ "$BBUSERLOCK" != "" ]; then
                rm -f $BBUSERLOCK
        fi
} 

SRCAUTH=$BBSUHOME/.Xauthority
XAUTH=/usr/openwin/bin/xauth 

BBHOSTNAME=`uname -n`
BBDISPNUM=`echo $DISPLAY | cut -f2 -d':'`
BBDISPLAY=${BBHOSTNAME}:${BBDISPNUM}
BBUDISPLAY=${BBHOSTNAME}/unix:${BBDISPNUM} 

# we might want to think about to use BBDISPNUM as BUSER, since that
# number is unique anyway...
# This will not require locking and therefore simplifies and boosts
# performance...
# (next rev I guess)
BUSERSTR=`$BBPATH/bin/bblock $BBLOCKPATH/finduser.lck "$BBPATH/bin/bbfinduser $BB_TOKEN"`
if [ $? != 0 -o "$BUSERSTR" = "" ]; then
	exit 1
fi

BUSER=`echo $BUSERSTR | awk '{ print $2 }'`
BBUSER=`echo $BUSERSTR | awk '{ print $1 }'`  
BBUSERLOCK=$BBLOCKPATH/$BBUSER.lock

# set the device tree permissions
UTDEVICE_SESSION=`/bin/sed  -n '/^SESSION=.*:/s///p' $UTDPYDIR/$BBDISPNUM`
if [ "$UTDEVICE_SESSION" != "" ]; then
	UTSESSION_FILE=$UTSESSION_DIR/$UTDEVICE_SESSION
	/usr/bin/id $BBUSER | sed -n '/(.*).*gid=/s// gid=/p' | \
		sed '/(.*)/s///' | tr -s ' ' '\n' > $UTSESSION_FILE
        echo XID=$BBDISPNUM >> $UTSESSION_FILE
	if [ -p $UTDEVMGRPIPE ]; then
		echo create $UTDEVICE_SESSION > $UTDEVMGRPIPE
	fi
fi

# set the right permissions for the up/down load directory
BBUPDNDIR=`bbfind_uuid_dir $BB_TOKEN`
if [ ! -d $BBUPDNDIR ]; then
        mkdir -m 700 $BBUPDNDIR
        chown $BBUSER $BBUPDNDIR
else
        chown $BBUSER `find $BBUPDNDIR`
fi

XAUTHORITY=$BBROOTPATH/home/$BBUSER/.Xauthority

if [ -x /opt/SUNWut/kiosk/bin/utrootkiosk ]; then
        (
                # we have to prepend the 'X' since ls -l comes back with
                # a dash as first character and that looks like an option
                # to 'set' and 'test' ([])
                set X `ls -l /opt/SUNWut/kiosk/bin/utrootkiosk`
                if [ "X$2" = 'X-rwx------' -a $4 = "root" ]; then
                        /opt/SUNWut/kiosk/bin/utrootkiosk \
                                ${BBCHRHOME}/${BBUSER} \
                                $BBUSER \
                                $BBDISPLAY \
                                $SUN_SUNRAY_TOKEN
                else
                        print -u2 "bogus file permissions for /opt/SUNWut/kiosk/bin/utrootkiosk"
                        print -u2 "execution denied..."
                fi
        )
else
	# extract xauth cookie from the root xauthority file
	# and create one for the user. This is needed since
	# we are running dtlogin as root and login as root.
	# We need this privilege to do the chroot later on..
	rm -f $XAUTHORITY  
	set -A DISP   	`su $BBSUUSER -c "$XAUTH -f $SRCAUTH list" | \
			nawk -v DI=$BBDISPLAY -v DU=$BBUDISPLAY '{ \
                		if ( $1 == DI || $1 == DU ) printf("%s\n\n", $0) \
        		}' | awk '{ print $1 }'`
	set -A PROTO  	`su $BBSUUSER -c "$XAUTH -f $SRCAUTH list" | \
			nawk -v DI=$BBDISPLAY -v DU=$BBUDISPLAY '{ \
                        	if ( $1 == DI || $1 == DU ) printf("%s\n\n", $0) \
                	}' | awk '{ print $2 }'`
	set -A COOKIE 	`su $BBSUUSER -c "$XAUTH -f $SRCAUTH list" | \
			nawk -v DI=$BBDISPLAY -v DU=$BBUDISPLAY '{ \
                        	if ( $1 == DI || $1 == DU ) printf("%s\n\n", $0) \
                	}' | awk '{ print $3 }'`
	i=0
	while [ $i != ${#DISP[*]} ]; do
		$XAUTH -q -f $XAUTHORITY add $BBDISPLAY ${PROTO[$i]} ${COOKIE[$i]} 
		i=`expr $i + 1`
	done  
	chown $BBUSER $XAUTHORITY         
fi

export XAUTHORITY
DISPLAY=$BBDISPLAY 

for i in $BB_XSESSION_CONFIG_PATH
do
    if [ -d $i ]; then
      #
      # Run custom Xsession scripts for this session.
      #
      for SCRIPT in `ls $i/*.${BB_SUNRAY_PKG}*`; do
        if [ -x $SCRIPT -a ! -d $SCRIPT ]; then
               print "sourcing $SCRIPT... DISPLAY: $DISPLAY"
               . $SCRIPT
        fi
      done
    fi
done
unset XAUTHORITY

# get the audio device and set it for the user
ADEV=`basename $UTAUDIODEV`
ADIR=`dirname $UTAUDIODEV`
( cd $ADIR;
	bbmknod "." $ADEV ${BBROOTPATH}$ADIR 600 $BBUSER
	bbmknod "." ${ADEV}ctl ${BBROOTPATH}$ADIR 600 $BBUSER
)
chown $BBUSER $UTAUDIODEV
chown $BBUSER ${UTAUDIODEV}ctl
                             
BBAUDIODEV=$UTAUDIODEV
export BBAUDIODEV         

DOOR=$BBROOTPATH/doors/$BBUSER 
rm -f $DOOR
( umask 077; mkfifo $DOOR )
chown $BBUSER $DOOR

su - $BBUSER -c "BBDISPLAY=$BBDISPLAY; export BBDISPLAY; \
		 BBAUDIODEV=$BBAUDIODEV; export BBAUDIODEV; \
		 BBUSER=$BBUSER; export BBUSER; \
		 BB_TOKEN=$BB_TOKEN; export BB_TOKEN; \
		 SUN_SUNRAY_TOKEN=$SUN_SUNRAY_TOKEN; export SUN_SUNRAY_TOKEN; \
		 UTDEVROOT=$UTDEVROOT; export UTDEVROOT; \
		 BB_KIOSK_LANG=$BB_KIOSK_LANG; export BB_KIOSK_LANG; \
		 $BBPATH/bin/bbcontrol $BUSER"

