[comp.windows.x] xon revised

harald@itk.unit.no (02/08/90)

Enclosed is a script which does remote X11 commands AND sets DISPLAY
and TERM. It works fine for X-terminals too...

Comments are welcome.

Regards, Harald Backer

////////////////////////////////////////////////////////////////////////
/ Harald Backer                          /  harald@itk.unit.no         /
/ SINTEF Automatic Control               /  (+47 7) 594375 Switchboard /
/ The Norwegian Institute of Technology  /  (+47 7) 594399 Fax         /
/ N-7034 Trondheim                       /                             /
/ NORWAY                                 /                             /
////////////////////////////////////////////////////////////////////////

------------------------- cut here -----------------------------------
#! /bin/sh
#
# xon:	run local xterm and rlogin on remote host
#	or
#	start an X11 client on remote host
#
# Runs the given command on another host with $DISPLAY and $TERM set
# in the environment. Is dependant on a patch in .login (.profile)
# when you run a local xterm:
#
#	if ($TERM =~ xterm.*) then
#		setenv DISPLAY `echo $TERM | sed 's/xt[^.]*\.//'`
#		setenv TERM xterm
#	endif
#
#
#    Does an xhost to allow access to the other host.
#    Xon is very careful not to leave any extra processes waiting
#       around on either machine for the client to exit. All inputs
#       and outputs are redirected to /dev/null.
#    If the given command starts with "xterm", it adds the arguments
#        "-name xterm@$hostname"
#        where $hostname is the name of the remote host.  This allows
#        you to customize your server's xrdb database to set attributes,
#        such as the window color, based on the name of remote host.
#
# Based on xon from X11R4/contrib/clients/scripts/xon.sh
# Modified 900207 harald@itk.unit.no

: ${DISPLAY?"environment variable DISPLAY not set"}

#defaults
user=

case $# in
    0) echo "
	usage:
		$0 host [-l user]

		which invokes a LOCAL xterm and
		logs you in on the remote host
	or
		$0 host [cmd [args]]

		which executes cmd at remote host
	" 1>&2; exit 1;;
esac

# get the host name
host="$1"; shift
name="$host"

# give remote host access to X server
xhost +$host > /dev/null 2>&1

# get a "good" $DISPLAY variable
# running on a console ?
    thishost=`hostname`
    server="`echo $DISPLAY | sed \"s/^unix:/${thishost}:/\"`"
# including domainname
    domainname=`/bin/domainname`
    server="`echo $server | sed \"s/^\([^.]*\):/\1\.${domainname}:/\"`"

# get user name
if [ $# -ge 2 -a "$1" = "-l" ]; then
   name="$2@$name"
    user="$1 $2"; shift; shift
fi

if [ $# -eq 0 ]; then
    # invoke a LOCAL xterm and do a rlogin

    # modify $TERM and patch ((c) rlk@THINK.COM) it in .login like this:
    # if ($TERM =~ xterm.*) then
    #	setenv DISPLAY `echo $TERM | sed 's/xt[^.]*\.//'`
    #	setenv TERM xterm
    # endif
    # 
    exec xterm -title $name -name $name -e env TERM=xterm.$server rlogin $host $user &
else
    command=$1; shift
    if [ "$command" = "xterm" ]; then
        command="$command  -name xterm@$host"
    fi
    if [ $# -ge 1 ]; then
        command="$command $@"
    fi

    exec rsh $host -n exec env DISPLAY=$server TERM=xterm PATH=$PATH "$command < /dev/null >& /dev/null" &

fi
exit 0