Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!ira.uka.de!smurf!altger!stasys!fkk From: fkk@stasys.sta.sub.org (Frank Kaefer) Newsgroups: sub.sources.os9,comp.os.os9 Subject: v02i005: Ptyman 1.3 Binaries - Part 1/1 Message-ID: <2377@stasys.sta.sub.org> Date: 22 Jun 91 12:46:23 GMT Organization: Stasys UUCP Server, Starnberg (Germany) Lines: 585 Approved: fkk@stasys.sta.sub.org (Frank Kaefer, Moderator) 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 '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$'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```(0>X`X"(((#P```#@T(MA`!922H!F``"&+4L`*B9K`"Y@```D$"L`O XM`H`N``((```&9P``$"U\````_0`>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/(%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```(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!+QX`,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``>&```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*@`@%/[?_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$`".@:`&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=*_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`>@`B7((L!AG%E')__I4UA;@````\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$