fkk@stasys.sta.sub.org (Frank Kaefer) (06/22/91)
Posting-number: Volume 2, Issue 5 Submitted-by: ram@ramsys.UUCP (Reimer A. Mellin) Archive-name: ptyman1.3_bin #! /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: COPYRIGHT ptyman.doc pty.uu ptydrv.uu ptyman.uu tty.uu # Wrapped by ram@ramsys on Sun Jun 23 11:06:03 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH 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* ram%ramsys@chiuur.sub.org (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'\" \(11966 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 tty 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 Xwhile using only *one* descriptor (device) for each. Server-ptys must Xbe opened as "/pty/any_valid_name" , client-ttys must be opened (i.e. Xconnected) with "/tty/any_valid_name". PTY's can be also implemented Xwith the usage of a special device-driver for the SCF, but this has Xserveral 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.). Then the list of client-PTYs is searched for any Xalready opened tty; iff found, the pair is connected and a DCOn-Signal Xis sent, if specified by the client-PTY. 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). If a server-PTY couldn't be found, the open-call returns, but Xnearly any further i/o call will issue an E_HANGUP error. Only the Xfollowing calls will return without an error: X - close() X - getstat: SS_DevNm and SS_OPT X - setstat: SS_EnRTS/SS_DCOn, SS_DsRTS/SS_DCOff and SS_OPT XIf the client-tty has specified an DCOn-signal, the later connecting pty Xwill send it to the tty 'hanging around'. 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 XA client-tty may be opened with the S_ISHARE-bit on; in this case Xthere is only one client-tty allowed. 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 XIf a server-pty is opened with the S_IFDIR-bit set, further reads will Xreturn pseudo-directory-entries for all opened server-ptys. A command X'dir /pty' will therefore return the names of all current opened Xserver-ptys. 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 - Any signal < 32 and > 1 (SIGWAKE) will abort a pending I/O with an X error-code of the signal (this should be made standard). 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 - the special IOSTOP or IOCONT SetStats blocks transmisson X of data in any direction (read and write). Read/Writes are still X possibly, but will block if the internal buffers are full. X Beware of Deadlocks !!! X XDescriptions of operation: X X- Read-calls: X absolute raw-read, ignores echo-parameter, but unterstands kbich, X kbach, xon, xoff and psc of the other end. X X- Write-calls: X absolute raw-write .... but sends QUIT and INT if set, and handles X xoff/xon and psc handling of the other side. X X- Writeln-calls: X recognizes upc(only if required via -DUPCHAR), tabch, tabs, alf, X pause and returns on recognizing the eor-char (normaly CR). X Sends QUIT and INT if set. 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 complete path-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, SS_IOSTOP and SS_IOCONT. X XNot supported are null (for padding). 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 path-name of the pty into the callers X (a0)-register (e.g '/tty/testtty'). 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 see SS_DCOn X X - SS_DsRTS: X see SS_DCOff X X - SS_DCOn: X if a connection between a pty/tty pair is occurring, this signal X will be sent (will be ignored if not set)! 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 - SS_Screen (Subfunction ScrOut): X Optional, like BlkWr. exists only on ST's (Cumana Implementation). X X - SS_IOSTOP: X sets a flag, which blocks any handshake. If you still write/read X to/from a stopped connection, deadlock may occur when the internal X buffers are full/empty, due to the missing handshake!! X X - SS_IOCONT: X Reallow further handshake by activating any reading process of X either side. X XExample of SS_IOSTOP/SS_IOCONT: X write( tty, "Hello ", 6); /* transfer 'Hello ' to the other side X * if a read is pending transfer it X * immediatily X */ X _ss_iostop(tty); /* freeze any reading from/to pty/tty X * the maximum the reading process can X * read without blocking is up to the X * string 'Hello' (not the blank) X */ X write( tty, "World\n", 6); /* this write will not block if there is X * enough room in the internal buffer X */ X sleep (10); /* wait .. not I/O will occur */ X _ss_iocont(tty); /* reallow further transmission, X * any pending read will be continued; X * by completion of the read() the block on X * the writing process will be released 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 XBUGS: X X This Filemanager seems to have problems in OSK-Versions lower Xthan 2.0 (-> e.g. 1.2). I think the 'openend-Path'-list isnt supported Xby the Kernel (IOMan); maybe the Filemanager should do it itself ?? X XThings to do: X - more lineediting (emacs-style, history ?) 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 END_OF_FILE if test 11966 -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'\" \(204 characters\) sed "s/^X//" >'pty.uu' <<'END_OF_FILE' X Xbegin 644 pty XM2OP``0```'H````!````<@55#P"`````````````````````````````````= XM`#]>`````````/L`9`!K```````````````<````````````````````````# X@`````````````%!T>4UA;@!0='E$<G8`<'1Y```8?EL`0 X`` Xend Xsize 122 END_OF_FILE if test 204 -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'\" \(9933 characters\) sed "s/^X//" >'ptyman.uu' <<'END_OF_FILE' X Xbegin 644 ptyman XM2OP``0``&YH````````;C@55#0&@```"````````````````````````````O XM`!U`````/`````````$``%(`4@`:`!H`&@`D`"H`/@`T`$@`7`!F`'`R/`#+_ XM`#P``4YU`CS__DYU2.?__F%*8``&)DCG__YA0&``!K1(Y__^839@``>02.?_P XM_F$L8``(($CG__YA(F```$I(Y__^81A@``BF2.?__F$.8``*4DCG__YA!&``G XM`X(C3@`B+$D@7R`,(@U.D$J`9PY,WW__(BD`'@`\``%.=4S??_\"//_^3G5.+ XM50``2.?,\"!O``0D:``@(`IA`!DR*`!L```(</]@``,L#"H`4``!9P``#`PJ? XM`'```68```AP`&````1P`1U``'P@;P`$(F\`!!`I``/`+@`"L"@``V<``!`M0 XM?````,L`'G#_8``"YB!O``0=:``#``(,+@`!`'QG```,""X`!P`"9@``2@PR0 XM`"](`&<``!`M?````-<`'G#_8``"L"`$4H#5P"`*80`8GB@`;0``$G`<L(1MM XM```*2C)(`&<``!`M?````-<`'G#_8``"@'H`8```+@PR`&%8`&4``!8,,@!ZF XM6`!B```,<.#0,E@`8```!A`R6`!![@#@$8!8`%*%NH1M`/_0(`13@$'N`.`(' XM\``'"``M1`#\""X`!P`"9@`"%DHN`'QG``#*(&X`!"!H``0F:``*8```JDHK# XM`'QF``">0>X`X"(((#P```#@T(MA`!922H!F``"&+4L`*B9K`"Y@```D$"L`O XM`H`N``((```&9P``$"U\````_0`></]@``'*)FL`+B`+9@#_VB!N`"HM:``NY XM`"Y![@``(FX`*B-(`"X@;@`J2F@`=F<``"H@;@`J<``P*`!V(@!*:P`(9P``= XM#'``,"L`"&````AP`#`K`!QA`!8R<`!@``%P)FL`%B`+9@#_5'``8``!8&``T XM`4(@;@`$(&@`!"9H``I@```^2BL`?&8``#)![@``L<MG```H0>X`X"(((#P`O XM``#@T(MA`!6`2H!F```0+7P```#]`!YP_V```10F:P`6(`MF`/_`(#P```(`N XM+4``8BU``$(@+@!"80`4V"U``#9G```2("X`8F$`%,@M0`!69@``,$JN`%9GR XM```.(BX`8B`N`%9A`!3"2JX`-F<```XB+@!"("X`-F$`%*YP_V```*X@+@`VX XM+4``.BU``#X@+@!6+4``6BU``%X@;@`$(&@`!"9H``I@``!F#"L``0!\9@``> XM6$'N`.`B""`\````X-"+80`4PDJ`9@``0$'N```G2``J)VX`+@`N+4L`+DIKC XM`'9G```F<``P*P!V(@!*:P`(9P``#'``,"L`"&````AP`#`K`!QA`!3B)FL`@ XM%B`+9@#_F&```!`@;@`$(&@`!"UH``H`+G``8```!$YQ3.T/,/_H3EU.=4Y5< XM``!(Y\#P""X`!P`"9@`!4DHN`'QG```*2JX`*F8```I![@`R8```"B!N`"I!2 XMZ`!2)$@@5S`J`!BP4&8```9":@`82FX`&F8``11*+@!\9@``9B9N`"Y@```\J XM0JL`*DIK`'AG```,<``P*P!X8```!'`$(@!*:P`(9P``#'``,"L`"&````AP/ XM`#`K`!QA`!0B)FL`+B`+9@#_PB(N`$(@+@`V80`32B(N`&(@+@!680`3/F``; XM`*A*K@`J9P``BB9N`"I@```80>X``+'K`"YF```()VX`+@`N)FL`+B`+9@#_8 XMYD'N```B;@`JL>D`,F8```H@;@`J0J@`,B!N`"I*J``N9@``0B!N`"I*:`!X! XM9P``-B!N`"IP`#`H`'@B`"!N`"I*:``(9P``$"!N`"IP`#`H``A@```,(&X`B XM*G``,"@`'&$`$VQ*K@`.9P``$"(\```!`"`N``YA`!*48```!D*N`"YP`&``! XM``1.<4SM#P#_\$Y=3G5.50``2.?`@$J7;```$B`7(&\`!-&H``1P_V```!0@C XM%R!O``21J``$<`!@```$3G%,[0$`__Q.74YU3E4``$CGR(!@```,(&X`+BUHT XM`!8`+DJN`"YG```>0>X``+'N`"YG`/_D(&X`+A`N`'RP*`!\9@#_U$JN`"YG% XM``!"(%=P(+"H``1D```(<"!@```((%<@*``$*``O!"`\````X-"N`"XB`"!O` XM``0@*``@80`22%B/(%<A1``$8```$"U\````TP`></]@```4(&X`+BUH`!8`" XM+G``8```!$YQ3.T!$O_T3EU.=4Y5``!(Y^"`""X`!P`"9P``#B`O``1A`/\\# XM8```<B`780`&R$J`9P``"'#_8```8$HN`'QF```N(B\`!"0!+Q<O+P`(0>X`] XM4B((0>X`,B`(80`'Q%"/(@)A`/[`8```,&```"PB+P`$)`$O%R\O``AP,M"NU XM`"HB`'!2T*X`*F$`!Y90CR("80#^DF````),[0$$__A.74YU3E4``$CGX(`(G XM+@`'``)G```.("\`!&$`_J1@``#`(!=A``8P2H!G```(</]@``"N2JX`#F8`2 XM`"P@/````0!A`!"D+4``#F8```QP_V```(Y@```0(CP```#_("X`#F$`$2@@+ XM;P`$#*@```$```1C```.(&\`!"%\```!```$2BX`?&8``"XB+P`$)`$O%R\OX XM``A![@!2(@A![@`R(`AA``@<4(\B`F$`_=I@```P8```+"(O``0D`2\7+R\`V XM"'`RT*X`*B(`<%+0K@`J80`'[E"/(@)A`/VL8````DSM`03_^$Y=3G5.50``I XM2.?@@`@N``<``F<``!`M?````,L`'G#_8```<B`780`%2$J`9P``"'#_8```% XM8$HN`'QF```N(B\`!"0!+Q<O+P`(0>X`,B((0>X`4B`(80`+9%"/(@)A`/U`S XM8```,&```"PB+P`$)`$O%R\O``AP4M"N`"HB`'`RT*X`*F$`"S90CR("80#]; XM$F````),[0$$__A.74YU3E4``$CGX(`(+@`'``)G```0+7P```#+`!YP_V``@ XM`'(@%V$`!*Y*@&<```AP_V```&!*+@!\9@``+B(O``0D`2\7+R\`"$'N`#(B5 XM"$'N`%(@"&$`##I0CR("80#\IF```#!@```L(B\`!"0!+Q<O+P`(<%+0K@`J* XM(@!P,M"N`"IA``P,4(\B`F$`_'A@```"3.T!!/_X3EU.=4Y5``!(Y\#@8``!5 XM:$AX``1!^@0@(@@@;P`(("@`(&$`#SY8CTHN`'QF```.(&\`!"!H`"`0O`!PH XM+RX`_$'N`.`B""!O``@@*``@6(!A``\06(\@;P`$(&@`("`N`/Q",`@$8``!T XM0$AX`!Q![@"`(@@@;P`(("@`(&$`#N18CV```20(+@`'``)G```(<"!@```(9 XM(#P```(`(&\`!"%```A@``$"(!=A``.02H!G```(</]@``#X8```@DHN`'QFD XM```*0>X`,F````H@;@`J0>@`4B1(<`?`J@`49@``%B`J``B0J@`,(&\`!"%`Q XM``1F```0+7P```#V`!YP_V```*Y@``!L(&\`!$*H``1@``!@(&\`!")O``0C, XM:``(``0B+P`$(!=A`/PH8```@BU\````T``></]@``!T(&\`!"`\``#__\"H6 XM``0,@````/]B`/_<#````6<`_V(,```&9P#_I`P``!1G`/^H8`#_P&```#0@^ XM;P`$(#P``/__P*@`!`R`````_V(`_QQ*`&<`_M@,```"9P#^[`P```YG`/YN4 XM8`#_`G``8```!$YQ3.T'`/_T3EU.=4Y5``!(Y\#P8``"$"!O``0]:``*`'9@A XM``)2(&\`!#UH``H`>&```D1(>``<(&\`""(H`"!![@"`(`AA``UL6(]@``(HS XM(!=A``(Z2H!G```(</]@``(>8``!8DHN`'QF```*0>X``&````8@;@`J)D@(F XMZP```$D(ZP```&E@``&82BX`?&8```I![@``8```!B!N`"HF2'#^P:L`1G``X XM,"L`3"(`<``P*P!*80`-0$)K`$IP_L&K`&9P`#`K`&PB`'``,"L`:F$`#21"E XM:P!J8``!1DHN`'QF```*0>X`,F````H@;@`J0>@`4B1(2FH`&&8```QP!\"JI XM`!1G```0+7P```#V`!YP_V```6@@*@`(D*H`#&X``!8@5S50`!@@;P`$-6@`@ XM"@`:8```%"!O``0B*``((%=P`#`080`,L&```-9*+@!\9@``"D'N`#)@```*F XM(&X`*D'H`%(D2"!7,"H`&+!09@``!D)J`!A@``"H(&\`!`QH`!``"F<```9@N XM``"6(&\`!")O``0C:``,``@@;P`$(F\`!"-H``@`!"(O``0@%V$`^W!@``#(< XM+7P```#0`!YP_V```+H@;P`$(#P``/__P*@`!`R`````R&<`_Z!B```F#```G XM&F<`_O9B```.#```%6<`_ZA@`/_`#```&V<`_TY@`/^T#(````,!9P#^6&(`0 XM_Z8,@````P!G`/YP8`#_F&```%(@;P`$(#P``/__P*@`!`R`````)6<`_>IBL XM```:#(`````D9P#]SF(`_@)*`&<`_>!@`/WX#(`````G9P#]Q&(`_>H,@```Q XM`"9G`/VH8`#]W'``8```!$YQ3.T/`/_P3EU.=71T>2\``$Y5``!(YX`@)$`,5 XM+@`!`'QF$DJN`"IF#"U\````W``><`%@`G``3.T$`/_\3EU.=4Y5``!(Y\`@U XM)$!P`&$`#$!*@&8&2FH`)F<><``P*@`F+4``'G(@LH!N"C`\`P#`:@`<9P1P= XM_V`"<`!,[00"__A.74YU3E4``$CGS*`H`"1!2BX`A&8&<`%@``"8<``P*@`<W XM80`*+C5\``$`'D'N```DB&`\<`?`J@`49A9P`#`J`!HB`'``,"H`&&$`"JY"4 XM:@`8(&\`(#50`!P@+P`@80#_8$J`;`1Z_V`@2FH`'&;J("H`!-"J`!"PJ@`(. XM8[8@:@`(4JH`"!"$>@%/[?_H0FH`''`'P*H`%&86<``P*@`:(@!P`#`J`!AAC XM``I00FH`&"`%3.T%,/_P3EU.=4Y5``!(Y^RX)$`F02!O`"P@/'_____`J``$. XM*``@;P`L*&@`("!O`#`P*@`8L%!F$"U\````]@`>(`1$@&```/9P`#`J`!AAX XM``E.-7P``0`:8```H"`J``0E0``,)4``"'`'P*H`%&86<``P*@`>(@!P`#`J4 XM`!QA``G&0FH`'"!O`#`U4``8("\`,&$`_GA*@&T^2FH`&&;N("H`#+"J``ADW XMLD'N```B""!J``Q2J@`,$!`8P'0`%``@`F$`".@:`&<N8!IP`V`"<`(M0``>7 XM4X0@!$2`*`!@'D)N`'I@$@P%``-G]`P%``AGV@P%``EGV%.$2H1NHD_M_]Q"Q XM:@`8("H`#+"J``AE*B`J``0E0``,)4``"'`'P*H`%&86<``P*@`>(@!P`#`JZ XM`!QA``D20FH`'"`$3.T=-/_D3EU.=4Y5``!(Y^ZX)$`@;P`P(#Q_____P*@`Z XM!"@`(&\`,"9H`"`H;@`.(&\`-#`J`!BP4&80+7P```#V`!X@!$2`8``#F'``X XM,"H`&&$`"`XU?``!`!I@``-`("H`!"5```PE0``(<`?`J@`49A9P`#`J`!XB_ XM`'``,"H`'&$`"(9":@`<(&\`-#50`!@@+P`T80#].$J`;0`"PDIJ`!AF["`JY XM``RPJ@`(9+`@:@`,4JH`#!H08``"K$HN`()G1"\O`#0B+P`(<``0+@"280#]& XM0%B/)``O+P`T(B\`"'`@80#]+EB/U(`O+P`T(B\`"'``$"X`DF$`_1A8C]2`I XM<`.P@F`8+R\`-"(O``AP`!`N`))A`/S\6(]R`;*`;@`"/E.+4XP@;P`PM^@`V XM(&,$($M@""!O`#`@:``@)DBY[@`.8P0@3&`$(&X`#BA((&\`,+BH``1F$"!O/ XM`#`@*``$4H`H`&```C14A&```BY";@!Z%L48Q2\O`#0B+P`(<``0!6$`_(Y8) XMCTJ`;0`!TDHN`(5G%B\O`#0B+P`(<`IA`/QR6(]*@&T``;93A&```?06A1B%` XM<`-@!A:%&(5P`BU``!Y@``&8N>X`#F8,+7P```#3`!Y@``&(2BX`@V<``'9@I XM:DHN`()G1"\O`#0B+P`(<``0+@"280#\&EB/)``O+P`T(B\`"'`@80#\"%B/# XMU(`O+P`T(B\`"'``$"X`DF$`^_)8C]2`<`.P@F`8+R\`-"(O``AP`!`N`))AQ XM`/O66(]R`;*`;@`!&%.,4H2Y[@`.8I!@,"\O`#0B+P`(<``0+@"+80#[KEB/E XM)``O+P`T(B\`"'`*80#[G%B/U(!P`K"";@``W"!O`#`F:``@*&X`#F``_L80O XM'!;`&@"P+@"+9@Y*+@"+9PA3BU.,8```[B\O`#0B+P`(#`4`(&0$<"Y@!'``< XM$`5A`/M,6(]*@&T``(Y3A$J$;KY@``#"$"X`BQ:`&(`O+P`T(B\`"'``$!1AS XM`/LB6(]*@&UF2BX`A6<4+R\`-"(O``AP"F$`^PA8CTJ`;4PL+@`.8!HO+P`T` XM(B\`""!&<``0$&$`^NI8CTJ`;2Y2AKR,9>)@8A;%&,4O+P`T(B\`"`P%`"!D! XM!'`N8`1P`!`%80#ZOEB/2H!L/E.$(`1$@"@`8#Q![@``(@AP`!`%80`$_%.`4 XM#(`````(8KK00#`[``9.^P`"_33^4/WF_C[_4O]*_[#^*/XP4X1*A&X`_01/: XM[?_80FH`&"`J``RPJ@`(92H@*@`$)4``#"5```AP!\"J`!1F%G``,"H`'B(`V XM<``P*@`<80`%,$)J`!P@!$SM'73_X$Y=3G5.50``2.?/N"1`)D$@;P`P(#Q_] XM____P*@`!"@`(&\`,"AH`"`J$R`J``30J@`0+@!P`#`J`!QA``0^-7P``0`>< XM0>X``"2(8```YG`'P*H`%&86<``P*@`:(@!P`#`J`!AA``2\0FH`&"!O`#0U7 XM4``<("\`-&$`^6Y*@&P*(`1$@"@`8```L$IJ`!QFY+ZJ``ACN"!J``A2J@`(2 XM$!P0@!P`2H5G``"(8%P(ZP`!`!=@!@CK``(`%U.J``A@<'#[8"0@1;PH`)!F2 XM!'(#8`)R`B!%<``P*``<80`$1@@K``$`%V=*</W!JP`44ZH`"'``,"L`'B(`\ XM<``P*P`<80`$(D)K`!Q@*"(%<``0!F$``WA?@`R`````!&+"T$`P.P`&3OL`E XM`O^&_Y[_GO^._YI3A$J$;@#_6D_M_]A":@`<("H`"+"J``QC'G`'P*H`%&868 XM<``P*@`:(@!P`#`J`!AA``/`0FH`&"`$3.T=\/_@3EU.=4Y5``!(Y\^X)$`FJ XM02!O`#`@/'_____`J``$*``@;P`P*&@`("H3("H`!-"J`!`N`'``,"H`'&$`E XM`LXU?``!`!Y![@``)(A@``),<`?`J@`49A9P`#`J`!HB`'``,"H`&&$``TQ"T XM:@`8(&\`-#50`!P@+P`T80#W_DJ`;0`!YDIJ`!QF[+ZJ``ACP%)N`*`@:@`($ XM4JH`"!`<$(`<`$H&9P`!\DJ%9P``B&!<".L``0`78`8(ZP`"`!=3J@`(8'!P" XM^V`D($6\*`"09@1R`V`"<@(@17``,"@`'&$``M0(*P`!`!=G2G#]P:L`%%.JS XM``AP`#`K`!XB`'``,"L`'&$``K!":P`<8"@B!7``$`9A``(&7X`,@`````1B% XMPM!`,#L`!D[[``+_AO^>_Y[_CO^:O"X`BV8``,A";@"@2BX`AV=<4FX`>G``2 XM$"X`B+!N`'IF3$)N`'IP`#`K`!AA``&J<`?`JP`49A9P`#`K`!XB`'``,"L`Q XM'&$``CA":P`<(&\`-#=0`!@@+P`T80#VZDJ`;0``TDIK`!AF[%*K``Q*+@"%4 XM9U0@*@`$T*H`$+"J``AB.G`'P*L`%&86<``P*@`:(@!P`#`J`!AA``'F0FH`? XM&"!O`#0U4``<("\`-&$`]IA*@&T``(!*:@`<9NP@:@`(4JH`"!"\``I3A&``J XM`*!*+@";9P``D$HN`)IG``"(O"X`FF8``(!5CW``,"X`H%.`<@`2+@";80`!I XMO#Z`4ZH`"&!<<`?`J@`49A9P`#`J`!HB`'``,"H`&&$``69":@`8(&\`-C50J XM`!P@+P`V80#V&$J`;`@@!$2`*`!@,$IJ`!QFYB`J``30J@`0L*H`"&.R(&H`C XM"%*J``@0O``@4U=*5V[@5(]3A$J$;@#][$_M_]A":@`<("H`"+"J``QC'G`'[ XMP*H`%&86<``P*@`:(@!P`#`J`!AA``#J0FH`&"`$3.T=\/_@3EU.=2\*3D``O XM*&0*+4$`'G``)%].=2`*8/@O"B1`(`%.0``I9`HM00`></\D7TYU<`!@^$I`0 XM9PAR`$Y``"L@`4YUL#P`(&PB2@!G'B!!0>@`B7((L!AG%E')__I<B'("L!AG3 XM#'(!L!AG!D*`3G5$0=)\``DP`4YU(D`@07``(@!@!$H19Q"S"&?X4XA3B1`0% XM$A&2@"`!3G4B0"!!("\`!!+84<C__$YU($!#^@`:$!E&``P```UG!A#`4<G_% XM\A#`4<G__$YUWYV&WZV:EI*:C=^^T=^RFI.3EI'R`$I`9P1.0``(3G4O`G0`< XM2H!J!$2`=`-*@6H&1($*`@`!82+B"F0"1(#B"F0"1($D'TJ`3G5AU,%!2H!./ XM=6$&P4%*@$YU2.<X`"0!9@:!_```8&Y3@6=J*`$B`+2!90QG!'``8%QP`9*"@ XM8%8F`FOVQH1F$N**=O_BBE7+__Q$@^:HPH1@/'``=O_C@FH&M(%B"F`,M(%4P XMR__R9P12@^**1(-@!..`XHJ2@F404H!1R__T8`[C@.**TH)E\%'+__;2@DS?" XM`!Q*@$YU3E4``$CG8(!P`$Y```I@``&V3E4``$CG8(`@;0`((A`@0"`73D``8 XM%V4``9X@;0`(((%@``&<3E4``$CG8(!.0``/8``!@N&(",``'TY5``!(YV"`" XM3D``"F```6Q.50``2.<`P"!!(D`B+0`(3D``$65@<`!@:$Y5``!(Y\#`($!.M XM0``09%1@2DY5``!(Y\#`($`B2!`9#```+V<:#```+F8B#!D`+F?Z$"%G+@P`[ XM`"]F$B!)8-X0&0P``"]G!@P``"YGWDY``!!E"$H`9PP@26#"+4$`'G#_8`0@P XM"9"73.T#`O_T3EU.=4Y5``!(YV"`2.<`8"0M``P@0"`!(BT`"$Y``"5E`B`*) XM3-\&`&```+A.50``2.=@@"!`3D``&F4``*@@`6```*!.50``2.=@@"!`3D``1 XM'V4``)`@`6```(A.50``2.=@@"!M``A.0``88```=$Y5``!(YV"`($!.0``FD XM8```8DY5``!(YV"`",$`'V`,3E4``$CG8(`D+0`(3D``)V4``$(@`F```#I.Y XM50``2.=@@$Y```M@```J3E4``$Y``%).74YU3E4``$CG8(`O"2!M``@B;0`,2 XM3D``&R)?8````F0,+4$`'G#_8`1E]G``3.T!!O_T3EU.=5!T>4UA;@````\O> X!?T``_ X`` Xend Xsize 7066 END_OF_FILE if test 9933 -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'\" \(204 characters\) sed "s/^X//" >'tty.uu' <<'END_OF_FILE' X Xbegin 644 tty XM2OP``0```'H````!````<@55#P"`````````````````````````````````= XM`#]>`````````/L`9`!K```````````````<```!`0$!```8"!@-!``!%P,%P X@"`<`````$1,)"%!T>4UA;@!0='E$<G8`='1Y```X9?(!W X`` Xend Xsize 122 END_OF_FILE if test 204 -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 -- | Frank Kaefer | fkk@stasys.sta.sub.org | Starnberg, Germany | | Compuserve: 72427,2101 | Internet: fkk@Germany.Sun.COM | | unido!sunde!fkaefer | postmaster@Germany.Sun.COM |