[comp.windows.x] Yet Another Hacked Up XON / SHAR FILE.

dgreen@squid.cs.ucla.edu (Dan R. Greening) (02/09/90)

Damn, I was just putting the final touches on my version of xon.

I looked at Harald Backer's version, and it seems to assume that the
"domainname" command returns a fully-qualified internet domain.
Unfortunately, neither at UCLA nor at IBM (my haunts) is that the
case.  Instead, `domainname` returns one of several possible YP
domains, none of which match the internet domain name.  Oh well.  If I
knew how to get a fully-qualified domainname from any site, I would
include similar functionality in this, especially since I often use
remote xclients on far-away machines.

Regardless, this version of xon is a bit smarter than either of its
predecessors: xon or xrsh.  It plagerizes both.

MODIFICATIONS: 

1. It recognizes both ":?.?" and "unix:?.?" as referring
   to the local host.  

2. It checks the environment variable SHELL, and if set to something with a
   basename of "sh", "ksh", or "bash", it uses different stderr indirections,
   as is appropriate.  (I use ksh and bash, and xon used to bomb.)

3. The user can set the environment variable HOSTNAME to something, and
   xon will use that instead of `hostname`.  Here, then, is a way to perform
   xon to a very remote site: set HOSTNAME to your fully-qualified internet
   name before running xon.

4. It allows you to login as a different user on the remote site, by 
   specifying "-l userid".

5. The debug option spits out more stuff (it turns on -vx).

6. There is a man page, and an Imakefile included.  Please install in
   directory ./contrib/xon.

7. It runs on either SYSV (where it uses "remsh") or BSD (where it uses
   "rsh").  I tested it on both HP-UX 7.0 and SunOS 4.0.

8. It looks at the basename of the remote client for "xterm" (the 
   previous version looked at the entire clientname), so you can give
   a full path for xterm and still get the -name xterm-host functionality.

The shar file follows.  mkdir contrib/xon ; cd contrib/xon ; sh < sharfile

Enjoy.

Dan Greening / dgreen@cs.ucla.edu


------------------------------  CUT HERE  -----------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  xon.man xon.cpp Imakefile
# Wrapped by dgreen@hilo on Thu Feb  8 19:26:05 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xon.man' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xon.man'\"
else
echo shar: Extracting \"'xon.man'\" \(2544 characters\)
sed "s/^X//" >'xon.man' <<'END_OF_FILE'
X.TH XON 1 "Release 4" "X Version 11"
X.SH NAME
Xxon \- start remote X clients with minimum overhead
X.SH SYNOPSIS
X.B xon 
X[-l userid] [-debug] host cmd [arg ...]
X.SH DESCRIPTION
X.I xon
Xsets up permissions and starts an X11 client on a remote machine 
Xwith minimal overhead.  It is a frontend for the remote shell facility 
X(remsh or rsh).  It minimizes the number of open
Xptys on the remote and local machine, and thus improves performance.
XThe usual \fIrsh\fR/\fIremsh\fR and \fIxhost\fR access controls apply.
X.PP
X.I Xon 
Xruns \fIxhost\fR to permit opening an X session from the remote
Xhost.  It propagates the \fBDISPLAY\fR variable from the local environment 
Xto the remote session.  It closes the local standard input, output, and stderr
Xstreams so that the session is not associated with an unnecessary pty.
X.PP
XIf the base name in the remote command is "xterm", \fIxon\fR will insert
Xthe \fIxterm\fR option \fB-name xterm-\fIhost\fR.  This allows X11 resource
Xfiles to specify different xterm colors and features depending on the target 
Xhost.
X.SH "OPTIONS"
X.TP 8
X.B \-l userid
XAttempt to login with the userid \fBuserid\fR.
X.PP
X.TP 8
X.B \-debug
XDo not close the input and output files, and
Xdisplay executed \fIsh\fR statements.
X.SH "SEE ALSO"
XX(1), xhost(1), rsh(1) or remsh(1)
X.SH ENVIRONMENT
X.TP 10
X.B DISPLAY
XCopied to the remote session's environment.  It must be set.
XIf \fBDISPLAY\fR is set to "unix:n.n" or ":n.n"
Xthen \fBDISPLAY\fR is changed to "hostname:n.n".
X.PP
X.TP 10
X.B HOSTNAME
XUsed when appropriate to modify the \fBDISPLAY\fR variable
Xbefore passing it on to the remote host.
XIf \fBHOSTNAME\fR is not set,
Xthe \fIhostname\fR command is run to supply the appropriate value.
X.PP
X.TP 10
X.B SHELL
XUsed to determine whether to redirect stderr with ">&" (for \fItcsh\fR,
X\fIcsh\fR) or
X"2>&1" (for \fIbash\fR, \fIsh\fR, \fIksh\fR).  If \fBSHELL\fR is unassigned,
X\fBxon\fR assumes \fBcsh\fR is your default shell.
X.br
X.SH BUGS
XCare must be taken with quoting shell arguments for the remote session,
Xsince some layers of quoting are already present.  For best results, use '
Xinstead of ".
X.PP
XIf you use \fIcsh\fR on one machine and some other shell on another machine,
X\fIxon\fR may not properly redirect input and/or may abort.  There may be no
Xway to fix this, except to write a program.
X.SH AUTHORS
XOriginally suggested by Chris Torek (chris@mimsy.umd.edu).  
XSuccessive implementations by Marion Hakanson (hakanson@cse.ogc.edu), 
XJim Dempsey (jjd@bbn.com), Stephen Gildea (gildea@bbn.com), Dan Greening
X(dgreen@cs.ucla.edu).
END_OF_FILE
if test 2544 -ne `wc -c <'xon.man'`; then
    echo shar: \"'xon.man'\" unpacked with wrong size!
fi
# end of 'xon.man'
fi
if test -f 'xon.cpp' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xon.cpp'\"
else
echo shar: Extracting \"'xon.cpp'\" \(2959 characters\)
sed "s/^X//" >'xon.cpp' <<'END_OF_FILE'
X/**/#! /bin/sh
X/**/#
X/**/# xon: start an X11 client on another host
X/**/#
X/**/# Runs the given command on another host with $DISPLAY set in the environment.
X/**/#    Does an xhost to allow access to the other host.
X/**/#    Xon is very careful not to leave any extra processes waiting
X/**/#       around on either machine for the client to exit.  In order
X/**/#       to achieve this, csh is used on the remote host and all inputs
X/**/#       and outputs are redirected to /dev/null.
X/**/#    The -debug switch allows you to see errors, but doesn't worry about
X/**/#       leaving extra processes around.
X/**/#    If the given command starts with "xterm", it adds the arguments
X/**/#        "-name xterm-$hostname"
X/**/#        where $hostname is the name of the remote host.  This allows
X/**/#        you to customize your server's xrdb database to set attributes,
X/**/#        such as the window color, based on the name of remote host.
X/**/#
X/**/# Written by Jim Dempsey <jjd@bbn.com> with help from Stephen Gildea
X/**/#   <gildea@bbn.com> based on an idea by Dave Mankins <dm@think.com>.
X/**/#   Originally written around 1987.
X/**/#   Last modification Feb 4 1990 by dgreen@cs.ucla.edu
X
X/**/# Process xon options.
X
Xrshopts=""
Xwhile 
X  found=f
X  case $1 in
X    -debug )
X      debug=t; set -xv; found=t
X      ;;
X    -l )
X      shift; rshopts="-l $1 $rshopts"; found=t
X      ;;
X    esac
X  [ $found = t ]
X  do shift; done
X
Xcase $# in
X    0|1) echo "usage: $0 [-debug] [-l logname] host cmd [args]" 1>&2; exit 1;;
Xesac
X
Xhost="$1"; shift
Xif [ ${HOSTNAME:-notset} = notset ] ; then HOSTNAME=`hostname` ; fi
X
Xcommand=$1; shift
Xif [ `basename $command` = "xterm" ]; then
X    command="$command -name xterm-$host"
Xfi
Xif [ $# -ge 1 ]; then
X    command="$command $@"
Xfi
X
X/**/# If run on the same host as server, modify $DISPLAY for the remote host.
Xcase X$DISPLAY in
X  Xunix:* | X:* )
X    DISPLAY="`echo $DISPLAY | sed \"s/^[&:]*:/${HOSTNAME}:/\"`"
X    export DISPLAY
X    ;;
X  esac
X
X/**/# If run on the same host as server, allow remote host access X server.
Xif [ $HOSTNAME != $host ]; then
X    if [ "$debug" ]; then
X        xhost +$host
X    else
X        xhost +$host > /dev/null 2>&1
X    fi
Xfi
X
Xif type remsh | fgrep 'not found' > /dev/null 
X  then rshell=rsh 
X  else rshell=remsh 
X  fi
X
X/**/# Do the real work using rsh.
Xif [ "$debug" ]; then
X    echo "$0: Going to execute \"$command\" on $host."
X    $rshell $host $rshopts -n /bin/csh -cf "\"setenv DISPLAY $DISPLAY; setenv TERM xterm; $command\""
Xelse
X    case ${SHELL:-/bin/csh} in
X      *csh )
X         exec $rshell $host $rshopts -n \
X	      exec /bin/csh -cf "\"setenv DISPLAY $DISPLAY; setenv TERM xterm;\
X	                           exec $command\" < /dev/null >& /dev/null"
X	 ;;
X      * )
X         exec $rshell $host $rshopts -n \
X	      exec /bin/csh -cf "\"setenv DISPLAY $DISPLAY; setenv TERM xterm;\
X	                           exec $command\" < /dev/null > /dev/null 2>&1"
X	 ;;
X      esac
Xfi
X
Xexit 0
END_OF_FILE
if test 2959 -ne `wc -c <'xon.cpp'`; then
    echo shar: \"'xon.cpp'\" unpacked with wrong size!
fi
chmod +x 'xon.cpp'
# end of 'xon.cpp'
fi
if test -f 'Imakefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Imakefile'\"
else
echo shar: Extracting \"'Imakefile'\" \(171 characters\)
sed "s/^X//" >'Imakefile' <<'END_OF_FILE'
XPROGRAMS = xon
X
X#ifdef BandAidCompiler
X#include BandAidCompiler
X#endif
X
XCppScriptTarget(xon,xon.cpp,/**/,/**/)
XInstallProgram(xon,$(BINDIR))
XInstallManPage(xon,$(MANDIR))
END_OF_FILE
if test 171 -ne `wc -c <'Imakefile'`; then
    echo shar: \"'Imakefile'\" unpacked with wrong size!
fi
# end of 'Imakefile'
fi
echo shar: End of shell archive.
exit 0

Dan Greening       | NY 914-789-7861 | 12 Foster Court
dgreen@cs.ucla.edu | CA 213-825-2266 | Croton-on-Hudson, NY 10520