[comp.os.minix] Fix to Minix pipes

kevin@nuchat.UUCP (Kevin Brown) (01/16/91)

When playing with GNU tar, I discovered that Minix pipes have an arbitrary
limit of how much you can write to them using the write() system call (and,
it turns out, how much you can read from them).  Needless to say, this limit 
should not exist at all (it doesn't on any Unix I've ever played with.  On 
most versions of Unix, large writes to pipes are just blocked).  So instead 
of fixing GNU tar to work with this arbitrary limit, I decided to fix Minix 
itself.  The following patch reflects the changes I made.  UUdecode the 
following, and then decompress it.  This will give you a file, pipe.patch, 
which you should apply by moving it to the directory containing your fs 
source code and doing a "patch <pipe.patch".  Be sure to save the originals
somewhere, just in case (I did enclose most of the changes in an #ifdef/
#endif pair.  You can define WIMPY_PIPES if you don't want most of my
patches to be compiled, though the field additions to the fproc structure
will still be there.  See the comments I put in there for an explanation).

These changes have NOT been extensively tested, so be sure to keep your
current Minix image around in case it acts up on you!  I had some strange
problems, but I think I've fixed them (you have to treat MM's requests
differently from that of other processes.  Sigh.  Since the file system 
is a Minix process, and is SUPPOSED to be "generic", it shouldn't have to 
treat MM's requests any differently from anyone else's).  There were a 
couple of times I was REAL WORRIED about the consistency of my file systems 
on my hard drive in testing the previous versions of this thing.  :-)

Right now, it seems to be stable.  Either way, though, I would NOT recommend
trying out this code on your hard disk without making sure it works properly
on a floppy-based system or, better yet, the RAMdisk.  This is easy to test: 
make a root file system on a floppy and tell the menu that it's your root 
file system.  If you have shoelace, then ask someone how to test the kernel 
in floppy mode only.  I don't use shoelace, so I don't really know...

If anyone sees any fatal flaws in my logic, please notify me immediately
(preferably by posting a message to this newsgroup)!

The way it works is this: The file system's main loop looks through the
list of processes for one that has been suspended (i.e. had not finished
servicing a system call when the resource being used ran out.  This
manifests itself mainly in writes to or reads from a pipe).  If it finds
one, it simply repeats the same system call that had previously been made,
but with fewer bytes left to process (the part of the message that
contains how many bytes to process, nbytes, is modified by the system call
code itself, so this value always reflects how much work, if any, is left).

I have added two fields to the file system process structure.  One keeps
track of how many bytes were originally requested, and how many are actually
left to process.  This was necessary to insure that do_read() and do_write()
will return the proper values for large reads/writes dealing with pipes.


So let's say we're writing to a pipe, and we want to write 10000 bytes.
Well, the pipe size itself is only 7168 bytes, so we have to break the write
up into multiple writes of at most 7168 bytes each.  This is done in
do_read() and do_write().  These two routines had originally just called
read_write() with the appropriate flag (read or write).  They now do the
following:

	* Check to see if the file being operated on is a pipe.  If not,
	  then just call read_write() with the appropriate flag and
	  return the appropriate result.

	* Otherwise, check to see if the amount of work to do is less than
	  the size of the pipe.  If so, then just call read_write() with
	  the appropriate flag and return the appropriate result.

	* Otherwise, we have a request that's bigger than the pipe proper,
	  so we loop, calling read_write() with nbytes of at most PIPE_SIZE
	  bytes.  Each time we go through the loop, we decrement the amount
	  of work left to do by the file system by the amount read or written
	  as a result of the call to read_write().

Now, the reason I added the two new fields to the process structure in fs
is so that if you try to request a large data transfer to/from a pipe, the
proper number of bytes that have actually been processed will be returned to
the caller.  Since read_write() and everything that read_write() calls
depends on nbytes, which is basically a global associated with the given
process, we can't store the large value there because read_write() doesn't
like large values for nbytes when dealing with pipes.  So we keep track of
how much work we actually have to do, and how much work was requested, by
keeping those values in the process structure itself.  This is guaranteed
to work, because the process' request will be repeatedly invoked until the
system call is done (either because the work is finished or because of an
error).

GNU tar is happy now, and so I'm happy now.  At least until I find that
there's some nasty and subtle bug in my code...:-)

So here's the compressed and uuencoded patch file.  Enjoy!


--
			Kevin Brown
		Addresses in preferred order:
		    csci31f7@cl.uh.edu 
		nuchat!kevin@uunet.uu.net


table
 !"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 pipe.patch.Z
M'YV-*@*">,.&S(LQ;]S,H>,"30(J=<J 4!+&#8@8-2[.T#$CA@X8,2[FR!%#z
M08N3(! J9.@0HD2*%C%JY.A1!@V1)!4$W,FSIPJ= F^PB#$#!$\%($",(%/&y
M3!HW$IU(^9+$R1,B1:8DW<IUAHP$+U0H!3&'S1LZ<T \!2%B+4(Y942H=?.&x
M*0@Z8<2PD:CB!5*E3)U"!2'URY0J4(I(T<JU<0VP8D>0-8MV+MDZ<,K( :'Ww
MS9@U=_/N->HWJ8(0@)L^E6ADBF$J088L^2(D"Y6L25'(N"'#*-DT>LJ\,0,"v
MQ1@T83:K2)$"1-C?P0<2=SIZ3IZ%9=J0Q?N9]-^_SYNDF3.F#!LV%8772:MRu
M8<7*??\N53WX<.*I38(<23)D*PP\1-U@!&0@M!'&&6F, 8(;=;0AAF8I)837t
M:F18-@=FFK7067?QG=0""$(1!8*'+<@7V&J$35755;@UMI57!$I6UEEIK=66s
M16_%-5==$N&E%U^EI2985%/9IQAC+B;UV',R4E:C11=FMMF&H/DX6GRFH3;?r
MD""T]EILL]5V&V,HQ "#3;[- 9QPQ!F'G'+,.2>6FM$-!P)U$EF'G7;N<1@Dq
M>&*)1YYYZ$'UQGH1KO1>6E@*B:*1^.G'GW\ SB @@08BJ""##D*HTH105;A6p
ME!E2Z9U/J 8$E%@TQ, "#388M9-)*+7Z*@XC>F@B?1)59<0320;[U7-WH*&9o
M1&N1$09>7[PAQQEJ/6G&&W?*\89V8M211D'>);4EBD4X0<073QCQA1%),%%$n
M8RV820.!;(+ %!UEC$%OA8TJL(*C@QDQ;GY3+)%  C#<< .F8>!QY[82,46>m
M'&G 08>ST8)@0U'Q[0LH"$1HEH8=951(9QF,!OGM8%H\X4017SA111.&):'%l
MNEN-/!P*>B14QA=NR)%" HTQR5D>]#X)0LZ#]9Q4HR<3^041*:_<\LN-H5!8k
MU"R[W,04+<CP<]"1':VST4_QR%5\.PU4T MFP&'M& T]%-%$%5V4$5$T?112j
M#".5Y.&=;GL6MTMTQW3W1C/ H$,-.>!44JJHK@J"##*PL)NLJOY-^:LPY'K2i
M7TD=EQS@7^ UQQH[#$Q@L0FB$=KI%0>NX(5S9.8&4Q4FU.U63]%!.AQID)'Zh
MP,_)3G*-^ :95.^_GR$'',,3:/P<:3E_*!S>:;SO<U08>R=!9MWQ%+1TW$&Mg
M4^:1D59R$JT7LF5T>"^"@<=1"WQF<J71!AQ[M5&&&WBA0QH2P@+.U($.^EH:f
M")(@KX2<P'?_&X-9YM C8VEG+74;01K,<+NF@. *26@"%++P!2@D(3%:>= 8e
MPN"^XH2A.7DXU DJA!R0)= W$P,!7+*UK0K%3R+_$R!<0+ &S4"%#6HA3@SKd
M (([O.=].12=&\Y008G<KPPW%(O^^)>=("YK@&XH8$4JA (Q-,=]FPF<\\+0c
MAK3$;UGR*H/M<F>1^(UG.W*H@[WJ )<"EL$%9W!!%D$ ASD4T'QUX%8->T2Mb
M!T5H?PRKD/CB=Q?OS8&-$@&A"$EH0A3&43!I$*#NPC"'0;[1=W;Z(1&-:!X0a
MU*&#FV'=<=3BNSM&"0YOH* /J95'-[@@*=U;U@G<^ 9JM4&/:!BD^>2PA@+.z
M@5H,# ,;G'B=N4BP#G91Y;3.\P;Q3?$NYEM8^M)2K#+\<#,_S,,)AAB&/4J3y
M#7D8I/MRMQFZ,"2+?MG7\@"8E+:5[BS2% /12#:\YTP,+T@4:-'N0BTRG(]Bx
M=DS+&Z3T1=UEC'?\))U"2;87,]"AH&+9:%HZZKL<.O1[Z$3#'2>JF8I:Y*)_w
MZ0/@WK:%PD!!"D\8PA2ZL(/O).4Y1DA#^D!@!VE&9 Z_1)M "&*0,YAE<'.#v
MB=UFTA&].8Y6'W+J&Z#ZDKK)!&^)6USC^)83R/E$<F8:2D:.\K>TQB!6)/I+u
M$;!P&RDX82Z^<R@ OP 7_N4!I MREH'.DP<0P& '9#$G0R^RV*>H5 RAU*$<t
MX;F[N=;UKLRC'1R^@)!7?I1X8N'4@S9C)]FE1;/_P]U +'+%RM)5,9CE)USLs
M\+'Q 5:T$"IMQ*SXMN.1;+&.G.W'WG=1R\(6KPLJPQTX^T[ AF2#R;T#6:Y#r
M+^VL\#Q^9 ,%#>O:RTK'#*73H;*,109<S@&PY@TE&!<+ES!4* S&<F]WC[N0q
M/-IK1W91@1S&&[(OE(TIJ2O>&WH'H1S^EY&2E2]\RR#?1AG7KBEYTYWZM(8Mp
M>&D*L)$-;6R3%9X22)5!'<T4J)N=86ZGG6M(JE_2QM07&.@I+AB#W+IJ.*IZo
M!"17_=N+?2ECPDGUJXA3'..N:M:>2"YQ+)A!K(Z2E%])X0I!D (1B#K@"F4+n
MO+@D" I2T-,F/^')49ZR':H\8?^Z(91;[G*7O@QE*5,Y>""@(AV^((9BSAD.m
MR<$DO>0PAS2?9LU@=O.8X2SG+RQS#7[V<J"GS!0[A-<L[N4K&Q,-Z#:+F<R0l
M)L,72"4'2F,5!$A6LN=*I&A+O]G*=<!R,=E :2>;>M 5,L,<S(QF+O_%U6$^k
M=9S-26<[?P'/<M"S9OIL:]3@VLW,*_2A6\WF7#?ZT6^(=+#;P.Q%ZSK3F\90j
MIVUMFB(?)6TVJ)P-<,5D$(!.3B#HWAWOJ,H=@\ L$ZTD'.5,3F<UDY"]I=YOi
M0RG&VR7V=FGI*QN$BM3=)85UHT$!%:10A2(T9P]_3H"R[9UFT":V,L6BUAC+h
M?%TDYBLI"6@;"'H  A.TC:89][" "8Q.^[TM-#_"HQY]UZ@$</H+:!QY<=K6g
M A_XLREFT%:%>D#RPWRA"DF8\@_2S?!UZ:!+06#"%!R.V)_.J0Y+[Q!*PLV"f
M<8_:IUOAGDIKY$;ON1O>V#OEKC%N[P).CX(UHD._19;:@$^6X"H^-\(EHO"Fe
M/SSB4%ENQW4^<696G$ 4Q#@:-.YO63/W/+O[2\BQ1W*3RVX+*0^P6'#)\L7*d
M#N;5H8-]:1XDFVL;YQ3<#,E1P'.?;Q;H0A]YT:MP]*2#8.D+;S@(GFZ$J$^=c
MRV&_>M97[&U5I0T'-6!!#FY2[K 0_?G0C[[TIT_]ZEO_^M;_R594H#J)\_K0b
MW6^,]I>&_?*;__SHCWY\4'/3)%@A"+?1=>$1G8(_[R%+P2>,8-]96"=&=EKUa
MI%QS 0<']$L@@ 3=5 8@(P<%!%WKI("U-44G$"U_MGV!Y0;!82UB=!FUDUKOz
M\W8%LAZ^XTAAX$1%%"J")'Y_PA5P@2#8L1GU-7,SY1E&\3P]]3?(IWP9$5=6y
MEWX^^(- V /C9Q3=-W_A=S:@HP)!N(1,6'WK!P+M]W[QEVS?1W'UAQKW9VZHx
M877Z)P>#15G^YSL &%T#6(!)@8!WH(":T8#$\8"T15L22(%;J$!T@8&:\08;w
MB%H=5"$@>$P+P1D248)A<((A8X!28$Y\I!",M4$5J$!I*%GE,5SO52#'<R!Ev
M4$ 4DX'4 EV/*%P@,XEOEX)GLX);T8+CL6<R=U\G1X/Z!3VKXFUH!0/)%P.Tu
MB#GCISK/TW/^I(>J17)6006&4053D!CB4@1$@%AA01?OEA!4M!G(,47C4W,#t
MDXNNQU<0^(DZ]XM?( 5%8 7N5Q5'H&:X>(WC<Q(]A1KC2 >)*(X)T >2AV=Gs
M-@8H( +S%R&)1 9N\$"2]8:!Z 8Q!!4B4$!6,35-P&U;X8YM!0,V,!0QT!L\r
M" *X" >ZN%F\^#Z^^ 3 >!C#&"Y8<8QRHHQF,440\HP(,D72F #4Z$^>:)&$q
M@9';V(W?Z 3A*'G32(Y39(X15Y/J* <6@0(P8) #XXX@!X\),H_UV%D%D8^^p
MLY(@4!'_&!<"^00$:9!)X8[%9WP"08NS* .=PU8H08L+V9 .J2NFP149IW-Mo
MX )ML&F'(@?EH6;]-&N#1W)IN99TD >9T5/Z)%D[V9,Q8)!":6[=ME1KTUYDn
M$&,S5CA3!58WUAMDY3<H89B(Z6->=3AY P.=\YBO6&22(P.N(@/D-BO>\A37m
M9!<B &QLU! B(!^DR0;8)!$BP&FJ^1T?TC1=\B]!$##!DA0%<S#/82 *@R=Ql
M]# 1,S&;<4<7XQT?\A=1"'_KXC_48XFN!)WG97'4*9UC2$IK,#X@, 59@&&Yk
MN00HY4JI%R%P4%@?5VFYQCQR('AH\$KT=X,HX9F6 U>Z<I4_D39>D62AJ2K;j
MUX0 &J"- @55( 1,,"G,XU#6Z%Y;]A<0-X=PT9<H8)B&!C'T@@+<& 1$ ([,i
MH6:!29LH@61O=1,/:10!>J)+.* %>J#]D:!OL*!DT*!)\:!:J!0;U$'$H4DCh
M5$(GE!4$0@3&U$Z+1TB[E1:OM!?4PU#<<A;&TI[C 22-&(/W=6 U&#'G6#.Bg
M)X/4@3TJ8 97FA2F^(+(-3)?*EDNB(JB(P=BT09Y<&57VHC/<07'0DN!)880f
MY3UFT$XEA1R^<T5IL4A-"1T2,7!MP&]-Z6_Q@RB(5!"-Z!MTX87\QY>)" )%e
M8 1"D 1'D$25)!%N(%*$E&?^@XII.$030RWH\2R7V$02L:ADT*ABH08BF!+Od
ME&":=@<66@9;=JA6UC ZTT2AY#JA9(!5X 8 J(Y/!$]N5Z0-Y*H@ *AJ5Q%Tc
MD0?<^2 U-$ ,2!;4\H@(L3__<TGT,IZ1U:1_Y*I^@1IP*A9!Q6>^HZW&TATYb
M1$'(0ARA9&+MEAW.4E@&X@:6F%+"Q![OQ)WK(4ASZ!M)0!S/5$ _9!&/"*M_a
MB&=)JH9R0#0J]4W2Q(SLQ6"U>JM;=D@J=1S,BA=%Y*]#9"=-T 3C&;!)(:=-z
M23T-(A$EVT0.Y#LMY*<N4+/D^F>-"%TH<)9$!P(E6T(X-00M(P57")$1.JD3y
MBK$5&DI\EZ$;*I,=BK-S*';_HZH15B]50BWPJJD153':E ;J>A?ZLZIE< (@x
M XA5VW'O X ?.W:2%0='Q1!)4;!T.AX(:RP*BRQG)D#2M":;*JA$952_-88_w
MQ*RAF!1/<$[B0T&'-*@,=K9V-$7K$Y+C.K!/F+-M$GB/QP9_AXXCHW.=.E#Gv
M%7&MYT\'%5"BJW-D2KH268TB15*JNR9EZH[F.K5BX03=9+5R]K=;JJM_2Z6<u
M!T":88!TFX8/6*<-Q)UA0*29P0)M6[4+&ZN#1Z&VRK1;1KS$8;Q#](QD,' 4t
MR[RI&C^'<@9HX+R6NZEYVZQA +G4(GH,5DN^0TJ!VH%CD ;2)*L4)+"C*+6\s
MTR8[1WB\MJ6L1P9QTK-.D"[GDBY0T!Q'RY/%H1ERP%D\4FS]6QPA@ *LIXO;r
MLEEEDP(]EP:_MEO,$7$-W)/4J[%.RZ$4S+]<B+O2Q:Y8NUA;"UVJQ$:'PD]Vq
M<F@# 3$E&:EP ;<D<R^R:A$/PJQ!QP;4L1>2]*NK)1&#ET,G;+TI,'>:>K!6p
MR["^TW',&L47VAP;5\+ZNWWE6J/+TR:ENUFGRP:>R@,DUTDL,P4RXW @0*-_o
MID%F$!@<4P1"4 5'$'%NTSMM(@(*:IA;]G2&R9TE8&6IFQ#E4;,NP 5N$) +n
M(E(4G !_#$"!C )I[*DDE\@I ,F2?,;_A%"4?*4CD%J,6+M&BX@.G+215KT7m
MFL)0N\)S2+MDC&Y!L*=W%+QRIZIF"T3NH1?C05[RMJZKNBU(Y*R-U%Z@@1F;l
MNL5E ,1_V#L:YSM[04HE%4[ AA8&* 0'5$EWY#\5479PI$JM-1Y*R:R0!2W_k
M,[ZNDT/<.QK:E$A(],-Q:X!R>KQG4 =Y)KQ0U$AFT1VOQ!1RT+:YY,0)00;Jj
ME1"&A*V:*I56X00&FE/BZ42GE1GUBSZ2)!%8+*D.7 3Z$015$<9+,\:8NW,:i
MS :;90;H<09I80(@ -$J,]&R4;0HR<H]"=)'(-).0,OYAP3'0J_R(\YT(!>Ih
MY#W2= ;.\JMIF12Y#,YIP<N-^\L)-G#!X4-\RJS:*Q%*S9WORC^1Y<RJ=&@&g
MV#T2X11A&[G0\H@G94OK&XC4]+PIP4=PP4^\#"%79@804D;UPD+;]8CB WDMf
M%%D&IA!\5$'E;"S0?+]Y#2%W?9RGI5C.'#A20EEKP6"SQ+3!)DIND (D[1USe
MR*97IG-NDAS+T=AR\*:VJW\O/*C%A#V>M2V;"A<FIHQMX"RK:F_ Q:M0D7=Sd
MN'<[U[K^]+I-X3L^8%B="Y&ANU"K)\K$[5$@<-QN'#,STQQ+-]UP/#.[!S@3c
M26>B2U*FO$%XC!5[W,?H>,ET$,B#C+&%'%C2=<C?E,A#4S2.#,H%M-PD0\&Gb
M?#NI#)&?2W)<C*NR? 0^32#Y?+8&DDW>8\]!?+&OK+&>G;)\:K4G90;6HAWBa
M&G&^P11S)%%UM. X';BN2;9Q=A;8^[<E+.)S,QX:+A9(2LX6H8EW"[U<?1:'z
M"@(0["Q4W+5W5"QPU(DXW>*+I4IJ*P<G_HA*';]'<X<SGKXIOGAIN( %XI1"y
M[JG(L:M5^W90])YID:>;@0+KP<^$%:B:2(GC7,Q";L[Y1D[(#(B<$=!%1 ;.x
MU+[>4U0C;K4I'M@)A47HB$-H8"UW8!&"6%AKH78KQ+@&I.1E+DW/9.:*J'9Cw
M?:L%W>=B@1SL,4%;;D6[Y;NSJDK*@A?PXSVM=>5-R0:&&4^4CK86(9E)T00,v
M=F;?]*Q+;BU#7.J-+LX6403ELEI_>T6>+>3%6^-*GEX"=+9V'A%-;K5.H3"Ju
MA-J$-&#"VW)"SLM#CJ=@^X<;5<SJ.P=*J>KXYAF^52%Y8$YS)^1*S1DH5NV,t
M! ?Z"S27BXXZ^[D\@-QS7,?B[4'DS<<YB=[J_:*$G )/E^.;8<@XC<AD8-^"s
MJM^H; 8YF>(H,#*5;,L1]QRZ;@0[S(&VHR:Z4UIKCL^\K8\KU$=7'*LE+.10r
M'H*SI,/&>[9ZE2?GDQSM#MH0&>]^V[,_V? ASGK"C<8 I<:I^R'._=W%7>#/q
M<00VOKS$/EPJ'J^ZJUA=Z^5SKNQIH#!BK=BI[NR/;1EN(T=YQMGCJ4I0@0?Pp
MVU*<'?-/F #.3I=MFFH@L"^KBXZBS?8DA]JSR\+H-@6D2>(K1,1YLAYS]#X8o
M!'D1U;CJR[YN?B%P\;&\%.(U[$Y(A%ND11R>VO((V_,&&/1%0U+,&LX588F*n
M3*M+V\51S]8Q6_@(=E).J=:-=4^6.\9V/-YZK.]SR._%(<C^SMX #P*'V)<&m
M/]^_99C5<BW@^\B17$"-RMW5N,D_C_S#+?0>I?#\S? 0FO.BK/P+!?0[[]V9l
M/_2JK13FL5W/(01E *@#5T1_N]0]C$3KS:!>[&\=/;U*"\NX&N%/Z/ !CJ$@k
M_;0$#OT*31QQ&D([RHUIA4;QH093\9$<(V$HR");=&YDRO>3"! 'Y.BL]O0%j
M6-J!D#T?1 HD 2H CDH.3*,2FP:C8<"?5.] #H$8 NT*-& 0,E!4W$!YD&%Ei
M@.D))ST79P =0VDD:2"0R+R!H;.2GNXX;H6&TTRHB/'!OD"C\6 ^8-8 ITWCh
MMSX$?DL+]<<$WC0)5:DN%8%3,S3I.1R'&#:&I%(0@ +$:,I80&BA=3X$Y4@^g
M,J C?!VNX "U"P24/!-PN8Q!#'@%-" 'E$D>\,UYAC40 NO%"/P[)O YH, 8f
MM@);X M\5S%04\W -F<]I$NIX@PYT+=!I 30 W/)0K,(0)#7"$&(T;I V!'Le
M.4HP83#!Z. $*1E-FH*)" 5404QED+*@6-B"W:$+?H$O& ;O1$L[%5<)K<P d
M'# 4: #&F!6:PP;0 ,O!&];@)'P.50 .?#J$YEF&C>]Z; 5'&CF[%4!RC@-\c
MTCSD":^E&KVV&=P+&8 +24H:/<$140W?DQM '03"4XV[DM)() +PNRAV#$=]b
M$ #(27K4%$@@ P/S<93B1@XCS#5,AZEK'>XV6E7Y$$KV\'[1CR:-@0;A7Z@%a
M-?2'YQ ;>BK@U^B\W.X8&#[0(CQ$:Q@1I8<E]'J39&+Q+H9Q$:T283((\F\Rz
M197*9&,^@F/J&Y\F)?:8E5AC&--'R$PP$3\AP*'0GW["W\@!EB,DE*CTI$%<y
MH&LR3;)F-NV+HEB:) (/, -C ("P@8;@ Q((4SR*3K%0G1D\<!"N!55D34;Qx
M-;&%*S.;1E-81(H,HRS:J+,(FU81W$ #J\DL-D6V<&"4XEJ<BZ<)5*G%JR@6w
M8Y.V48NWIMD@&WXB_[Z @8 #?D8GIHW-(0,:1[DQ42@J,J8?%66@$!0_45#Rv
M3T;5.]3P'*" 9@! VB'26:\[5D!0VWVC9--E3\BJ\R )P11.<V49RWK5P0VHu
MPCP4V/DT,F 6#9FA*!E[H_FAC"P*N6!&".>@^%<\Q&,ZJAZBD!\5I.H'^#)2t
M;N#%*:G<H;B>E,Q+"E*JEM"%_,()RU1V7!@JS2AXJ484IE!19I%=Y+$,G"E/s
M\2;6U-H;CZJ,"\FI(1)9[,G7PU-Z2MOY*=,WO_P6H3)4&R=1U9M[Q*P>U1<Jr
M+"EN%68J&N8]QB%J"E408E0Q$E.5'*@(X6-5S.K]S:K[U_YV50,9#"&1E@@Kq
M8N4LC)7P0E;/<5F=+V<UX:#5&Y!6WX1:K2]K-?H0&K=2",OBK%&,<'4L/MN[p
MRS_IZ@_!,'>EM1(A=)E794<B^(_;%K&FG+YJ1L7,Q'0<@(54F!7=LF():^0Uo
M+%*2%B"6Q%)>(8E\++X')\4X5NOX6(/HMX0\B4"R3-880ED?)!"Q+/_ALTR6n
M^>AV,ZM(.;*;%1\UU<X:4CWK9]V4G#*T;)K]BW^WJCC,QCNX_[H?%S)KZ0L6m
M9JW$PO1X7))<&&EM;/FRL_4@TM8[65O.HFW=$0:W$$Y<9+%;Z,MJ/07UTK>Bl
M@RKY7,=N<-TI/G<VOEUYH!X&*'$UJ<65JA[1-8-<$\NEE3J=X2--VAS269JKk
MXR0WFU/S)IGHNE*3I[M9O]]"<MX>1-*'98$?5DOT6,OLWG-P84UO3YVU#>:[j
M5 GP@G9[YLB5K2%B'QV*\@)?YJM69LGH]8?@'YGL8NKR>,6S=WE%[I8[BY<6i
M:%Y*!&5V%]H+_%I9\PNCV2\D<N@JU_[JDSKK?Y&<0B/ [E@!\T4(#%TP@07Fh
MT7H2!)-@3(&"E3$+AL',0$KC8'0!"8(P7V<H<][]6Y2UD7^=*]9FM20E#*R4g
M2.VV>1;I +.8R0[+@4_!AT6SN/4^]AX@,F*))(F]CQ#9JY[8F(R-HL]W01<Kf
M1B^SV#M9;%!S_ODN,,8G;YG.JGX];XVUL1Y%W>08'=,2]XXXY#OS!I%HWSP:e
MCE+LZ<"RWN>I&-D?J5D([PE6,K<I C19V$Q=G8R (3RP2<I$%__K;R3,92)*d
MV6@'8V:?E'BK[:EU+:FV*8&9E1AF6^[''3/(0S#% #-S)6G'ZM5*4JD=<P@<c
MN69_J'S8C^3 S9*"-]-E:0'7D3-Q";ZB13H[7^L,Q]&%.D"^%DL\JR)W@IZ]b
MK7N6LM8E5^-GP<:?[1(]*-!@B4';+BI!H7&VAM;HH(M,DVA,@*(U$?E%OS:(a
M4-EH(*"C)<B0-M*ZYDG+8#YG@U7 EO;28EK+F&G9LZ8ESKY4''0:3_-I7 BHz
MT;9+.3_>EU$C#C6,#2@U"X4&FAH(D)QNBW*N/'?(8*Q:YD0@YVNKE3BOIK7 y
MFLP*G;F-F90U:Y?6@B6%VT2GY:TUI;AVOH@<70LBSZ[S.#N^MD):"&!K<X.-x
M'<X%Q(?8Q.5B2RC;T+&A2PAA2R0;]J!LFL&R603,!JSVC$OY=:VO$<4]XK!Zw
MTM1IRZ&IS5O>KMSE*U^;*P$@LNV<E*VT8-MP6\^<E(ZDY;7&)J)2$@ZVA%W'v
MC032J 0P#IM;]GMNQ@T*D<WL)L>NVQR-8]OMC!:W\';'\%WL8YN6#&)@LMH'u
M-[O8TZ$++\Q"T4W15=^*G[,L&H=3^OFW9ODR&R?4ZGX&KFPA./<"/$FG@\N:t
MUTO":<X&$OPPW+$0<ARN[O Z59+B8J7N,G%S"X""./KI2EE<JI..;R3&,;E4s
MB>2.WA"5 ];B6@5(M]7C)AR0ZTMICLXYL4]IY&+I*U5TNU1@=LQFE8"D7+Y"r
M=1#)-U@Y^=(I6<N:VW*(PB*"N0L1J997F9.=:"[5J3EPEZ1HH".A$B$CZJD2q
M5WI,)Y4[I97NKI( .D%'34(='&F8I?&;F=,[9.N,R:N;G7]+_DVZ;%KIY)<$p
M.6A83=-E!DXG^+S'IUM>A4[4;3I2)TU.796+@:L.8QD@5U<1O%J+G'74PF@Ro
M.H-:-RK>*M6HF0&),M0%DKV$7:!*>L9.<"6[1[3L_A;6VZ'2+M51NQSRM<)6n
MME,[EJ[;=5-;&>Y P#HL=ZGNW(F!=$=4O<?$8'<MSEC.O#8A[^@=C7I]?K2\m
M[3M!FMX(Z8O*C+E/X&VW$F;P$![$,V4+#^?1SX>W)B(>_R(0+I5BZ"&-9Q$Xl
M'CLM.''R0X(\]D'XQ&>02W4G[YBD/-VV0#^DR[L3,"^K1AR:%QULGDU#A:V,k
M<**NZ\?\-@L<)7IBP>@-NX^H]&II35T[4 VR7JM&QU.G'NA\9E</BJ;0:*?Uj
M^DK76R^$JT&6 ;%'2\@>&#%[8PSMR5:U-]K<'K>$2$M4Y]"]1@0Y\P_><X%Zi
MKVXXDHHD*@1=1465CZAS]KW$5T(7'_UL?,;J\36(T<(S)Y_.*(C2Y/*]4><'h
M06LEYWN2[T.@@#ZT6B,%J^\@F*C/'ZD^ \/Z'J:-ZJ-J\X\V(KY92.??T]E]g
MB6B1+A181B_JB/W8+<1/DAT_S>KS.*L>?7YP-2%.O[E*83T5]NMNG[7[G3(Wf
MB&[$'_E+ ^9/E:"_H*G^SBJ$\UT:$O)P2$EX*.\EKH*9LRS#]C]TDQQYE"<Ae
#@+<1d
 c
end


--
			Kevin Brown
		Addresses in preferred order:
		    csci31f7@cl.uh.edu 
		nuchat!kevin@uunet.uu.net