term HOWTO
  Bill Reynolds	bill@goshawk.lanl.gov, Patrick Reijnen
  patrickr@cs.kun.nl
  February 5, 1995

  1.  Legal Information



  1.1.	Copyright statement

  This document	may be distributed freely as a whole in	any form and
  free of charge. Parts	of this	document may be	distributed, provided
  that this copyright message is included and the reader is informed
  that this is not the full HOWTO document. Furthermore, there is to be
  a pointer as to where	the full document can be obtained. Specifically,
  it may be included in	commercial distributions, without prior	consent.
  However, I would like	to be informed of such usage.

  This HOWTO may be translated into any	language, whatsoever, provided
  that you leave this copyright	statement and the disclaimer intact, and
  that a notice	is appended stating who	translated the document.


  1.2.	DISCLAIMER


  While	I have tried to	include	the most correct and up-to-date
  information available, I cannot guarantee that usage of the
  information in this document does not	result in loss of data.	I
  provide NO WARRANTY about the	information in this HOWTO and I	cannot
  be made liable for any consequences for any damage resulting from
  using	information in this HOWTO.


  2.  Introduction



  2.1.	This Document



  This HOWTO attempts to clear up some of the confusion	of using term,
  Michael O'Reilly's remarkable	program	that allows you	to multiplex
  your serial line and set up a	network	connection.  By	and large, the
  documents that come with term	are quite good,	and this HOWTO is not
  intended to replace them. The	intention of this document is to give
  some background on how term works and	detail the steps in getting some
  of the more common networking	services working under term. It	should
  be emphasized	that this document does	not cover everything there is to
  know about term. After reading it, the term manual pages should be
  read,	since they include information not contained here.


  2.2.	What is	term?

  term is a program, written by	Michael	O'Reilly (michael@iinet.com.au),
  that is run over a serial line to allow multiple connections to
  operate concurrently - i.e. you may be down-load a file via your modem
  while	working	on a (different) remote	system via the same modem
  connection. term can also be used to open up X client	windows	over a
  serial connection.  Through the tredir utility and the tudpredir
  utility term can provide almost all of the ``traditional'' TCP/IP and
  UDP network services:	mail, news, ftp, telnet, xarchie, etc.	In a
  sense, term is very much like	other serial protocols such as SLIP or
  PPP. term's advantage	is that	it can be run entirely from user space,
  requiring no support from system or network administrators.

  Unlike SLIP or PPP, your machine does	not have its own IP address. All
  incoming traffic must	be addressed to	your remote host, and it will be
  redirected to	your local computer by term.


  3.  How term works


  Before experimenting with term it is strongly	advised	to first read
  this complete	chapter	and the	INSTALLATION file provided with	the
  package. Also	take a look at the manual pages	linecheck, (term)test
  and term. This will help you to work easier and faster.


  3.1.	Nomenclature


  I assume you are dialling a system through some sort of terminal
  server. I use	the terms ``local'' and	``remote'' to refer to the home
  and network connected	systems	respectively (unless I use them	to mean
  something else :-).

  term provides	the local machine, which has no	network	connection, but
  is connected,	via a serial line, to a	remote machine which is	in turn
  connected to a network with network services.	Let us look at how a
  machine with a ``traditional'' network connection provides these
  services. First the user invokes a program, like ftp or telnet, that
  requests a network service. What these programs do is	make a system
  call requesting network services. The	operating system then obtains
  these	services via its network interface (e.g. it sends and receives
  packets over the ethernet). SLIP and PPP do exactly this, by
  converting your modem	line into a network interface, which is	in
  principle no different from an ethernet. The downside	of this	is that
  these	protocols make the modem-connected machine part	of the network,
  just like any	other machine. This implies all	the administrative
  burdens associated with being	a network node (more actually, since the
  modem	link must also be administered).

  In the absence of a network connection like SLIP or PPP, what	does one
  typically do?	Well, you dial your network connected machine, read your
  mail,	your news etc; if you need a file, you first transfer it to the
  remote machine and then download it to your local machine using kermit
  or some other	communication program. This is a bit of	a pain,
  especially since you can only	really do one thing at a time that uses
  your modem link.  The	idea behind term is basically to automate and
  multiplex this process. term is invoked on both the local and	remote
  machines, and	the two	processes communicate with one another over the
  modem	line. When you need a network service, you make	a request to the
  local	term daemon, which forwards the	request	to the term daemon on
  the remote, network-connected, machine. The result is	then returned
  over the modem line.

  To be	more concrete, say you want to retrieve	a file by ftp.	First
  you need a version of	ftp that can speak to term. You	invoke this
  termftp as you do a regular ftp, say termftp nethost.gov, but	this
  special version makes	its network request to the local term daemon
  instead of the kernel. The local term	forwards this request, over the
  modem	line, to the remote term, which	opens an ftp connection	to
  nethost.gov, and transmits the data back over	the modem link.	term is
  smart	enough to have many different things going on at once; so you
  can have several different network sessions using the	same modem link,
  e.g. you can be logged into another distant host via termtelnet while
  the termftp transfer is going	on.
  If this is too abstract (or unclear) do not worry; the important piece
  of information to get	out of this section is that there are two copies
  of term running, one on each end of the modem	link.


  4.  Setting Things Up



  4.1.	What has to be available


  Before you start building and	using term you have to make sure that
  you have built TCP/IP	support	into the kernel. Furthermore, make sure
  that the TCP/IP loopback interface is	activated. When	this is	the case
  you can go on	with the rest of this section.


  4.2.	Explanation of concepts


  In newer term	version	two new	concepts have entered term. These two
  concepts will	be explained in	the next two subsections.


  4.2.1.  Sharing


  Starting with	version	1.16 the concept of sharing the	term connection
  with other users has entered term. This means	that when you enable
  shared features, other people	can use	the same term connection you are
  using, i.e. when you are working on your remote machine via your term
  connection (say, from	your local machine you used trsh to get	in)
  another person on your local machine can use the same	term connection
  at the same time to ftp a file to his	login on your local machine from
  an ftp site somewhere	in the world.

  When you disable shared features (i.e. you execute term in private
  mode)	you and	only you (we do	not count root :-) can use the term
  connection.

  Of course, you only need to install shared term at the end at	which
  you want to allow people to use the same term	connection you are
  using. So, if	other people have a login on your local	machine	and they
  want to use it from somewhere	on your	remote network you enable shared
  features on the remote end of	your term connection. In this way all
  these	people can login on your machine at the	same time sharing the
  same term connection with each other and with	you. (NOTE: the	first
  example needed shared	features to be enabled at the local end	of the
  term connection).

  NOTE for installation	as root: When you install term as root you have
  to create a term group first (before compilation) with no member by
  adding the following line in /etc/group:


  term::16:root



  or any other unused GID than 16 when 16 is already in	use.

  After	compilation and	installation make term and its clients SGID
  term:


  chgrp	term <term_client>
  chmod	g+s <term_client>



  Also any other program that you make term-aware must be made SGID
  term.


  4.2.2.  Full term networking


  Starting with	term version 2.0.0 the statement full term networking is
  used.	When your only connection with the outside world is a term
  connection, you have a full term network and you should build	term
  with full term networking. In	this case in the shared	directory a file
  called termnet is placed. This tells term that your only connection to
  the outside world is via term.

  When you also	have some other	type of	network	connection beside your
  term connection term-aware programs first try	to fulfil their	job
  using	this network connection. When this fails term is invoked and it
  is tried to fulfil the job via the term connection. To make this more
  clear	now an example is given	in which term-aware telnet is used. This
  telnet should	work both with and without term.


  telnet localhost



  does not use term to connect,	but


  telnet zeus.cs.kun.nl



  will use term	only if	you do not have	some other type	of network
  connection.

  full term networking also means to lie about the host	name, and say it
  is the remote	host instead.  Furthermore, it causes bind(0) to always
  act on the remote host.  In essence it makes many programs unusable
  when they are	not going through term,	while term is running.
  Unfortunately, most UDP programs and daemons will not	work with term
  without these	nasty tricks.


  4.3.	Build term


  When you are lucky, this should just involve a make. Most probably
  however, you need to do more.	Due to new features in newer versions of
  term it is now a bit more complicated	to create your term binary. A
  couple of ways can be	followed to obtain your	binary.

  To cover all these ways term can be built this section will be split
  into three parts:


  1. Build term	up to version 1.15

  2. Build term, versions 1.16 up to 1.19


  3. Build term, versions 2.0.0	and higher


  4.3.1.  Build	term up	to version 1.15


  For these versions of	term building should invoke no more than the
  commands


  make DO=install OS-type
  make installman



  You will find	term, its clients and the manual pages nicely built and
  installed and	ready for use after this.

  Furthermore, you need	to create a directory $HOME/term. This directory
  term will use	to look	for its	termrc file.

  The only thing you may want to do is change some of the paths	in the
  Makefile or change some of the compiler flags.


  4.3.2.  Build	term, versions 1.16 up to 1.19


  To build these versions of term you can now choose one of the
  following ways:


  1. As	an ordinary user, build	term in	private	mode

  2. As	an ordinary user, build	term in	shared mode

  3. As	root, build term in private mode

  4. As	root, build term in shared mode

  Below, it will be explained how to enable/disable shared features
  during the compilation of term.


  1. You are an	ordinary user (no root access) and you do NOT want to
     SHARE the term connection with other users.

     As	a user who does	not want to share the term connection with other
     users you should do the following to build	term:


     make DO=install OS-type
     make installman



  After	this term, its clients and the manual pages are	built and
  installed.

  Furthermore, you need	to create a directory $HOME/.term. This	is the
  directory in which term will look for	its termrc file.

  2. You are an	ordinary user (no root access) and you want to SHARE the
     term connection with other	users.

     As	a user who wants to share the term connection you should do the
     following:


     make DO=installshare USERSHARE=$HOME/term OS-type
     make installman



  After	this term, its clients and the manual pages are	built and
  installed.

  Furthermore, you will	have a directory $HOME/term (default) with per-
  missions drwxrwxr-x. In this directory you will find at least	the
  socket used by term for its connection (tmp/private/socket=).

  3. You are root and you do NOT want to SHARE the term	connection with
     other users.

     As	root who does not want the term	connection to be shareable you
     should do the following to	build term:


     make DO=install OS-type
     make installman



  After	this term, its clients and the manual pages are	built and
  installed.

  Furthermore, you now have a directory	called /usr/local/lib/term
  (default) with permissions drwxr-xr-x. In this directory you will at
  least	find the socket	used by	term for its connection
  (tmp/private/socket=).

  4. You are root and want to SHARE the	term connection.

     First, make sure you have read the	section	about 'sharing'	above.

     As	root who wants to share	the term connection you	should do the
     following:


     make DO=installshare OS-type
     make installman



  After	this term, its clients and the manual pages are	built and
  installed.

  Furthermore, you now have a directory	called /usr/local/lib/term
  (default) owned by group term	and with permissions drwxrwxr-x. In this
  directory you	will at	least find the socket used by term for its con-
  nection (tmp/private/socket=).


  4.3.3.  Build	term, versions 2.0.0 and higher


  First, make sure you have read the section about 'full term
  networking' above.

  For term versions 2.0.0 and higher there are many ways to build the
  term binary and the clients. All of these can	be done	both by	root and
  by ordinary user:
  1. Build term	in private mode	without	full term networking

  2. Build term	in private mode	with full term networking

  3. Build term	in shared mode without full term networking

  4. Build term	in shared mode with full term networking

  In these versions of term a new way for compilation has entered term
  using	the script configure. When configure is	run it checks on what
  operating system you are trying to install term, whether the source
  directory is available or not, and if	any runtime options are	set.
  According to the things found	configure then creates a Makefile using
  Makefile.in which is provided	in the term package.

  Two of the more important options to configure are --root and	--user
  which	state whether term will	be installed by	root or	an ordinary
  user.	Other options can be used to install term the way you want (non-
  standard paths for example).


  1. Build term	in private mode	without	full term networking.

     To	build term in this way you need	to execute the following
     commands (both for	root and ordinary user):


     make install installman



  This builds the binaries and installs	these binaries and the manual
  pages.

  2. Build term	in private mode	with full term networking.

     To	build term in this way you need	to execute the following
     commands (both for	root and ordinary user):


     make installnet installman



  This builds the binaries and installs	these binaries and the manual
  pages.

  3. Build term	in shared mode without full term networking.

     To	build term in this way you need	to execute the following
     commands (both for	root and ordinary user):


     make share	installman



  This builds the binaries and installs	these binaries and the manual
  pages.

  4. Build term	in shared mode with full term networking.

     To	build term in this way you need	to execute the following
     commands (both for	root and ordinary user):


     make share	installnet installman



  This builds the binaries and installs	these binaries and the manual
  pages.


  4.4.	client.a, libtermnet.a,	libtermnet.sa, libtermnet.so


  With term a library with functions for term clients is provided.

  Up to	version	1.16 this library was called client.a. During
  compilation of term this library was built and then used during the
  compilation of the term clients. It was not installed	in another
  directory.

  Starting with	version	1.16 the name of the library is	changed	to
  libtermnet.a.	Up to version 1.19 this	library	is created in the term
  directory and	then used during compilation of	the term clients. It is
  not installed	in another directory.

  Starting with	version	2.0.0, beside libtermnet.a also	libtermnet.so
  and libtermnet.sa (shared library and	exported initialized library
  data)	are created during compilation of the term package. During the
  installation of all the parts	of the package also these three	library
  files	are installed in the directory /usr/local/lib (default). Then a
  link is made from libtermnet.so.2 to libtermnet.so.2.x.x. Finally,
  ldconfig is run to create the	necessary links	and cache (for use by
  the run-time linker, ld.so) to the most recent shared	libraries found
  in the directories specified on the command line, in the file
  /etc/ld.so.conf, and in the trusted directories (/usr/lib and	/lib).
  If the installation is done correctly	the three library files	can now
  be used by term clients which	are built with dynamic instead of static
  libraries. Also, these libraries can now be used to port your	own
  software to make it term aware (see below).


  4.5.	Setting	environment variables


  term knows a couple of environment variables which can be set	by
  users. The first three of those that I will explain are


  o  TERMDIR

  o  TERMSHARE

  o  TERMMODE

  By setting these variables you can control the way term is run.

  For term versions up to 1.15 only the	variable TERMDIR is important
  (these versions do not know the shared mode).	For these versions
  TERMDIR should be set	as follows:


  setenv TERMDIR $HOME	   (csh	or tcsh)
  export TERMDIR=$HOME	   (bash)



  Starting with	version	1.16 term also knows the variables TERMSHARE and
  TERMMODE. With these variables term can be told to run in private mode
  or in	shared mode. I will explain how	to set the variables for private
  mode and shared mode.


  1. Running term in private mode can be done setting the variables
     TERMDIR and TERMMODE in the following way:

     For csh or	tcsh

     setenv TERMDIR $HOME
     setenv TERMMODE 0



  For bash

  export TERMDIR=$HOME
  export TERMMODE=0



  2. When you want to use term in shared mode there are	two ways of
     setting the variables:


     a.	When term is installed as a SUID program only TERMMODE has to be
	set (??	README in the term package).


	setenv TERMMODE	'number'    (csh or tcsh)
	export TERMMODE='number'    (bash)



     For 'number' you have to enter 1 when you are using one of	the term
     versions 1.16 upto	1.19 (README.share in the package) and 2 when
     you are using term	version	2.0.0 or higher	(README.security in the
     package).

     b.	When term is installed as a SGID program the variables have to
	be set in the following	way:

	For csh	or tcsh

	setenv TERMMODE	1
	setenv TERMDIR /usr/local/lib/term
	setenv TERMSHARE $TERMDIR



     For bash

     export TERMMODE=1
     export TERMDIR=/usr/local/lib/term
     export TERMSHARE=$TERMDIR



     Setting the variables in this way makes it	possible to start old
     clients (clients linked to	an older version of client.a) in shared
     mode.

  Starting with	version	2.0.0 term also	knows the variable TERMSERVER.
  You need to set this variable	when you have multiple modems and you
  have more than one connection	at a time. To specify which connection
  to use, you must start term with a server name:
  nohup	term -v	/dev/modem1 Connection1	&
  nohup	term -v	/dev/modem2 Connection2	&



  Users	should then set	the variable TERMSERVER	to the connection name
  they want to use:


  setenv TERMSERVER Connection1	  (csh or tcsh)
  export TERMSERVER=Connection2	  (bash)




  4.6.	Test term



  Do a make test (or make termtest for newer versions of term) to build
  term's test daemon. (term)test works by running two copies of	term on
  your system, a ``local'' and a ``remote'' copy. Both of these	will
  read your termrc; so you can adjust their behaviour.	Now execute
  (term)test). You should now be able to do a trsh and a tupload (try
   tupload ./term /usr/tmp - you should	get a copy of the term	binary
  in /usr/tmp ). The local term's output should	show up	in local.log,
  the remote's one in remote.log.  You can start term up with a	-d255
  flag to enable debugging output to be	written	to these files,	or
  enable debugging in your termrc.

  NOTE:	Run test as ./test  so as to avoid your	system's test.


  4.7.	Make a Transparent Link


  Presumably, you can establish	a modem	connection between your	local
  and remote hosts. Typically, you are dialling	into some kind of
  terminal server and connecting to your remote	host from there. You are
  also using some kind of terminal software, such as kermit or seyon to
  talk to your modem (the examples in this document will use kermit,
  since	that is	what its author	uses). If you are having trouble with
  your modem, or your terminal software, take a	look at	the Serial-
  HOWTO; that should help you out.

  Having established your link,	you want to make it as transparent as
  possible.  Check the commands	on the terminal	server (help or	? will
  usually get you started). Go for the 8 bit options whenever possible.
  This may mean	changing the way you log in to a system, e.g. if the
  server uses rlogin, you may have to use it and give it the -8	flag to
  make it transparent.	Especially watch out for xon/xoff flow control.
  You do not want that.	Try to enable rts/cts (hardware) flow control.
  You may need to check	your modem docs	to learn how to	configure it to
  do 8-bit rts/cts communications.


  4.8.	Run linecheck


  WARNING: In some of the documents the	command	line options for
  linecheck are	mentioned in an	incorrect order. I have	checked	this and
  found	the order of options mentioned below to	be the correct ones.

  NOTE:	starting with term version 2.3.0 linecheck no longer needs to
  have the name	of a log-file on its commandline. It will write	its
  output to the	file linecheck.log in the directory you	start linecheck
  in.

  linecheck is a program that is supplied with term.  It checks	the
  transparency of a link, providing configuration information that term
  needs	to run correctly.  linecheck will send each of the 256 possible
  eight	bit characters over the	link and verify	that each was
  transmitted successfully. term needs to be configured	to deal	with
  characters that cannot be transmitted	over the link, and linecheck
  determines what characters these are.	You use	linecheck after	you have
  established as transparent a modem link as possible. To run linecheck,
  do the following


  1. On	the remote system, run linecheck linecheck.log

  2. Escape back to your local system and suspend your comm program (^Z
     under kermit) (otherwise it will steal characters from linecheck).

  3. On	the local system run linecheck linecheck.log > /dev/modem <
     /dev/modem

  When linecheck is done, you will find	a set of numbers at the	bottom
  of the linecheck.log files. These should be escaped in the termrc at
  the other end	of the link. For example, in my	system my local
  linecheck.log	said nothing and my remote linecheck.log said to escape
  29 and 157.  Therefore, my local termrc escapes these	characters and
  my remote termrc escapes nothing. If I escape	a character at one end,
  I have to also ignore	it at the other; so, in	this example, I	shall
  have to ignore 29 and	157 in my remote system.

  If linecheck hangs, try using


  linecheck linecheck.log 17 19



  on the remote	system and


  linecheck linecheck.log 17 19	> /dev/modem < /dev/modem



  on the local system. This will escape	your xon/xoff (flow control)
  characters, which will hang your line	if you have got	software flow
  control. If this solves the hanging problems,	you will want to escape
  /ignore 17/19	in both	termrc's. If your terminal server has other
  characters that will shut it down, try running linecheck with	those
  characters escaped, as above.	You can	spot these characters if
  linecheck hangs. If this is the case,	kill it, then look in the
  logfiles. The	last characters	transmitted are	likely to be the
  culprits. Try	it again with these characters escaped.

  In summary, my local termrc has the lines


  escape 29
  escape 157


  and my remote	termrc has the lines




  ignore 29
  ignore 157


  since	my remote linecheck.log	said to	escape 29 and 157.


  4.9.	Try Running term


  Log into the remote system, making the link as transparent as	possible
  (if you have not already done	so).  Fire up term at the remote end.  I
  use the following:

  exec term -r -l $HOME/tlog -s	38400 -c off -w	10 -t 150.

  Let us run down each option one by one (note that I could just as
  easily have put these	options	in my termrc. I	did it this way	because
  it saves editing a file while	getting	term set up).

  exec means to	destroy	your current shell, running the	given program in
  its place.  I	exec things because I do not intend to use my login
  shell	again; so it is	just wasting memory. If	you are	debugging the
  link and can reliably	kill the remote	term, you might	not want to do
  an exec.

  The -r option	is needed at exactly one end. term will	then see this
  end as the remote end	of the connection (Note	that term's remote end
  can thus be your local machine). If you do not use this option at one
  end term clients will	spontaneously crash.

  -l $HOME/tlog. This logs errors to the file tlog in my home directory.
  Very useful for debugging. No	reason not to do this.

  -s 38400 : I have got	a 14400	baud modem, with compression.  For
  optimal compression ratios, I	want to	be able	to push	bits down the
  pipe as fast as possible. For	a slower modem,	you should use something
  lower.  Note that if you have	a slower machine with 16450 uart on your
  serial port, high baudrates can cause	data loss by overloading the
  chip on your serial port. term will recover from this, but if	you see
  a lot	of error messages in your log file, (or	get overrun warnings
  from linux kernel versions 0.99pl15 and up) you again	might want to
  lower	this number.

  -c off : This	turns data compression off. I have got a compressing
  modem, and I do not want to compress things twice.

  -w 10	-t 150 : Again,	these are options to optimize my fast modem
  link.	 I have	set my window to 10 and	my timeout to 150. This	is
  according to the recommendation in the term_setup man	page.

  Escape back to your local machine and	suspend	your comm program (^Z
  under	kermit). You do	not want it running while term is running,
  because it will fight	with term over the serial port.	If you can
  convince your	modem to not hang up when you exit your	comm program
  (when	it toggles DTR), you could just	exit the program at this point.

  Now run term locally.	I use:

  term -c off -l $HOME/tlog -s 38400 -w	10 -t 150 < /dev/modem >
  /dev/modem &

  I need to tell term where the	modem is; so I point both standard input
  and output at	/dev/modem (that is what the < and > do). I also run it
  in the background; so	I can use this screen for something else if I
  want to.
  term should work now :-). Try	a trsh,	and see	what happens. If you
  hang,	or your	link seems slow, take a	look at	your tlog at each end.
  Are you getting timeouts or error messages? If so, then you have
  configured something incorrectly. Try	again (after you have finished
  reading this :-). Note that the connection will not seem blazingly
  fast,	especially if you are using compression	- it will be a little
  jumpy. The real speed	comes in during	file transfer and the like.


  4.10.	 Terminate your	term connection


  Most certainly, after	you have done a	lot of work using term,	you want
  to finish your work and bring	your term connection down. For this to
  be realized there are	four ways:


  1. Kill the term programs at both sides of the connection. This is the
     least recommended way of terminating your connection.

  2. A better way is to	execute	the following command locally:


     echo '00000' > /dev/modem



  This will nicely terminate your term connection. It will work	for all
  version of term. Make	sure that the sequence of zeros	contains at
  least	five zeros.

  3. In	the termrc of term versions 2.0.0 and higher you can now enter a
     statement called terminate	'<some string>'. This sets a string that
     will cause	term to	exit ('00000' by default). It must be at least 5
     characters	long, to avoid accidently terminations.

  4. Starting with version 1.14	there is the program tshutdown (actually
     for version 1.14 it is available as a patch, for newer versions it
     is	in the package). Executing tshutdown nicely terminates your term
     connection.


  4.11.	 Optimizing your connection


  Once you have	got term running, you might want to try	to get things
  optimized. A good way	to measure the speed of	your link is to	run tmon
  in one window	while up/downloading a file in another.	Try both (big)
  text files and compressed files; the plain text should go a factor of
  two-ish faster than the compressed files.  The parameters you	want to
  fiddle with are baudrate (-s), compression (-c), windows (-w), timeout
  (-t) and retrain (-A).

  Watch	out with the retrain parameter.	With term version 1.19 I got a
  performance decrease of 80% to 90% compared to running term without
  the retrain parameter. It is not clear if this is a bug in term
  version 1.19 and if this problem exists only with term version 1.19.

  Baudrate: the	maximum	number of bits per second term will try	to send
  over the serial link.	term will avoid	sending	characters at a	higher
  datarate than	this. The default is to	use the	speed of your computer's
  serial port, but be warned that this may be too high if your modem
  runs at a lower rate over the	phone line. The	baudrate option	is
  intended for systems that buffer output to the modem.	During setup and
  tuning it is better to use a small baudrate rather than one which is
  too large. For high speed links (> 38400), making it unlimited is
  probably advantageous. This is achieved by using the value 'off'. term
  will then rely solely	on your	kernel to do flow control.

  Compression: you want	this on	if you do not have a compressing modem.
  If you do have such a	modem, turn compression	off, otherwise you will
  be compressing things	twice, which typically increases the amount of
  data transmitted. Compressing	modems are those that use the MNP-5 or
  V42.bis protocols. Check your	modem documentation and	the message when
  your modem connects.

  Windows: this	is the number of chunks	of data, or packets, that term
  will let go over the line before it gets an acknowledgment (or ack)
  from the remote term.	For fast modems, increasing this can be	a win;
  for slower links this	can overwhelm the remote end.

  Timeout: the time term will wait for an ack. If you have increased
  windows, and you are getting timeouts	in your	logfile, try increasing
  this.

  For 14400/V42.bis, I use -c off -w 10	-t 150.	I get around 1700 cps on
  compressed files and 3500 cps	on ascii files using tupload.


  4.12.	 Troubleshooting


  In this section some thoughts	are given about	what to	check when you
  have problems	executing term or one of its clients.


  o  Did you clean up the term directory structure? With newer versions
     of	term the structure of the directory tree under
     /usr/local/lib/term has changed a couple of times.	If you are not
     aware of this, it can cause all kinds of error messages. The best
     thing to do is to delete the directory tree under
     /usr/local/lib/term (save your termrc) and	then install your new
     term version. This	way, you avoid the struggle with a messed up
     directory tree.

  o  Did you remove old	sockets? When you update your term version
     remove all	the sockets (called socket=) created by	term. No doing
     this can cause strange problems. To find out what socket term is
     listening to you can use the "netstat" program.

  o  term does not compile correct on sunOS 4.1.3? You have configured
     term with './configure --user'. During compilation	you are	getting
     a assembler error on a unknown '-k' flag. The reason of this error
     is	unknown. The solution to this error is to configure term with
     static libraries. So, you have to do './configure --user --static'
     and then continue with the	compilation process the	way you	normally
     do. Now term should compile correct.

  o  Are you running the right binary? term has	been updated quite a
     lot, and many systems have	different versions of the programs
     floating around. Make sure	you are	using the right	version. Note
     that this applies to linecheck too. You can use bash's type -a or
     the whereis command to find which program is being	run.  term
     versions after 1.11 should	print out their	version	number when they
     start up.	(Although version 1.14 claims to be 1.12.  Sigh.)

  o  Do	you have the right termrc in the right place? Depending	on the
     version of	term you are running and the way you installed term
     (being root or user) this file has	to be in one of	the following
     directories:


     $HOME/.term/termrc
     $HOME/.term/termrc.<server>
     $HOME/term/termrc
     $HOME/term/termrc.<server>
     /usr/local/lib/term/termrc
     /usr/local/lib/term/termrc.<server>
     /etc/termrc
     /etc/termrc.<server>



  Some systems have pre-installed termrc's; make sure they are gone
  before you set things	up. If you are running things as root, lookout
  for /.term. term creates files (sockets actually) while it is	running;
  so it	has its	own directory, ~/.term,	where the file termrc goes
  (note, there is no leading dot in termrc!).

  o  Does term find its	termrc file? when you start up term at both
     sides, you	should see messages like the one below:


     Term version: 2.2.9
     Reading file:  /usr/local/lib/term/termrc
     Using shared mode.



  When the second line is missing term cannot find its termrc file and
  you know that	something is gone wrong	during the installation	(unless
  you are not using a termrc file and enter all	the options to the com-
  mandline :-).	Check the place	and the	permissions of the termrc file
  on the site term cannot find its termrc file.

  o  Is	you term or .term directory mounted with NFS? If your term or
     .term directory is	mounted	with NFS you need to set the flag
     -DTERM_NFS_DIR in the CFLAGS line of the Makefile.	Alas, for the
     author this flag causes a compile error when term 1.19 is compiled
     on	a machine running sunOS	4.*.

  o  Are all files and directories owned by the	correct	user and group
     and do they have the correct permissions? This should be no
     problems as these permissions are set during the installation
     phase. However, when you port your	own programs to	term you must be
     aware of this. Also when you change the mode term is working in
     (i.e. from	private	mode to	shared mode) file and directory
     ownerships	and permissions	have to	be adapted.

  o  You are getting the error gethostbyname: <hostname>: Non-
     authoritative `host not found', or, server	failed

     To	solve this you have to check the following things:


     1.	Is the file /etc/hosts configured correctly? <hostname>	is not
	the name of your host (old SLS releases	and some old and new
	Slackware releases are shipped with hostname 'darkstar'	for
	example). Change this in this file. It must at least contain a
	line like below	(the format is described above it):


	# Local	Hosts Format:
	#  IP_NUMBER		HOSTNAME	ALIASES
	#
	# Here is the name of your host, first,	followed by any	aliases
	127.0.0.1	localhost	linuxpc.domain	linuxpc

     2.	Are your /etc/rc* and /etc/resolv.conf files world readable
	(chmod ugo+r)?

     3.	Last, make sure	that you have installed	the TCP/IP loopback-
	interface on your machine.

  o  Are you getting all kinds of 'timed out' messages in your term log
     files?  This means	that your term connection is not optimized. A
     small number of these messages every now and then is not a	problem.
     These are most certainly due to temporal factors influencing the
     physical connection between your local and	remote hosts.

     When you get a lot	of these messages all the time your connection
     will slow down considerably. You have to fiddle with the parameters
     mentioned in the section 'Optimizing your connection' above. Alas,
     this part of the installation is a	process	of trial and error. No
     hard rules	can be given about the numbers to be presented to the
     various parameters	as many	factors	have an	influence on the
     connection. These factors differ between the connections and even
     in	time.

  o  Normal FTP	with redirected	ports does not work for	you? Alas, it is
     a known problem that redirection of the ports needed by FTP (20 and
     21) does not give you a working FTP. The only solution is to get a
     term-aware	ftp or ncftp version. Alas, also some term-aware ftp
     versions seem not to work.


  5.  term clients


  term provides	several	default	clients. They include trsh, tmon,
  tupload, tredir, txconn and in newer versions	trdate,	trdated.
  Furthermore, starting	with version 2.0.0 tudpredir is	available and
  from version 2.1.0 tdownload is available. This section will deal with
  trsh,	tmon, tupload, tdownload, trdate and trdated.  The others each
  have their own section.  No term client will work until you have
  established a	term link.

  tmon is a simple utility to monitor the statistics of	your link.  It
  prints a time	histogram of characters	transmitted and	received. It is
  invoked simply as tmon. Since	around version 1.11, tmon has had a bug
  that causes some information to be garbled (??).

  trsh is similar to rsh. Without arguments, it	spawns an interactive
  shell	on the remote system (i.e. it logs you in).  trsh is one of the
  primary means	of accessing the remote	end of the link	via term. If
  given	an argument, trsh executes that	argument as a command on the
  remote system. For example trsh ls would give	you a listing of the
  files	in your	home directory on the remote system.

  tupload will transfer	a file,	given as its first argument, from local
  to remote. By	default, the files will	be put in the same directory
  that you invoked term	from at	the other side.	To put files in	another
  directory, give their	names as a second argument to tupload. For
  example, if I	want to	put a copy of the file term114.tar.gz in
  /usr/tmp on the remote system, I would type tupload term114.tar.gz
  /usr/tmp.

  When you use tupload you can use wildcards like in 'tupload a.*'. The
  shell	expands	the wildcard and tupload is called as 'tupload a.1 a.2
  ......'.

  tdownload will transfer a file, given	as its first argument, from
  remote to local. By default, the files will be put in	the same
  directory that you invoked term from at the local side. To put files
  in another directory,	give their names as a second argument to
  tdownload. For example, if I want to put a copy of the file
  term114.tar.gz in /usr/tmp on	the local system, I would type tdownload
  term114.tar.gz /usr/tmp.

  When you use tdownload you cannot use	wildcards like in 'tdownload
  a.*'.	Reason for this	is that	the remote directory is	not available to
  your local shell when	you use	tdownload; so your local shell cannot
  expand the wildcards.

  trdate is a time setting utility. It reads the time on the remote
  machine and sets the local clock to the remote time. It must be run as
  root.

  trdated is the daemon	version	of trdate. When	it is started in
  rc.local it is run as	daemon in which	case it	updates	the time every 5
  minutes (default). Even when there is	no term	connection, this daemon
  will start up	when set in the	rc.local. Once a term connection is
  created it starts updating the time.


  6.  X	and term


  term allows users to open up X windows on the	local machine from
  clients that are running on a	machine	on the network.	This is	done by
  using	the txconn client. txconn is executed on the remote, network-
  connected machine; it	is invoked simply as txconn. It	goes into the
  background and returns a number on the standard output; this number is
  the display number that clients should use to	access the X server on
  the local machine. An	example	should make this clear.	 I am logged in,
  via trsh, to my remote term host, named foo. On foo, I do the
  following



  foo$ txconn
  Xconn	bound to screen	10
  :10
  foo$



  Now, on any host that	I wish to run an X client on, that is to display
  on my	local machine's	X server, I do


  setenv DISPLAY foo:10



  (for bash you	should use export DISPLAY=foo:10). In some cases it can
  furthermore be necessary to do a xhost + foo on your local machine.
  Now when I start the client, it will try to connect to screen	10 on
  machine foo, but txconn is listening to this screen, and will	forward
  all X	protocol packets via term to the X server on the local host -
  i.e. the window will open up on your local machine.

  It is	possible to go the other way - run a client on your local
  machine and have it open up a	window on a remote machine on the
  network; however we will defer explaining this until after we	have
  discussed tredir.

  txconn is not	terribly secure; anyone	can connect to your local server
  via term and perform all sorts of mischief. If you are worried about
  this sort of thing, it might be a good idea to consider using	xauth to
  authorize your connections. Consult the xauth	man page.

  The X	protocol is not	very efficient;	it wastes some bandwidth. This
  is usually not a problem over	an ethernet, but can be	murder over a
  modem. X11R6 is supposed to introduce	a low bandwidth	version	of the X
  protocol, LBX. If however you	are using X11R5	you can	use a utility
  named	sxpc which compresses the X protocol, improving	response over
  serial lines.	sxpc includes a	write-up on how	to get it working with
  term,	and is recommended. The	sxpc package also explains how to use
  xauth; so it is doubly recommended.


  7.  tredir


  tredir is one	of term's most powerful	utilities, allowing most
  important network services to	be performed over a term link. Before we
  explain how to use tredir, it	is necessary to	give some background on
  network services. We have talked about network services before, but we
  have not said	exactly	what they are. Services	are just that -	services
  that are provided by the network. Examples of	services include telnet,
  which	provides logins	between	machines, the File Transfer Protocol,
  ftp, which transfers files between machines, and smtp, the Simple Mail
  Transfer Protocol, which is used whenever you	send electronic	mail.
  Each network service has a port number associated with it.  The
  mapping of port numbers to services is given in the file
  /etc/services. This file should be the same on all internet-connected
  machines.

  How are these	services invoked? Each networked machine runs a	daemon
  called inetd,	which listens for attempts to connect to the network
  ports. These requests	can come from either the network or the	local
  machine. A network service is	obtained by connecting to a particular
  inetd	port.  When a network request is made, inetd knows exactly which
  service is involved by the port number the request is	made on. If
  inetd	is configured to do so,	it provides the	relevant service to the
  requesting connection. inetd's configuration is given	by the file
  /etc/inetd.conf, which has a list of the services that inetd provides.
  For more information,	see the	man pages for inetd and	inetd.conf.

  You can communicate directly with network services by	using telnet
  (n.b.	not termtelnet). For example, to talk to the sendmail, (or smtp)
  daemon on machine machine_name, you can do a telnet machine_name smtp,
  or telnet machine_name 25, (since 25 is the number assigned to smtp in
  /etc/services). You should get a polite greeting from	the daemon on
  the remote machine. This is a	very useful trick for debugging	network
  problems and checking	ports redirected with tredir (see below).

  tredir works very much like inetd. It	runs in	the background as a
  daemon, listening to the network ports, waiting for a	request. When a
  request for a	service	is made, instead of providing that service, as
  inetd	does, tredir forwards the request over the term	link to	the
  remote term, which makes the request over the	network, returning the
  result back over the link to the local client. tredir	can forward the
  request to any machine on the	network, but by	default	sends it to the
  machine at the other end of the term link.  tredir ``redirects'' TCP
  (Transmission	Control	Protocol) network services over	the term link.

  The common command format of tredir is:


  tredir [this_computer:]port [that_computer:]port




  An example should make this clear. Let us redirect a local port to the
  telnet port on the remote machine. To	do this	we would do tredir 2023
  23. Now, anyone who connects to port 2023 on the local machine will be
  redirected to	port 23	(telnet) on the	remote machine.	 Here is an
  example session; the local machine is	mymachine.modem.home and the
  remote machine is netsun.



  $ tredir 2023	23
  Redirecting 2023 to 23
  $ telnet localhost 2023
  Trying 127.0.0.1...
  Connected to mymachine.modem.home
  Escape character is '^]'.


  SunOS	UNIX (netsun)
  login:



  This example is actually quite useful. If I were instead to do the
  tredir on netsun. I could then telnet	in to mymachine	from the network
  simply by connecting to the redirected port on the networked machine
  (using telnet) - i.e.	telnet netsun 2023.

  The general principle	in using tredir	is to redirect the desired
  service to a machine on the network. Our next	example	will allow us to
  read news on the local machine over our term link from a news	server
  on the network. News is provided by the nntp service,	port number 119.
  All decent news readers allow	you to specify what port number	they
  will use, either via a configuration file or an environment variable.
  Let us specify this local port to be 2119. Now, let us say that our
  news server is news.domain.org. We will redirect port	2119 to	port 119
  on news.domain.org; we will then tell	our news reading software that
  the nntp server is located at	port 2119 on the local host. Since this
  will depend on the news reader that you use, I will just test	the link
  with telnet instead of firing	up a news reader:


  $ tredir 2119	news.domain.org:119
  Redirecting 2119 to news.domain.org:119
  $ telnet localhost 2119
  Trying 127.0.0.1...
  Connected to mymachine.modem.home.
  Escape character is '^]'.
  200 news.domain.org InterNetNews NNRP	server INN 1.4 07-Dec-41 ready
  (posting ok).



  If you can get this far, all you have	to do is configure your	news
  reader to be able to read news via term. (n.b., if you read news like
  this,	be sure	that in	all your posts you set a Reply-To: header to an
  network email	address	that you can be	reached	at, otherwise people who
  want to get in touch with you	will be	sending	mail to	whatever (wrong)
  data your newsreader puts in the From: header).


  7.1.	tredir can bite!


  The astute reader, after reading the last example will be wondering
  why port 2119	was redirected to port 119 - since newsreaders default
  to port 119, why could I not do a tredir 119 news.domain.org:119 and
  skip the newsreader configuration? The answer	is that	all ports
  numbered less	than 1024 are ``reserved ports'', and only the superuser
  can listen to	them. If one is	willing	to take	a security risk	and make
  tredir an suid program, or run tredir	as root, then one can redirect
  reserved ports and avoid the hassle of renaming services.

  Another problem with using reserved ports is that inetd is often
  already listening to these ports, and	only one program at a time can
  listen to a port. In order to	use such a port, you must change
  inetd.conf so	that inetd no longer listens to	the port you want to
  redirect. This is most easily	done by	commenting out the line	with the
  offending service by putting a # character at	the beginning of the
  line.	The superuser must then	send inetd a HUP signal	(kill -1 inetd-
  pid) to get it to reread its configuration.


  7.2.	Stupid tredir tricks


  In this section we will describe some	of the more common uses	for
  tredir. We have already described how	to redirect nntp and telnet
  services; here we will give some more	complicated examples.


  7.2.1.  X windows


  In a previous	section, we described how to get an X client running on
  the network to open a	window on your home machine using txconn. The
  same technique could be used on your home machine to display a client
  on the machine at the	remote end of your term	link.  But how does one
  display an X client on a network machine that	is not the remote end?
  The answer lies in knowing that X uses a particular network service
  just like the	other programs we have been discussing.	An X server
  listens for a	network	request	on a port whose	number is given	by the
  formula  port	= 6000 + display number, e.g. an X server managing
  screen 0 on a	machine	would listen to	port 6000, if it were managing
  screen 2, it would listen to port 6002.  When	you set	your DISPLAY
  environment variable to xmachine:n, your X clients will try to connect
  to port 6000 +n on xmachine.

  We can use this to trick X clients on	your local machine to open up
  windows on remote displays. Let us say I want	to open	up an xterm,
  running on my	local machine, on display 0 of machine xmachine, which
  is running some place	on the network.	 I first pick a	local display
  number, say 2	(do not	use 0, since that is what your local X server
  will be using). I will map this display to display 0 on xmachine. In
  terms	of ports, this means I want to redirect	the local port 6002 to
  the remote port 6000.	 I do the following



  $ tredir 6002	xmachine:6000
  $ setenv DISPLAY localhost:2
  $ xterm




  This should open up an xterm on machine xmachine.  Note that I set the
  DISPLAY to localhost:2. This is because X clients will sometimes use
  unix domain sockets instead of internet domain sockets, at their own
  option, when connecting to a local display, if DISPLAY is set	to :2.
  localhost:2  says to use a tcp connection.


  Note that as far as xmachine is concerned, the X request is coming
  from the machine on the remote end of	your term link (remotemachine) -
  so if	you need to authorize the connection, you should either	do an
  xhost	+ remotemachine	on xmachine or use xauth to update the
  .Xauthority file on your local machine for display number 2, using the
  key from xmachine.

  Again, to speed up X connections, you	can use	the program sxpc, which
  includes an explanation of how to use	tredir to establish the	link and
  authorize it using xauth.


  7.2.2.  Mail with term


  Well,	you asked for it. Electronic mail has the justifiable reputation
  of being one of the most difficult things to get working right on a
  UNIX system. To really get term working correctly with mail means that
  you have to understand how mail works, which is beyond the scope of
  this document. To learn more about mail, you should consult a	book on
  UNIX system administration and/or the	comp.mail.misc FAQ, available
  for anonymous	ftp on rtfm.mit.edu in pub/usenet/comp.mail.misc. There
  are also currently two packages available for	anonymous ftp on
  sunsite.unc.edu that will help you get mail running under term - they
  are term.mailerd+smail by Byron A. Jeff and the BCRMailHandlerXXX by
  Bill C. Riemers.

  That being said, we will give	a thumbnail description	of how mail
  works.  There	are two	parts to getting mail running, sending messages
  and receiving	messages. We will begin	with sending messages from your
  local	box to the network.

  There	are two	classes	of mail	programs. The first is the mail	user
  agent	(MUA). MUA's help you read, compose and	send messages. Examples
  of MUA's are elm, pine, Mail and vm.	MUA's do not really do any
  networking; they just	put the	messages together - the	real work of
  sending mail is done by the second class of mail programs, the mail
  transfer agents (MTA's). These are invoked by	the MUA's. They	take the
  message, decide where	to send	it by looking at the address, and then
  actually deliver it over the network.

  The two most common MTA's on Linux systems are sendmail and smail. The
  basic	idea is	to get your MTA	to connect to another MTA running on a
  machine on the net that will know what to do with your message. This
  is done by redirecting a local port to the smtp port on the net
  machine. You then have to tell you MTA to take any message it	does not
  know what to do with,	and send it out	over the redirected port on your
  local	machine	to the MTA on the remote machine, which	will then route
  your message to its correct destination.

  How do we do this using smail?  We first redirect a port to the smtp
  port on the network mail machine (mailhost):

  tredir XXXX mailhost:25

  here XXXX is the port	number that the	smail on the localhost will
  connect to (note that	I have to give this port a name	in my
  /etc/services	to get smail to	recognize it). smail has several
  configuration	files that usually live	in /usr/local/lib/smail. The
  ones we care about are config, routers and transports. Note that I am
  assuming you have already got	smail configured correctly for local
  mail - delivery to files and pipes and such things.  Again, consult
  the documentation if you have	not.

  In the file config, we put the following definition:

  smart_path=localhost



  localhost is the machine that	smail connects to when it does not know
  what to do with a message.

  In routers we	put



  smart_host:
  driver=smarthost,
  transport=termsmtp;
  path = localhost



  In transports	we put



  termsmtp:	   driver=tcpsmtp,
	  inet,
	  return_path,
	  remove_header="From",
	  append_header="From: YOUR_NET_ADDRESS",
	  -received,
	  -max_addrs, -max_chars;
	  service=YOUR_SMTP_SERVICE,



  In the above,	the header lines change	the From header	in all your
  outgoing mail	to the address,	YOUR_NET_ADDRESS, which	is the network
  address you want mail	sent to. If more than one user is going	to be
  using	your term link,	you will have to do something more fancy, like
  keep a database of local user's network addresses and	insert these in
  the From: headers.

  The service line is the name of the local port number	that you have
  redirected to	the smtp port on the network connected machine.	In my
  version of smail, I cannot just set this to a	number,	I have to set it
  to a name, like ``foo'', and then define ``foo'' in my /etc/services
  to be	the number of my redirected port. If you use a suid tredir and
  just redirect	the smtp port (25), you	do not need to define this.

  This should be enough	to get you going. If you decide	to use sendmail,
  the principles are the same but the details differ.  Ronald Florence
  (ron@mlfarm.com) told	me that	the stock Sun sendmail will not	send
  multiple queued messages over	a redirected port; BSD sendmail	8.6.9
  works	fine.  He made the following changes to	sendmail.cf to get it
  working with term. In	his case, the default sendmail port (25) is used
  for SMTP traffic over	a local	ethernet so Internet mail is forwarded
  to a redirected TCP port.


  #
  #Create the termsmtp mailer, which sends mail	via a re-directed TCP port
  #
  Mtermsmtp,P=[TCP], F=mDFMuCXe, S=22, R=22, A=TCP $h PORTNUMBER



  Here,	PORTNUMBER is the number of the	redirected port	on the local
  machine. This	should be an unused port over 2000. We next tell
  sendmail which machine to connect to,	and set	termsmtp as the	default
  mailer.


  #
  # major relay	mailer
  #
  DMtermsmtp
  #
  # major relay	host: use the $M mailer	to send	mail to	other domains
  #
  DR HOSTNAME
  CR HOSTNAME



  Here HOSTNAME	is the name of your local host (does localhost work?).
  The last entry goes under Rule 0 to forward Internet mail.


  # Pass other valid names up the ladder to our	forwarder
  R$*<@$*.$+>$*		  $#$M	  $@$R $:$1<@$2.$3>$4	  user@any.domain



  When the term	connection is established to the Internet host,	run the
  following commands on	the local machine.


  tredir PORTNUMBER internet.host:25
  /usr/lib/sendmail -q



  We now turn to receiving electronic mail using term. We will assume
  that mail is sent to your account on the network machine mailhost. The
  simplest solution is to just use trsh	or termtelnet to log on	to
  mailhost and read your mail on there.	 However, it is	also possible to
  have your mail automatically downloaded to your local	machine. One way
  to do	this is	to use the Post	Office Protocol, (POP).	 POP was
  designed for exactly this purpose: to	deliver	mail to	machines that
  have intermittent network connections. To use	POP, you must have a POP
  server installed on mailhost.	Assuming that you do, you can then use a
  POP client to	download your mail every few minutes. This is done, as
  you might expect, using tredir. The POP service is 110 (note that
  there	is an older protocol, POP-2, which uses	port 109; in this
  document we describe POP-3, which is the latest version of POP). There
  are several POP clients available. One, written in the script	language
  perl is pop-perl-1.X,	written	by William Perry and maintained	by
  myself - it can be found on sunsite in /pub/Linux/system/Mail.

  To use POP, you redirect a local port	to port	110 on mailhost	and
  configure your client	to retrieve your mail from localhost using the
  local	port. As an example, we	will assume that there is a POP	server
  running on mailhost. We will redirect	the local port 2110, and fire up
  the pop-perl client:










  $ tredir 2110	mailhost:110
  Redirecting 2110 to mailhost:110
  $ pop
  Username: bill
  Password: <enter your	password for mailhost>
  Pop Host: name of local
  Pop Port: 2110
  Starting popmail daemon for bill



  If you do not	have a POP server available, the BCRMailHandler	package
  has a	program	to download your mail over a term link to your local
  machine. I have not used it, but anyone who has is welcome to	comment.
  You can also use the term.mailerd+smail package for this purpose.
  Alas,	both BCRMailHandler and	the term.mailerd.smail package do not
  work anymore with term versions 2.0.0	and higher.


  8.  tudpredir


  tudpredir is similar to tredir when you look at what these programs do
  and how they are executed. The big difference	between	the two	programs
  is that tredir is used to redirect TCP network services while
  tudpredir redirects UDP (User	Datagram Protocol) network services over
  the term link. One more important difference between the two programs
  is that tredir becomes a background daemon once it has successfully
  established the local	port, while tudpredir commands must be placed in
  the background manually.

  The common command format of tudpredir is:


  tudpredir [this_computer:]port [that_computer:]port




  9.  Automating Things



  Now that you know how	to get all your	network	services over term, it
  would	be nice	to set things up in such a way that your link is set up
  and configured automatically.	There are basically an infinite	number
  of ways of doing so, depending on what communication program you use
  and how you log in to	your remote system.

  One program that I have not used, but	I have heard is	quite nice, is
  fet: a front end for term. It	is designed to log you into a remote
  system and fire up term and all your tredir's.  Any comments on fet
  would	be most	welcome.

  I shall now give an example of a set of commands that	use kermit to
  log into the remote system and then performs all of the term
  initializations. Obviously, if you use these examples, you will have
  to modify them for your own login procedures.

  The command which is actually	invoked	is the shell script knet, given
  by:





  #!/bin/sh
  /usr/bin/kermit -y $HOME/.kerm_term >	$HOME/klog < /dev/null 2>& 1
  exec $HOME/bin/tstart	>> $HOME/klog 2>& 1



  The script .kerm_term	is given by:



  pause	2
  # The	number you want	to dial
  output atdtXXXXXXX \13
  # Login to the terminal server
  input	145 {name: }
  output MYNAME	\13
  input	3 {word: }
  output MYPASSWORD \13
  input	5 {xyplex>}
  # Make the line transparent
  output term telnet-t \13
  output term stopb 1 \13
  # Connect to the remote host
  output telnet	remotehost.somedomain.org \13
  input	10 {ogin: }
  output MYOTHERNAME \13
  input	3 word:
  output MYOTHERPASSWORD \13
  pause	5
  # Fire up term on the	remote host
  output exec term -s 38400 -l $HOME/tlog -w 10	-t 150	\13
  ! /usr/bin/term -r -l	$HOME/tlog -s 38400 -c off -w 10 -t 150	< /dev/modem > /dev/modem &
  # Open other clients here
  suspend
  !killall -KILL term



  and finally, the script tstart which fires up	the term clients is
  given	by



  #!/bin/sh
  #
  # This lets mail get out, can	read news here,	can pick up my mail here
  #
  /usr/local/bin/tredir	2025 25	2119 newshost:119 2110 pophost:110
  #
  # So I can open up Xwindows here
  #
  /usr/local/bin/trsh -s txconn
  #
  # So I will receive mail....
  #
  /usr/local/bin/pop
  #
  # Clean out the queue, in case of boo-boos
  #
  /usr/bin/runq
  #
  # Done now
  #
  echo ^G^G > /dev/console


  When finally you want	to close the connection, you resume and
  terminate kermit. The	last line of the script	kills the local	term and
  returns the system in	its initial state.

  ( Note of the	author:	instead	of doing '!killall -KILL term',	I think
  it should be possible	just to	do '!tshutdown'. This should also work?)

  As I said, there are zillions	of ways	to do so; these	are just meant
  as examples to get you started. Other	examples can be	found in the
  packages autoterm and	JoelTermStuff.


  10.  Porting software	for use	with term


  In principle,	all programs that can be used over a network can also be
  used in combination with term. Some of them you can get as binaries
  with term support already built in. These include telnet, (nc)ftp,
  Mosaic and many others. Most of these	programs are compiled for term
  1.17 or earlier. They	should,	however, still work with the newer
  versions of term.

  Another way to make programs term aware is to	port them yourself. This
  process will be described in the next	subsection.

  The last way to make your programs term-aware	is to termify them.


  10.1.	 Port and compile the sources


  Porting software to term can be done using a fairly simple porting
  procedure:

  If installed in /usr/local by	root:


  1. Add to the	compile	flags -include /usr/local/include/termnet.h

  2. and add to	the library list -ltermnet

  If installed in your home directory:


  1. Add to the	compile	flags -include ~/term/termnet.h

  2. and add to	the library list -L~/term -ltermnet

  Now compile the software as described	in the INSTALL or README
  document that	came with the software.	That should do!

  At this point	the commands should work both with and without term.


    telnet localhost



  does not use term to connect,	but


    telnet bohr.physics.purdue.edu




  will use term	only if	you do not have	some other type	of network
  connection.

  Some commands	like rlogin can	only be	executed by root and the owner
  of the term connection (privileged persons).

  Some term commands will be term transparent and only use term	when
  there	is not another option.	Some common examples are telnet	and ftp.

  Others require an external flag to tell them it is alright to	use
  term.	These programs include xarchie,	fsp and	 ytalk.

  You can either flag these programs to	use term by setting the
  environmental	variable TERMMODE as specified in README.security, or
  running make installnet. Eventually, the termnet file	created	will
  contain special networking instructions, but for now only its
  existence is checked.

  If you add an	ethernet connection, you can then simply remove	the
  termnet file and continue to use the same binaries!

  NOTE:	Programs that were ported back in the days of client.a,	can
  still	be recompiled for use with newer versions of term simply by
  changing the client.a	reference to libtermnet.a.


  10.2.	 Termify


  This package will convert dynamically	linked binaries	for term use.

  Before you can use termify you have to make sure that	you have term
  version 2.2i (is this	version	2.2.8?)	or later and libc.so.4.5.26 or
  later. Then you have to create the file libt.so.4 in the directory
  /lib (see the	README file in the package).

  Problem at this moment is that you have to remake the	file libt.so.4
  every	time you upgrade term versions.

  After	you have created the library you can let termify 'crunch' the
  program you want to make term-aware, by using	the command:


  termify <command name>



  When you do not like the result you can 'un'termify the program you
  have just termified using the	command:


  termify -u <command name>



  Last,	the package also contains a script for completely termifying
  'smail'; so no special transport definitions are necessary. The only
  thing	you possibly want to change is the 'From: ' address.


  11.  Term clients





  11.1.	 Term clients available	on ftp sites.


  Below	a list of application running with term	is given. I am not
  stating that this list is complete; so any completion	is welcome. As
  far as possible I will present the site and directory	where the
  application can be found (all	to my knowledge). When I state
  sunsite.unc.edu as the place to find the application I mean that you
  can find it in one of	the following two directories:


  1. /pub/Linux/apps/comm/term/apps

  2. /pub/Linux/apps/comm/term/extra

  Here we go :-)

  term package:



       tupload
       tdownload	   (versions 2.1.0 and higher)
       trsh
       tmon
       tredir
       tudpredir	   (versions 2.0.0 and higher)
       txconn
       trdate(d)
       tshutdown
       libtermnet




  File transfer:



       ftpd		   sunsite.unc.edu
       termncftp	   sunsite.unc.edu
       ncftp185		   sunsite.unc.edu:/pub/Linux/system/Network/file-transfer
       fsp		   sunsite.unc.edu:/pub/Linux/system/Network/file-transfer




  Information systems:



       lynx
       Mosaic		   sunsite.unc.edu:/pub/Linux/system/Network/info-systems/Mosaic
       chimera
       netscape		   sunsite.unc.edu:/pub/Linux/system/Network/info-systems
       httpd
       xgopher
       gopher		   sunsite.unc.edu




  Remote login:



  termtelnet	      sunsite.unc.edu
  rlogin	      physics.purdue.edu:/pub/bcr/term/extra
  rsh		      physics.purdue.edu:/pub/bcr/term/extra




  Netnews:



       tin 1.3		   sunsite.unc.edu:/pub/Linux/system/Mail/news
       news2		   sunsite.unc.edu




  Mail:



       slurp		   sunsite.unc.edu
       smail		   sunsite.unc.edu
       term.mailerd+smail  sunsite.unc.edu
       BCRMailHandlerXXX   physics.purdue.edu:/pub/bcr/term




  Automating scripts:



       JoelTermStuff	   sunsite.unc.edu
       autoterm		   sunsite.unc.edu
       fet		   sunsite.unc.edu




  Other	programs:



       inetd		   sunsite.unc.edu
       rdate		   sunsite.unc.edu
       xgospel		   sunsite.unc.edu:/pub/Linux/games/x11/networked
       termify		   physics.purdue.edu:/pub/bcr/term/extra
       xboard		   sunsite.unc.edu
       ircII		   sunsite.unc.edu:/pub/Linux/system/Network/chat
       whois
       xwebster		   sunsite.unc.edu
       sxpc		   ftp.x.org:/R5contrib
       xztalk		   sunsite.unc.edu:/pub/Linux/apps/sound/talk





  11.2.	 The termnet package


  The package termnet-2.0.4-Linux-bin.tar.gz
  (sunsite.unc.edu:/pub/Linux/apps/comm/term) contains a couple	of
  precompiled term clients and a couple	of scripts, manual pages and
  libtermnet.so.2.00.04. The clients are compiled using	this version of
  libtermnet.so. The package contains the following clients:



       fet	   perl	       sperl4.036  tmon	       tshutdown   xgopher
       finger	   perl4.036   suidperl	   trdate      tudpredir   ytalk
       ftp	   rcp	       taintperl   trdated     tupload
       fwhois	   rlogin      telnet	   tredir      txconn
       ncftp	   rsh	       term	   trsh	       xarchie




  WARNING: The package also contains the complete set of compiled
  clients of term 2.0.4	including term itself. Do not install this
  package before you are sure about what you want. You will destroy
  other	versions of term and its clients when you start	moving
  executables around.


  11.3.	 Asked for but not yet supported



  1. DOOM: The problem with this game seems to be the fact that	it uses
     port 5029 both as client and as server.

  2. NFS: The NFS server is only supposed to accept requests if	the
     socket requesting the connection is bound to a port below 1024.
     This seems	to be troublesome. However, some NFS servers have an
     'insecure'	option.	 In this case NFS might	work eventually, if RPC
     support is	added to Term.


  12.  Term and	Security


  In this section I will point to some security	aspects	of term. The
  problems will	be explained and a way to improve security will	be
  given.


  12.1.	 trsh


  trsh is insecure when	it is used to access the local Linux box from
  the remote system. The problem with term and its clients is that
  beside the owner of the term connection also 'root' can execute term-
  aware	programs over the connection.

  This also means that 'root' on the remote system can execute trsh and
  thus can enter the login which owns the term connection quite	easy. If
  this owner on	the local box is 'root'	then you will be in hell.

  The solution to this problem is easy:	you just have to put the
  following line in the	termrc file on the local box:


  denyrsh on



  With this set	in the termrc file, nobody can use trsh	on the remote
  site anymore to access your machine. When you	and others want	to
  access your local Linux box over the term connection this can	still be
  done using telnet and	redirected ports.
  12.2.	 sxpc, xhost and xauth


  sxpc in combination with 'xhost +' is	very dangerous when you	are not
  using	xauth.

  Using	xauth is very important	to maintaining security	when using sxpc.
  If you do not	use xauth when using sxpc all the dangers of running
  with 'xhost +' apply.	These dangers include but are not limited to:


  o  Someone watching what is displayed	on your	screen

  o  Someone watching what you type

  o  Someone typing in one of your windows (for	example: a command to
     delete all	your files :-(

  xauth	is available in	X releases R4 and later. Here I	will describe
  how to set up	basic usage of xauth.  This configuration is vulnerable
  to network snooping, but if you can live with	that it	should be fine.

  NOTE:	when using xauth your $DISPLAY variable	must NOT be set	to
  localhost (or	localhost:whatever). If	your $DISPLAY variable does use
  localhost the	clients	will be	unable to find the appropriate
  authorization	information. The workaround is to use the real hostname
  of the machine. If you follow	the compilation	instructions in	the
  README, and compile without -DNOGETHOSTNAME then everything should
  work.

  The machine where you	will be	running	clients	will be	called C, the
  machine where	you wish to display them will be called	D.

  First	choose a 'key',	up to 16 pairs of hexadecimal digits (so an even
  number of characters from the	ranges 0-9 and a-f).  You will need to
  supply this key in place of <key> in the example below.

  On C:


  % xauth
  xauth:  creating new authority file $HOME/.Xauthority
  Using	authority file $HOME/.Xauthority
  xauth> add Chostname:8 MIT-MAGIC-COOKIE-1 <key>
  xauth> exit



  On D:


  % xauth
  xauth:  creating new authority file $HOME/.Xauthority
  Using	authority file $HOME/.Xauthority
  xauth> add Dhostname/unix:0 MIT-MAGIC-COOKIE-1 <key>
  xauth> add Dhostname:0 MIT-MAGIC-COOKIE-1 <key>
  xauth> exit



  When starting	the X server on	D you should give the flag -auth
  $HOME/.Xauthority.  You may need to edit or create a $HOME/.xserverrc
  to control how the X server is started.  For example:



  #!/bin/sh
  exec X  -auth	$HOME/.Xauthority $*



  Make sure that your .Xauthority file is readable only	by you on both C
  and D.


  13.  Things to remember


  In this section I try	to present you with a list of useful ftp
  addresses, URL's etc.	where you can find software and	information
  about	term.

  ftp:


  sunsite.unc.edu:/pub/Linux/apps/comm/term/<whole-directory-tree>
  sunsite.unc.edu:/pub/Linux/docs/HOWTO
  physics.purdue.edu:/pub/bcr/term/<whole-directory-tree>



  URL:


  http://sunsite.unc.edu/mdw/HOWTO/Term-HOWTO.html
  http://zeus.cs.kun.nl:4080/term-howto/Term-HOWTO.html
  http://physics.purdue.edu/~bcr/homepage.html



  netnews:


  comp.os.linux.announce	   announce of new term	versions and Term-HOWTO
  comp.os.linux.help		   ask your questions about term here
  comp.os.linux.misc		   or here
  comp.protocols.misc		   answers to term questions are also posted here.



  When you start asking	questions on netnews please make sure that you
  give people in the groups as much information	as they	need to	solve
  your problem (term version number, way you set up your connection
  etc.). At this moment	many term versions are in use and all have their
  specific and common problems.	Therefore, when	you want a useful
  answer, at least state the version of	term you are using. Otherwise,
  in some cases	only wild guesses are possible to help you solve your
  problems.


  14.  Reliability of term versions


  Many versions	of term	are around now.	The maintainer of term,	Bill
  Riemers, has made a list of term versions stating what versions are
  reliable and what versions you had better avoid. This	list is	the
  following:





	  term110	   --> cannot really say
	  term111	   --> cannot really say
	  term112	   --> cannot really say
	  term113	   --> cannot really say
	  term114	   --> fairly stable BETA version
	  term115	   --> unstable	BETA version
	  term116	   --> unstable	BETA version
	  term117	   --> unstable	BETA version
	  term118	   --> semi-stable BETA	version
	  term119	   --> stable GAMMA version
	  term-2.0.X	   --> semi-stable BETA	versions
	  term-2.1.X	   --> more stable BETA	versions
	  term-2.2.X	   --> new BETA	versions
	  term-2.3.X	   -->






  15.  Term speed table


  Thanks to Bill McCarthy we now have a	table with term	speed
  information for different modems, term versions and connection
  conditions. Its purpose is to	give new and experienced users some idea
  what other people are	using and the results they are getting.







































			     LINUX TERM	CHART 8/14/94


  |___modem speed/make___|___line speed__|__avg	cps__|__high__|__term ver_|
  | 1)	USR SP 14.4	 |   9600	 |  950	     |	963   |	1.17	  |
  | 2)	USR SP 14.4	 |  14400	 | 1376	     |	n/a   |	1.18p06	  |
  | 3)	Zoom 2400	 |   2400	 |  220	     |	230   |	1.19	  |
  | 4)	Boca V.32bis 14	 |  57600	 | 1400	     |	n/a   |	1.01/09?  |
  | 5)	Viva 14.4	 |  14400	 | 1300	     |	n/a   |	1.16	  |
  | 6)	USR SP 14.4	 |  14400+	 | 1550	     | 1680   |	1.19	  |
  | 7)	Intel 14.4 Fax	 |  14400	 | 1400	     | 1650   |	2.0.4	  |
  | 8)	cable tv hookup	 |  57600	 | 1500	     | 1800   |	1.18p06	  |
  | 9)	Twincom	144/DFi	 |  57600	 | 1500	     | 4000?  |	2.0.4	  |
  | 10)	USR SP 14.4	 |  14400	 | 1200	     | 1500   |	1.08	  |
  | 11)	cable tv hookup	 |  19200	 | 1300	     | 1800   |	1.19	  |
  |-----------------------------------------------------------------------|

  +Command flags/termrc	settings:

  1) default escapes   2) window 5	 3) baudrate 2400    4)	n/a
     baudrate 9600	  timeout 200	    window 3
     window 10				    noise on
     timeout 150

  5) compress off      6) baudrate 19200  7) ignore 19+17    8)	compress off
     window 10		  compress on	     window 4		escape 0, 13,
     timeout 150			     timeout 90		16-19, 255
     baudrate 38400						baudrate 0
								shift 224
								flowcrtl 500
								window 10
								timeout	70
								retrain	on
								breakout 24
  9) compress off     10) compress off	    11)	baudrate 19200
     baudrate 57600	  baudrate 38400	compress on
     window 10		  escape 17, 19		shift 224
     timeout 200	  remote		escape 0, 13 16-17
     noise on					19, 255
     share on					window 10
     remote					timeout	40

  Escaping characters at one end also implies ignoring them on the other end.





  16.  Hints and Tricks	found on the net


  In the Linux related newsgroups many questions about term are	coming
  back every couple of weeks, together with the	answers	to these
  questions. To	reduce traffic to the newsgroup, in this section I shall
  try to make a	composition of these questions and the answers to them.
  Some of the answers have been	checked	by me as I also	had related
  problems. Others, I have just	taken from the newsgroups without
  testing them.


  o  Many people, especially those who are using Ultrix, seem to have
     trouble with vi presenting	less than 24 lines on a	window with 24
     lines. There are two ways to get rid of this problem:



     1.	Log in into the	remote system using: trsh -s telnet < hostname>

     2.	Put 'resize; clear' in your .login file

     3.	The best solutions seems to be to enter	the following remote:
	stty 38400

  o  Many people seem to have problems with crashing term connections,
     whatever may be the reason	of the crashes.	So before starting
     applications people want to know whether their term connection is
     still alive or not. This can be checked using the following small
     shell script examples:


     When you are using	tcsh:

     if	( { trsh -s true } ) then
       ...
     endif



  When you are using bash:


  if trsh -s true; then
    ...
  fi



  o  The new WWW browser called	Netscape is causing people problems to
     get it to work with term. The good	news is	that it	will work under
     term. Here	is how:


	     1.	Termify	netscape
	     2.	Edit /etc/services to declare port 1080	(or another port if you
		like) for http like:
		   Service	     Portno./kind	     Used by
		   http		     1080/tcp		     term
	     3.	execute	'tredir	1080 80'
	     4.	Fire up	termnetscape
		   under Options | Preferences | Mail/Proxys
		   leave _all_ of the proxy boxes blank
		   set the SOCKS box to	'term' & 1080



  When you exit	the Options menu, you will get a warning about 'unknown
  socks	server'; just ignore it.


  17.  Other Things


  Some things that might be included:


  o  Extension of troubleshooting

  o  Extension of security issues

  o  Termwrap


  o  Suggestions

  Anyway, if you have suggestions, criticism, suggestions, or anything
  else to say about this document, please fire away. As	Bill Reynolds is
  very busy at the moment I, Patrick Reijnen, have taken over the
  authorship of	the Term-HOWTO.	I can (currently) be reached at
  patrickr@cs.kun.nl or	patrickr@sci.kun.nl.


  18.  Acknowledgements


  A lot	of people have to be thanked. First and	foremost Michael
  O'Reilly and all the developers of term, who have provided us	with
  such a great tool. I would also like to thank	everyone who gave
  feedback and contributed to this HOWTO. They include Ronald Florence,
  Tom Payerle, Bill C. Riemers,	Hugh Secker-Walker, Matt Welsh,	Bill
  McCarthy, Sergio, Weyman Martin and everybody	I forgot to mention.