[net.bugs.4bsd] Pseudo terminal problems

andy@cheviot.UUCP (Andy Linton) (02/18/85)

Here at the Computing Lab we have attempted to connect one of our
VAX  to  the  campus  network  NUNET.  The VAX is running BSD 4.2
UNIX.  The interface software is taking advantage of 4.2's pseudo
terminal feature.

Our problem stems from how echoing is handled on both  NUNET  and
UNIX:

Terminal         Network         Interface          UNIX
   1 --------------
                   | 2
     <-------------
                   :
                    ----- 3 ----->   4  ----------->
                                        <----------- 5
                    <---- 6 ------
   7 <-------------

The user enters data at a terminal (1), which is  echoed  by  the
network (2).  Eventually the user types a carriage return and the
packet is forwarded by the network to the interface (3).  The in-
terface  writes the data into the master end of a pseudo terminal
(4).  The user process can read the data from the  slave  end  of
the  pseudo  terminal,  and (if ECHO is on), echoes the data just
received back to the interface (5).  The interface then dutifully
sends  the  data  back  out  to  the  network  (6), which is then
displayed on the user's terminal once again (7).

NUNET does permit us to turn off echoing.  However, this  results
in  the user not seeing what has been typed until it is echoed by
UNIX.  This solution has not proven popular.

Two other solutions have been tried, neither of which are  satis-
factory:

Solution 1.

Solution 1 involves turning off the Master pseudo terminal  echo-
ing (and everything else) by setting sg_flags=0 before the user's
process is logged into UNIX.

This results in everything typed at the terminal end being echoed
twice, once by NUNET, and then once by the user's UNIX process.

Although this  method  fails  when  the  master  pseudo  terminal
transmits to the slave pseudo terminal in the interface, it works
in a 'C' program which forks a child process.

Specifically, in the test program, the master writes to the slave
(which  performs a read).  The master then performs its own read.
If sg_flags is set to ECHO, the text is echoed back (and the mas-
ter can read it).  If sg_flags is set to 0, nothing is echoed and
the master waits indefinitely (hangs).

The major difference between the interface and the 'C' test  pro-
gram  is  the file numbers assigned to the slave pseudo terminal.
In the interface, the slave pseudo terminal communicates with the
master  using  file identifiers 0, 1, and 2 (the standard process
I/O file identifiers).  While in the test program, the  slave  is
communicating  using  a  higher  file  identifier number (in most
cases it is 4).  Additionally, the child process from the  inter-
face  executes 'login', whereas the test program is simply a sub-
process performing a read.

Due to the lack of success with solution 1, a second solution has
been tried:

Solution 2

Solution 2 is written so that the master keeps the file  identif-
ier  of the slave pseudo terminal which it spawned.  Whenever the
master attempts to write to the slave, it turns slave's the echo-
ing  off  (using  an  ioctl).  Once the write is done, the master
checks an internal flag to determine if  echoing  should  be  re-
stored.  If slave echoing must be restored, another ioctl is per-
formed.  The algorithm is essentially:

     IOCTL(slave echo off);
     WRITE(message to slave);
     if SlaveWasEchoing then IOCTL(slave echo on);

This method, although inelegant, works most of the time.   Howev-
er,  every  48-72 hours or so, the ioctl (turning off slave echo-
ing) hangs.  Originally, the ioctl call turning the echo off used
a  TIOCSETP  call,  which caused the process to wait (hang).  The
current version (which still occasionally hangs) uses a TIOCSETN.

Note that it is important that the UNIX process be allowed to set
and  reset  the ECHO flag as it would do for a directly connected
terminal.  It is from the value of the ECHO flag that the  inter-
face  informs  NUNET  when  to  echo (or suppress echoing) at the
user's terminal.  The most common example of this is the suppres-
sion of echoing when prompting for the user's password.

Has any other user of pseudo terminals had a similar problem?  If
so, how was it fixed?

Thanks,
Larry Hughes
Computing Laboratory
University of Newcastle upon Tyne
England


Aindrias Mac Giolla Fhionntain - Computing Lab., U of Newcastle upon Tyne 
	ARPA	: andy%cheviot%newcastle.mailnet@MIT-MULTICS.ARPA	     
	UUCP	: UK!ukc!cheviot!andy					     

***  Ni fui moran beagan d'aon rud, ach is fui moran beagan ceille.  ***

jsdy@hadron.UUCP (Joseph S. D. Yao) (02/20/85)

> Our problem stems from how echoing is handled on both  NUNET  and
> UNIX:
> 
> Terminal         Network         Interface          UNIX
>    1 --------------
>                    | 2
>      <-------------
>                    :
>                     ----- 3 ----->   4  ----------->
>                                         <----------- 5
>                     <---- 6 ------
>    7 <-------------

BB&N and/or Perkin-Elmer TCP-IP code do the following:
While in cooked mode, echoing is local (1-2), and remote echoing
(5-6-7) is turned off.  Packets are sent per line.  When in raw/cbreak-
noecho mode, character transmission is single-character-at-a-time.  It
works well.

Joe Yao		hadron!jsdy@seismo.{ARPA,UUCP}