[comp.os.os9] PTY-Filemanager for os9/680x0

mellin@lan.informatik.tu-muenchen.dbp.de (Reiner Mellin) (07/17/89)

Hello,
The following shar-archive contains a beta-version of my pty-filemanager.
If you find any undocumented differences to the SCF+driver Version of the 
ptys or bugs please drop me a message.

Highlights:
	- unlimited number of ptys (memory dependant)
	- any legal os9-filename for a pty: e.g: '/[pt]ty/any$name_u$like'
	- faster than the SCF+driver version (faktor 2 and I expect to
	  get a factor of at least 4 soon).

To install it , just uudecode all *.uu files and load these via 'load'.

I have heard that microware has a PTTY-Filemanger too, how do mine and their
version differ ?

Have Fun ....
	Reimer
PS: i use ptys mostly for 'screen' and 'mgr'.
PPS: all written in C, is there some interest in the sources ?

#! /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:  MANIFEST COPYRIGHT ptyman.doc pty.uu ptydrv.uu ptyman.uu
#   tty.uu
# Wrapped by ram@ramsys on Mon Jul 17 00:00:38 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MANIFEST'\"
else
echo shar: Extracting \"'MANIFEST'\" \(288 characters\)
sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
X    COPYRIGHT           -- a copyright notice
X    pty.uu              -- descriptor for pty-devices
X    ptydrv.uu           -- dummy driver
X    ptyman.doc          -- some documentation
X    ptyman.uu           -- the pty Filemanager
X    tty.uu              -- descriptor for tty-devices
X
END_OF_FILE
if test 288 -ne `wc -c <'MANIFEST'`; then
    echo shar: \"'MANIFEST'\" unpacked with wrong size!
fi
# end of 'MANIFEST'
fi
if test -f 'COPYRIGHT' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'COPYRIGHT'\"
else
echo shar: Extracting \"'COPYRIGHT'\" \(1562 characters\)
sed "s/^X//" >'COPYRIGHT' <<'END_OF_FILE'
X*        This software is copyright (C) 1989 by Reimer Mellin        *
X*                                                                    *
X*        Permission is granted to reproduce and distribute           *
X*        this package by any means so long as no fee is charged      *
X*        above a nominal handling fee and so long as this            *
X*        notice is always included in the copies.                    *
X*        Commerical use or incorporation into commercial software    *
X*        is prohibited without the written permission of the         *
X*        author.                                                     *
X*                                                                    *
X*        Other rights are reserved except as explicitly granted      *
X*        by written permission of the author.                        *
X*                Reimer Mellin                                       *
X*                                                                    *
X*                Sulenstr.8                                          *
X*                D-8000 Muenchen 71 (Federal Republic of Germany)    *
X*                                                                    *
X*           EMAIL:                                                   *
X*                mellin@lan.informatik.tu-muenchen.dbp.de            *
X*                ram@altger.UUCP                                     *
X*                ....!pyramid!tmpmbx!doitcr!ramsys!ram (home)        *
X*                                                                    *
END_OF_FILE
if test 1562 -ne `wc -c <'COPYRIGHT'`; then
    echo shar: \"'COPYRIGHT'\" unpacked with wrong size!
fi
# end of 'COPYRIGHT'
fi
if test -f 'ptyman.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ptyman.doc'\"
else
echo shar: Extracting \"'ptyman.doc'\" \(9111 characters\)
sed "s/^X//" >'ptyman.doc' <<'END_OF_FILE'
X                   Pseudo-Terminal (PTY) File-Manager
X                   ==================================
XOverview:
X
X        Pseudo-Terminals (PTY's) are a kind of Interprocess
XCommunication (IPC), which are known on a wide variety of UN*X
Xcomputers, mostly BSD-like systems.  They behave like any other SCF
Xdevices like terminals and printer but are in fact pseudo-devices i.e. 
Xexists only in the memory the system. 
X
X        PTY's have two distinct end-points, namely server-pty and
Xclient-pty, which behaves by default differently.  A server-pty
Xsymbolizes the terminal and a client-pty forms the connection to the
Xapplication programs.  This implies, that the server-pty provides RAW
Xinput and output whereas the client-pty can handle line-editing, echoing
Xand so on. 
X
X        With this mechanism many programms can share one real device,
Xlike a real terminal, via one server which multiplexes all connected
Xserver-pty's.  Something similar can be reached with the usage of pipes,
Xbut pipes have the disadvantage of being not a tty-device with echo,
Xline-editing, interrupt-chars etc. 
X
XExamples:
X    - virtual Terminals: one program multiplexes ptys and displays the
X      outputs on a real Terminal (there exist a programm called 'screen'
X      which does exactly this). 
X    - In a TCP/IP environment, the program 'rlogin' starts a
X      login-process on a pty on the remote machine.
X
X___________________________________________________________________________
X
X                      /***********\             /**************\
X                      *           *             *              *
X                      *   Server- * ----------> *  real Device *
X                      *    Prg.   *             *              *
X                      \***********/             \**************/
X                    ___+  +  +  +_______
X                ___/       \  \         \_______
X            ___/            \  \________        \________
X           /                 \          \_______         \__________
X          |                   |                 |                   |
X    /***********\       /***********\       /***********\       /***********\
X    *           *       *           *       *           *       *           *
X    *  1st Prg. *       *  2nd Prg. *       *  3rd Prg. *       *  4th Prg. *
X    *           *       *           *       *           *       *           *
X    \***********/       \***********/       \***********/       \***********/
X
X'|' meaning client-pty
X'+' meaning server-pty
X
XFig. 1:  Typical Server-Client Application
X
X
XImplementation:
X
X        With OS9-68000 (OSK) a own File-Manager was written, which
Xhandles both types of PTY's : the client-ptys, and the server-ptys while
Xusing only *one* descriptor (device) for each.  Server-ptys must be
Xopened as "/pty/any_valid_name" , client-ttys must be opened (i.e. 
Xconnected) with "/tty/any_valid_name".  The Open-Call for the client-pty
Xwill block until a server-pty with the same name is opened.  PTY's can
Xbe also implemented with the usage of a special device-driver for the
XSCF, but this has serveral draw-backs :
X
X        - A System-Global Variable has to be introduced for the rendezvous
X          of the PTY-pairs (not implementation independent). 
X
X        - For each pair of PTY's there must exist two Device-Descriptors
X          (waste of memory and Device-Table-entries).
X
X        - The number of PTY's pairs are limited !!
X
X        - Block-writes in RAW modus has still to be done on a char-by-char
X          basis with single calls to the driver, as required by the SCF
X
X        When creating a server-PTY the Filemanager searches a list of
Xalready openend server-ptys for the same name.  The name can be any
Xlegal OS-9/68000 Filename (no distinction between upper- and
Xlower-case).  When a identical name is found, the Filemanager return a
XE_CEF-error (File already exists), otherwise the Pathdescriptor (PD) is
Xinserted into this list and some initialisation is done (allocating
XData-Buffers etc.). 
X
X        When opening a client-PTY the Filemanager looks thru the above
Xmentioned list for a already openend server-pty.  If found, it sets a
Xspecial pointer pointing to the PD of the server-pty.  (the Filemanager
Xbasicly distincts server-pty's and client-pty's by the value of this
Xpointer). 
X
XRemark:
X    There exist only *one* named server-pty but there can be many
X    client-ptys listening (although its possibly to I$DUP a
X    server-pty-fd). 
X
X        When closing a Server-Pty, the Filemanager searches for all
Xclient-pty's and sets the special pointer to NULL indicating a
XHANGUP-condition.  He also tries to send a SIGHUP-Signal (value is
Xchangeable via the _ss_dcoff()-Call) to the last/current user of a
Xclient-pty.  Any further I/O calls to a disconnected client-pty will
Xissue a E_HANGUP-Error. 
X
X        Closing a client-pty requires no special tasks but clearing all
Xpending Signals (e.g.  pending _ss_signl() ), which is done automaticly. 
X
X        Although total compatibility to a SCF-Device was intended, the
XPTY-Filemanager does differ in some small aspects from the SCF.  The
Xreason for that were some features of the SCF, which I do consider
Xfaulty e.g.  with a ReadLn-count of one the only character you can read
Xis CR and nothing else (:-( ). 
X
XDifferences:
X    - a Readln-Call with a character count of 1 will return the next
X      character available.
X
X    - The Read-Call may behave differently: kbich and kbach will
X      abort with the appropriate Error-codes. No Echo, but raw-byte-transfer.
X
X    - The Pause-char, Xon-char and Xoff-char are not supported !
X
X    - Any signal < 32 and > 1 (SIGWAKE) will abort a pending I/O with an
X      error-code of the signal.
X
X    - A close of a server-pty will only generate a SIGHUP (see SS_DCOff)
X      and will *not* abort the reading processes (the program 'com'
X      seems to have problems with that !).
X
X
XDescriptions of operation:
X
X- Read-calls:
X    absolute raw-read, ignores echo-parameter, but unterstands kbich and
X    kbach. 
X
X- Write-calls:
X    absolute raw-write ....
X
X- Writeln-calls:
X    recognizes upc, tabch, tabs, alf, pause and returns on recognizing 
X    the eor-char (normaly CR).
X
X- Readln-calls:
X    recognition of echo, upc, bso, bse, bspchar, eorchar, alf (when
X    echoing), kbich, kbach, eof, delchar, rprchar, dupchar and pause.
XCAVEAT:
X    - A final EOR in the input-stream is not necessary and this was
X      deliberatly avoided !!!
X    - The maximum readln-count is 256 Bytes (like in the SCF). You can
X      specify more but the Filemanger will cut it to 256...
X
X- GetStat-calls:
X    supported codes are: SS_Opt, SS_Ready, SS_EOF, SS_DevNm (returns the
X    name of the pty), SS_BlkRd.
X
X- SetStat-calls:
X    supported codes are: SS_Opt, SS_SSig, SS_Relea, SS_EnRTS, SS_DsRTS,
X    SS_DCOn, SS_DCOff, SS_BlkWr.
XCAVEAT:
X    - SS_DCOn, SS_EnRTS and SS_DsRTS are no-ops.
X
XNot supported are null (for padding), pausechar, xon and xoff.
X
X
XDescription of GetStat-Codes:
X
X    - SS_Opt:
X        copy the first 28 Bytes of the option part to the users
X        (a0)-register.
X
X    - SS_Ready:
X        return number of chars available for reading in users d1
X        register, or return E_NOTRDY if no input is available.
X
X    - SS_EOF:
X        always returns 0 in callers d1 register (like SCF).
X
X    - SS_DevNm:
X        return the null-terminated name of the pty into the callers
X        (a0)-register.
X
X    - SS_BlkRd:
X        Read x (in users d2-register) Bytes into buffer, users
X        (a0)-register is pointing to.
X
X
XDescription of SetStat-Codes:
X
X    - SS_Opt:
X        copy the first 28 Byte from users (a0)-register into the option
X        part of the pathdescriptor.
X
X    - SS_SSig:
X        Send signal in users d2-register on receiving the next
X        available character. If another Process is waiting for input,
X        return an E_NOTRDY error.
X
X    - SS_Relea:
X        Clear a SS_SSig action...
X
X    - SS_EnRTS:
X        no-op
X
X    - SS_DsRTS:
X        no-op
X
X    - SS_DCOn:
X        no-op
X
X    - SS_DCOff:
X        Send Signal in users d2-register on closing the server-pty
X        (Carrier-lost condition). The Default signal is SIGHUP (Value: 4).
X
X    - SS_BlkWr:
X        Write x ( in users d2-register ) Bytes from buffer users
X        (a0)-register is pointing to.
X
X
XFinal Thoughts:
X
X        Some tests have shown, that this Filemanager is about 100%
Xfaster than an orthodox implementation with a special device Driver for
Xthe SCF when doing readln/writeln calls.  By using only read/write calls
Xsome can expect even much more throughput (no line-editing stuff etc..). 
X
XThings to do:
X    - more speed (a factor of 2 seems easily reachable) !
X    - shrinking the code
X    - treatment of dir-bit as in PipeMan, to see what ptys are open ?
X    - more lineediting (emacs-style, history ?)
X    - implementing the pausechar and maybe xon/xoff ?
X
XPlease send any suggestions/Bug-reports to:
X    Reimer Mellin
X    Sulenstr. 8
X    D-8000 Muenchen 71
X
X    UUCP: mellin@lan.informatik.tu-muenchen.dbp.de (preferred)
X          mellin@altger.UUCP
X          ....!pyramid!tmpmbx!doitcr!ramsys!ram (home)
END_OF_FILE
if test 9111 -ne `wc -c <'ptyman.doc'`; then
    echo shar: \"'ptyman.doc'\" unpacked with wrong size!
fi
# end of 'ptyman.doc'
fi
if test -f 'pty.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pty.uu'\"
else
echo shar: Extracting \"'pty.uu'\" \(208 characters\)
sed "s/^X//" >'pty.uu' <<'END_OF_FILE'
X
Xbegin 644 pty
XM2OP``0```'X````!````=@55#P"`````````````````````````````````E
XM`#]>`````````!L`9`!K```````````````<````````````````````````C
XD``````!R`````%!T>4UA;@!0='E$<G8`<'1Y`'!T>0``VA'+D
X``
Xend
Xsize 126
END_OF_FILE
if test 208 -ne `wc -c <'pty.uu'`; then
    echo shar: \"'pty.uu'\" unpacked with wrong size!
fi
# end of 'pty.uu'
fi
if test -f 'ptydrv.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ptydrv.uu'\"
else
echo shar: Extracting \"'ptydrv.uu'\" \(187 characters\)
sed "s/^X//" >'ptydrv.uu' <<'END_OF_FILE'
X
Xbegin 644 ptydrv
XM2OP``0```&P````!````8`55#@&@````````````````````````````````=
XM`!Y;````/``````````N`%``4`!0`%8`5@!0```````````P/```3G4R/`#0\
X2`#P``4YU4'1Y1')V````&/)TG
X``
Xend
Xsize 108
END_OF_FILE
if test 187 -ne `wc -c <'ptydrv.uu'`; then
    echo shar: \"'ptydrv.uu'\" unpacked with wrong size!
fi
# end of 'ptydrv.uu'
fi
if test -f 'ptyman.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ptyman.uu'\"
else
echo shar: Extracting \"'ptyman.uu'\" \(8083 characters\)
sed "s/^X//" >'ptyman.uu' <<'END_OF_FILE'
X
Xbegin 644 ptyman
XM2OP``0``%G(````!```69@55#0&@```"````````````````````````````6
XM`!U!````/`````````$``%(`4@`:`!H`&@`D`"H`/@`T`$@`7`!F`'`R/`#+`
XM`#P``4YU`CS__DYU2.?__F%*8``#8$CG__YA0&```\1(Y__^839@``1H2.?_)
XM_F$L8``$S$CG__YA(F```$I(Y__^81A@``4F2.?__F$.8``&*$CG__YA!&``>
XM`CHC3@`B+$D@7R`,(@U.D$J`9PY,WW__(BD`'@`\``%.=4S??_\"//_^3G5."
XM50``2.?,L"!O``0D:``@<%"P*@`!9PAP<+`J``%F!'``8`)P`1U``&X@"F$`'
XM%`XH`&T``59P+[`R2`!F'"`$4H#5P"`*80`3]"@`;0QP'+"$;09*,D@`9PPMN
XM?````-<`'F```28@;P`$'6@``P`">@!@+G!AL#)8`&(6<'JP,E@`90YP`!`RI
XM6``$@````"!@!G``$#)8`$'N`.`1@%@`4H6ZA&W.+40`_$HN`&YG2"!N``0@H
XM:``$)F@`"F`H2BL`;F8>0>X`X"(((`L&@````.!A`!'&2H!F""U+`"I@``$>.
XM)FL`%B`+9M0@%V$`!HQ*@&>\8```E"!N``0@:``$)F@`"F`R2BL`;F8H0>X`_
XM`+?(9R!![@#@(@@@"P:`````X&$`$79*@&8*+7P```#]`!Y@5B9K`!8@"V;*N
XM(#P```(`+4``6BU``#X@+@`^80`0XBU``#)G#B`N`%IA`!#4+4``3F8J2JX`S
XM3F<,(BX`6B`N`$YA`!#42JX`,F<,(BX`/B`N`#)A`!#"</]@``!V("X`,BU`<
XM`#8M0``Z("X`3BU``%(M0`!6(&X`!"!H``0F:``*8$1P`;`K`&YF.$'N`.`B>
XM""`+!H````#@80`0S$J`9B)*:P`(9QQ*:P!J9PAP`#`K`&I@`G`!(@!P`#`KK
XM``AA`!$*)FL`%B`+9KA/[?_D<`!,[0TP_^Q.74YU3E4``$CGP+!*+@!N9@9!G
XM[@`N8`@@;@`J0>@`2B1((%<P*@`4L%!F!$)J`!1*;@`:9@``HDHN`&YF``!N^
XM(&X`!"!H``0F:``*8$1P`;`K`&YF.$'N``"QZP`J9BY"JP`J2FL`:F<(<``P`
XM*P!J8`)P!"(`2FL`"&<(<``P*P`(8`9P`#`K`!QA`!!H)FL`%B`+9K@B+@`^P
XM("X`,F$`#Z`B+@!:("X`3F`H0>X``"`((&X`*B%``"YG""!N`"I"J``N2JX`S
XM#F<.(CP```$`("X`#F$`#VIP`$SM#0#_]$Y=3G5.50``2.?H@&$`!%I*@&9&>
XM2BX`;F84+Q<O+P`(0>X`2B((0>X`+B`(8!@O%R\O``@@+@`J<B[0@2(`("X`Q
XM*G1*T()A``5D4(\H`$J$;`P@;P`$V:@`!'#_8`H@;P`$F:@`!'``3.T!%/_T+
XM3EU.=4Y5``!(Y^B`80`#[$J`9@``ADJN``YF'B`\```!`&$`#K8M0``.9VXBL
XM/````/\@+@`.80`/.B!O``0,J````0``!&,,(&\`!"%\```!```$2BX`;F841
XM+Q<O+P`(0>X`2B((0>X`+B`(8!@O%R\O``@@+@`J<B[0@2(`("X`*G1*T()AL
XM``7\4(\H`$J$;`P@;P`$V:@`!'#_8`H@;P`$F:@`!'``3.T!%/_T3EU.=4Y59
XM``!(Y^B`80`#/DJ`9D9*+@!N9A0O%R\O``A![@`N(@A![@!*(`A@&"\7+R\`_
XM""`N`"IR2M"!(@`@+@`J="[0@F$`";A0CR@`2H1L#"!O``39J``$</]@"B!O*
XM``29J``$<`!,[0$4__1.74YU3E4``$CGZ(!A``+02H!F1DHN`&YF%"\7+R\`/
XM"$'N`"XB"$'N`$H@"&`8+Q<O+P`(("X`*G)*T($B`"`N`"IT+M""80`*>%"/I
XM*`!*A&P,(&\`!-FH``1P_V`*(&\`!)FH``1P`$SM`13_]$Y=3G5.50``2.?(P
XMX&$``F)*@&8``*Y@``"N+RX`_$'N`.`B""!O``@@*``@80`-JEB/(&\`!"!H\
XM`"`@+@#\0C`(`&```,!(>``<0>X`@"(((&\`""`H`"!A``U^6(]@``"D2BX`'
XM;F8&0>X`+F`((&X`*D'H`$HD2"`J``B0J@`,(&\`!"%```1B``!Z+7P```#V!
XM`!Y@+"!O``1"J``$8&0@;P`$(F\`!"-H``@`!"(O``0@%V$`_59@3"U\````#
XMT``></]@0"!O``0@*``$`H```/__#(`````&9[IB$@P```%G`/]^8M)*@&<`9
XM_UI@R@R`````%&>H8L`,```.9P#_&F"V<`!,[0<0__!.74YU3E4``$CGP.!AT
XM``%62H!F``#D8```Y$AX`!P@;P`((B@`($'N`(`@"&$`#)Y8CV```21*+@!N`
XM9@9![@`N8`@@;@`J0>@`2B1(2FH`%&<,+7P```#V`!Y@``"<("H`")"J``QN"
XM%"!7-5``%"!O``0U:``*`!9@``#>(&\`!"(H``@@5W``,!!A``R$8```R$HN/
XM`&YF!D'N`"Y@""!N`"I!Z`!*)$@@5S`J`!2P4&8``*9":@`48```GG`!L"X`T
XM;F8``)0@;P`$/6@`"@!J8```AB!O``0B;P`$(V@`"``$(B\`!"`780#],F``U
XM`&PM?````-``'G#_8%X@;P`$("@`!`*```#__PR`````)&=&8B0,```:9P#_^
XM'&(0#```%6>P8LI*`&<`_O!@P@P``!MG`/]>8+@,@````"9G&&(*#(`````E$
XM9PY@I`R`````)V<`_VA@F'``3.T'`/_T3EU.=4Y5``!(YX``<`&P+@!N9A)*4
XMK@`J9@PM?````-P`'G`!8`)P`$Y=3G5.50``2.?`("1`<`!A``R*2H!F!DIJ%
XM`"9G('``,"H`)BU``!YR(+*`;@QP`#`J`!P(```)9P1P_V`"<`!,[00"__A.-
XM74YU3E4``$CGS*`H`"1!2BX`A&8&<`%@``"V<``P*@`880`*AC5\``$`&D'NH
XM```DB&!&2FH`%&<><``P*@`6(@!P`#`J`!1A``KX<``U0``4<@`R`&`$<``BU
XM`"!O`"`U4``8("\`(&$`_U1*@&P$>O]@($IJ`!AFZB`J``30J@`0L*H`"&.L'
XM(&H`"%*J``@0A'H!3^W_Z$)J`!@@*@`(L*H`#&,H2FH`%&<><``P*@`6(@!P.
XM`#`J`!1A``J&<``U0``4<@`R`&`$<``B`"`%3.T%,/_P3EU.=4Y5``!(Y\BPL
XM)$`@;P`@*"@`!"!O`"`F:``@(&\`)#`J`!2P4&80+7P```#V`!X@!$2`8``!A
XM"'``,"H`%&$`"9(U?``!`!9@``"H("H`!"5```PE0``(2FH`&&<><``P*@`:3
XM(@!P`#`J`!AA``G\<``U0``8<@`R`&`$<``B`"!O`"0U4``4("\`)&$`_EA*!
XM@&T>2FH`%&;N("H`#+"J``ADJ&`:<`-@`G`"+4``'E.$(`1$@"@`8#Q";@!L6
XM8#`@:@`,4JH`#!`0%L!R`!(`(`%A``D,#(````#_8A(,```#9]8,```(9[P,-
XM```)9[I3A$J$;J1/[?_H("H`#+"J``AE-"`J``0E0``,)4``"$IJ`!AG'G``"
XM,"H`&B(`<``P*@`880`)1'``-4``&'(`,@!@!'``(@!":@`4(`1,[0T0__!.T
XM74YU3E4``$CG[+@D0"!O`"PH*``$(&\`+"9H`"`H;@`.(&\`,#`J`!2P4&80Y
XM+7P```#V`!X@!$2`8``#Z'``,"H`%&$`"$@U?``!`!9@``.&("H`!"5```PE4
XM0``(2FH`&&<><``P*@`:(@!P`#`J`!AA``BR<``U0``8<@`R`&`$<``B`"!O"
XM`#`U4``4("\`,&$`_0Y*@&T``P1*:@`49NP@*@`,L*H`"&2F2BX`@6<P(&H`H
XM#%*J``QP8;`08B(@:@`,4JH`#'!ZL!!E%"!J``Q2J@`,<``0$`2`````(&`,H
XM(&H`#%*J``QP`!`0&@!@``*T2BX`@F=$+R\`,"(O``AP`!`N`))A`/S>6(\DP
XM`"\O`#`B+P`(<"!A`/S,6(_4@"\O`#`B+P`(<``0+@"280#\MEB/U(!P`[""U
XM8!@O+P`P(B\`"'``$"X`DF$`_)I8CW(!LH!N``)&4XM3C"!O`"RWZ``@8P0@6
XM2V`((&\`+"!H`"`F2+GN``YC!"!,8`0@;@`.*$@@;P`LN*@`!&80(&\`+"`H4
XM``12@"@`8``"-E2$8``",$)N`&P0!1;`&,`O+P`P(B\`"'``$`5A`/PJ6(]*#
XM@&T``=A*+@"%9Q8O+P`P(B\`"'`*80#\#EB/2H!M``&\4X1@``'T<`-@`G`":
XM+4``'A:`&(!@``&BN>X`#F8,+7P```#3`!Y@``&22BX`@V<``'9@:DHN`()GS
XM1"\O`#`B+P`(<``0+@"280#[NEB/)``O+P`P(B\`"'`@80#[J%B/U(`O+P`P0
XM(B\`"'``$"X`DF$`^Y)8C]2`<`.P@F`8+R\`,"(O``AP`!`N`))A`/MV6(]RQ
XM`;*`;@`!(E.,4H2Y[@`.8I!@,"\O`#`B+P`(<``0+@"+80#[3EB/)``O+P`P3
XM(B\`"'`*80#[/%B/U(!P`K"";@``YB!O`"PF:``@*&X`#F``_L@0'!;`&@"P=
XM+@"+9@Y*+@"+9PA3BU.,8```\B\O`#`B+P`(<""P!6,$<"Y@!'``$`5A`/KL/
XM6(]*@&T``)A3A$J$;KY@``#&$"X`BQ:`&(`O+P`P(B\`"'``$!1A`/K"6(]*M
XM@&T``'!*+@"%9Q0O+P`P(B\`"'`*80#ZIEB/2H!M5%F/+JX`#F`<+R\`-"(O:
XM``P@;P`$<``0$&$`^H18CTJ`;3)2E[G78N!8CV!>$`46P!C`+R\`,"(O``AP8
XM(+`%8P1P+F`$<``0!6$`^E18CTJ`;#A3A"`$1(`H`&`V<``0!6$`!/!3@`R`]
XM````"&*^T$`P.P`&3OL``OTR_DS]Y/XZ_T[_1O^T_BC^+%.$2H1N`/S(3^W_M
XMW$)J`!0@*@`,L*H`"&4T("H`!"5```PE0``(2FH`&&<><``P*@`:(@!P`#`JZ
XM`!AA``46<``U0``8<@`R`&`$<``B`"`$3.T=-/_D3EU.=4Y5``!(Y\RP)$`@\
XM;P`D*"@`!"!O`"0F:``@<``P*@`880`$/C5\``$`&D'N```DB&```+)*:@`4.
XM9QYP`#`J`!8B`'``,"H`%&$`!*YP`#5``!1R`#(`8`1P`"(`(&\`*#50`!@@_
XM+P`H80#Y"DJ`;`@@!$2`*`!@<$IJ`!AFYB`J``30J@`0L*H`"&.H$!L@:@`(S
XM4JH`"!"`&@!*!6=$(&\`!$J09SP@;P`$(%"Z*`"09A)R`R!O``0@4'``,"@`E
XM'&$`!#8@;P`$(%"Z*`"19A)R`B!O``0@4'``,"@`'&$`!!A3A$J$;I9/[?_D%
XM0FH`&"`J``BPJ@`,8RA*:@`49QYP`#`J`!8B`'``,"H`%&$``^AP`#5``!1RK
XM`#(`8`1P`"(`(`1,[0TP_^Q.74YU3E4``$CGSO`D0"!O`"PH*``$(&\`+"9HG
XM`"!P`#`J`!AA``,0-7P``0`:0>X``"2(8``"@$IJ`!1G'G``,"H`%B(`<``PN
XM*@`480`#@'``-4``%'(`,@!@!'``(@`@;P`P-5``&"`O`#!A`/?<2H!M``(2/
XM2FH`&&;L("H`!-"J`!"PJ@`(8ZY2;@"@2BX`@6<8<&&P&V(2<'JP&V4,<``0W
XM&P2`````(&`$<``0&R!J``A2J@`($(`:`$H%9T0@;P`$2I!G/"!O``0@4+HHM
XM`)!F$G(#(&\`!"!0<``P*``<80`"ZB!O``0@4+HH`)%F$G("(&\`!"!0<``PV
XM*``<80`"S$H%9P`!"KHN`(MF``$"0FX`H$HN`(=G``",<``0+@"(4FX`;'(`F
XM,BX`;+"!9G9";@!L(&\`!'``,"@`%&$``?0@;P`$2F@`&&<J(&\`!'``,"@`#
XM&B(`(&\`!'``,"@`&&$``FAP`"!O``0Q0``8<@`R`&`$<``B`"!O`#`B;P`$T
XM,U``%"`O`#!A`/:\2H!M``#R(&\`!$IH`!1FZ"!O``12J``,2BX`A6=>("H`>
XM!-"J`!"PJ@`(8D1*:@`49QYP`#`J`!8B`'``,"H`%&$``?QP`#5``!1R`#(`^
XM8`1P`"(`(&\`,#50`!@@+P`P80#V6$J`;0``CDIJ`!AF["!J``A2J@`($+P`%
XM"E.$8```K$HN`)MG``"<2BX`FF<``)2Z+@":9@``C'``,"X`H%.`<@`2+@";2
XM80`!R#P`(&H`"!%\`"#__V!F2FH`%&<><``P*@`6(@!P`#`J`!1A``%N<``U+
XM0``4<@`R`&`$<``B`"!O`#`U4``8("\`,&$`]<I*@&P((`1$@"@`8"Y*:@`81
XM9N8@*@`$T*H`$+"J``ACJ"!J``A2J@`($+P`(%-&2D9NX%.$2H1N`/W"3^W_7
XMW$)J`!@@*@`(L*H`#&,H2FH`%&<><``P*@`6(@!P`#`J`!1A``#J<``U0``44
XM<@`R`&`$<``B`"`$3.T/</_D3EU.=2\*3D``*&0*+4$`'B1?<`!.=2`*)%].A
XM=2\*)$`@`4Y``"ED"BU!`!XD7W#_3G4D7W``3G5*0&<(0H%.0``K(`%.=4H`R
XM9Q2P/``@;`Y![@")<@BP&&<(4<G_^D*`3G5$0=)\``DP`4YU(D`@07``(@!@'
XM!$H19Q"S"&?X4XA3B1`0$A&2@"`!3G4B0"!!("\`!!+84<C__$YU($!#^@`:N
XM$!E&``P```UG!A#`4<G_\A#`4<G__$YUWYV&WZV:EI*:C=^^T=^RFI.3EI'R'
XM`$I`9P1.0``(3G4O`G0`2H!J!$2`=`-*@6H&1($*`@`!82+B"F0"1(#B"F0">
XM1($D'TJ`3G5AU,%!2H!.=6$&P4%*@$YU2.<X`"0!9@:!_```8&Y3@6=J*`$B"
XM`+2!90QG!'``8%QP`9*"8%8F`FOVQH1F$N**=O_BBE7+__Q$@^:HPH1@/'``2
XM=O_C@FH&M(%B"F`,M(%4R__R9P12@^**1(-@!..`XHJ2@F404H!1R__T8`[C]
XM@.**TH)E\%'+__;2@DS?`!Q*@$YU3E4``$CG8(!P`$Y```I@``&83E4``$CG3
XM8(`@;0`((A`@0"`73D``%V4``8`@;0`(((%@``%^3E4``$CG8(!.0``/8``!.
XM9.&(",``'TY5``!(YV"`3D``"F```4Y.50``2.<`P"!!(D`B+0`(3D``$644Q
XM<`!@2DY5``!(Y\#`($!.0``09#8M00`>8"Q.50``2.?`P")`($D,&``N9_H,X
XM*``O__]G\E.(3D``$&4*2@!G"@P``"]GWG#_8`0@"9"73.T#`O_T3EU.=4Y5V
XM``!(YV"`2.<`8"0M``P@0"`!(BT`"$Y``"5E`B`*3-\&`&```+A.50``2.=@2
XM@"!`3D``&F4``*@@`6```*!.50``2.=@@"!`3D``'V4``)`@`6```(A.50``6
XM2.=@@"!M``A.0``88```=$Y5``!(YV"`($!.0``F8```8DY5``!(YV"`",$`A
XM'V`,3E4``$CG8(`D+0`(3D``)V4``$(@`F```#I.50``2.=@@$Y```M@```J#
XM3E4``$Y``%).74YU3E4``$CG8(`O"2!M``@B;0`,3D``&R)?8````F0,+4$`U
X?'G#_8`1E]G``3.T!!O_T3EU.=5!T>4UA;@```'/+M$``H
X``
Xend
Xsize 5746
END_OF_FILE
if test 8083 -ne `wc -c <'ptyman.uu'`; then
    echo shar: \"'ptyman.uu'\" unpacked with wrong size!
fi
# end of 'ptyman.uu'
fi
if test -f 'tty.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'tty.uu'\"
else
echo shar: Extracting \"'tty.uu'\" \(208 characters\)
sed "s/^X//" >'tty.uu' <<'END_OF_FILE'
X
Xbegin 644 tty
XM2OP``0```'X````!````=@55#P"`````````````````````````````````E
XM`#]>`````````!L`9`!K```````````````<```!`0$!```8"!@-&P0!%P,%K
XD"`<```!R```)"%!T>4UA;@!0='E$<G8`='1Y`'1T>0``A6W-5
X``
Xend
Xsize 126
END_OF_FILE
if test 208 -ne `wc -c <'tty.uu'`; then
    echo shar: \"'tty.uu'\" unpacked with wrong size!
fi
# end of 'tty.uu'
fi
echo shar: End of shell archive.
exit 0

---

-- 
  |  Reimer Mellin           | mellin@lan.informatik.tu-muenchen.dbp.de  |
  |  Sulenstr. 8             |      pyramid!tmpmbx!ramsys!ram (home)     |
  |  D-8000 Muenchen 71      |     Technische Universitaet Muenchen      |