pete@wlbr.EATON.COM (Pete Lyall) (08/02/88)
This is the asynchronous alarm tool that was requested last week. #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # alarmd.c # alarmd.hlp # alarmd.man # alarmd.uue # readme # talarmd.c # talarmd.uue # This archive created: Mon Aug 1 13:50:07 1988 export PATH; PATH=/bin:$PATH if test -f 'alarmd.c' then echo shar: will not over-write existing file "'alarmd.c'" else cat << \SHAR_EOF > 'alarmd.c' /* Alarmd - sleep 'n' seconds and then send parent an ** 'alarm' signal, if they are still alive. ** ** Pete Lyall ** 76703,4230 ** ** Example Usage: ** ** ** time2sleep = 20; ** sig2send = 10; ** sprintf(parameter,"%d %d\n", time2sleep, sig2send); ** os9fork("alarmd",strlen(parameter),parameter,1,1,0); ** ** Note: calling (parent) process must also set up an ** intercept() or a signal(SIG, routine) to catch the ** signal coming back from alarmd. ** */ #include <stdio.h> #include <os9.h> main(argc, argv) int argc; char *argv[]; { int pid, parent, time, sig2send; char pdesc[512]; struct registers regs; if(argc != 3) usage(); time = atoi(argv[1]); sig2send = atoi(argv[2]); if(time == 0) usage(); /* This will probably require a special sleep.r module that * can determine if we are a coco or not to get 'tick' resoltion * right. Will be added later. PWL */ sleep(time); pid = getpid(); regs.rg_a = pid; regs.rg_x = pdesc; /* get our process descriptor */ if(_os9(F_GPRDSC, ®s) != 0) exit(regs.rg_b); /* see who the parent is, and if they are still alive */ parent = pdesc[1]; if(parent == 0) exit(0); /* still alive - send the signal */ if(kill(parent,sig2send) != 0) exit(errno); } usage() { fputs("\nusage: alarmd [secs to sleep] [signal to send]\n", stderr); exit(1); } SHAR_EOF fi # end of overwriting check if test -f 'alarmd.hlp' then echo shar: will not over-write existing file "'alarmd.hlp'" else cat << \SHAR_EOF > 'alarmd.hlp' Alarmd - a pseudo alarm-clock daemon for use by PROGRAMS. Syntax: alarmd [seconds (in ASCII)] [signal (in ASCII)] [CARRIAGE RETURN] NOTE: Must be *forked* by the calling program using f$fork, os9fork(), or SYSCALL. See man page for more detail. SHAR_EOF fi # end of overwriting check if test -f 'alarmd.man' then echo shar: will not over-write existing file "'alarmd.man'" else cat << \SHAR_EOF > 'alarmd.man' ALARMD (1) OS9 ALARMD (1) NAME Alarmd - a program to send asynchronous alarm signals to other programs. SYNOPSIS Alarmd [ of seconds] [signal to send] DESCRIPTION Alarmd was written to provide a timing mechanism external to the calling program. This is useful for protecting against things like infinite loops, or waiting a finite period for an event to happen. Alarmd is a program unto itself, so it may be called by other programs, be they in basic09, C, Pascal09, or assembly. The parameters to alarmd are number of seconds to wait until sending a signal, and what signal to send when this time elapses. These parameters should be passed as ASCII strings, separated by one or more spaces, and terminated by a carriage return. The signal is always sent to alarmd's parent process, so the f$fork system call must be used to create this parent-child relationship (os9fork in C, F$fork in assembly, and syscall/syscallp in assembly or Pascal09). If BASIC09's 'SHELL' command or C's 'system()' command were used, they would create intermediate shells that would then become alarmd's parent, and destroy the parent-child relationship required. If the parent dies before alarmd can send its signal, alarmd will recognize this and exit quietly. For best efficiency, the alarmd program module should already be loaded in memory, so additional time is not wasted in the load process. EXAMPLES #define SIGALARM 5 /* could be anything */ int seconds = 15; sprintf(parameter,"%d %dn", seconds, SIGALARM); if(os9fork("alarmd",strlen(parameter),parameter,1,1,0) == ERROR) { etc.... } Also see example program provided. SEE ALSO Last printed: 7/9/88 Page 1 ALARMD (1) OS9 ALARMD (1) Talarmd, kill(), sleep(), and intercept() BUGS Must be the child of the process to be signalled. Unless compiled with a different version of the 'sleep()' routine than the one currently available in the Kreider library, the timing will be slow on a Color Computer. Sleep() assumes 100 ticks per second in Level II is used, and the Color Computer only has 60 ticks per second. The net result will be that for each second of time in the alarm parameter, the alarmd will take 1.4 seconds. This bug in the Kreider library will be fixed in the next release. AUTHOR Peter W. Lyall, Jr. 1040 Stern Lane Oxnard, CA 93035 OS9: (805) 985-0632 (1200 baud) CIS: 76703,4230 DELPHI: OS9UGVP Internet: pete@wlbr.EATON.COM UUCP: ..!{ihnp4,jplgodo,scgvax,voder,trwrb}!wlbr!pete Last printed: 7/9/88 Page 2 SHAR_EOF fi # end of overwriting check if test -f 'alarmd.uue' then echo shar: will not over-write existing file "'alarmd.uue'" else cat << \SHAR_EOF > 'alarmd.uue' begin 664 alarmd MA\T)HP`-$8&"`!T&(V%L87)MY`*FH*?`,!\F^#DT(#1`3U^GP%HF^Z[D,X0P MB0$C-!`QC0B*KJ$G!(W8[F(SR0`!KJ$G`HW,3Q&CY"<$I\`@]^YB[*$G!S"- M_Z07`0OLH2<%,,07`0(R9#40K\D!$1"OR0#1S``![<D!#3')`-,PY*:`YLD! M#L$=)U2!#2=0@2`G!($L)@2F@"#P@2(G!($G)AZOH6S)`0XT`J:`@0TG!*'D M)O8U!&\?@0TG(J:`(,(P'Z^A,`%LR0$.@0TG#($@)PB!+"<$IH`@\&\?(*0P MR0#1-!#LR0$--`8QQ(T*%P"1;^)OXA<'NC"I`2.OJ0$;$.^I`0\0[ZD!'<S_ M@A]!-!`PZZSA(BJLJ0$=)`JLJ0$;)1ZOJ0$=.2HJ*BH@4U1!0TL@3U9%4D9, M3U<@*BHJ*@TPC.3&SS0$A@(0C@!D$#^,;^(7!V+LJ0$/HZD!'3GLJ0$=HZD! M&SDT$#"K,(LT$.RA,,OLA.-B[800K.0F\3)D.31`S/VF%_^#,NG][NSI`A80 M@P`#)P,7`)>NZ0(8[`(T!A<#,3)B[>D"#*[I`ACL!#0&%P,@,F+MZ0(*[.D" M#"8#%P!L[.D"##0&%P-5,F(7!EKMZ0(0YV$P:J]D,.0T$,P`�&%P:#,F3M M?B<*YF(=-`87!KHR8N9K'>WI`@XF"4]?-`87!J@R8NSI`@HT!NSI`A`T!A<% ML#)D[7XG"^RI`1\T!A<&B#)B,ND"$C7`-$#,_[@7_M,PJ0`;-!`PC0`3-!`7 M`%8R9,P``30&%P9?,F(UP`UU<V%G93H@86QA<FUD(%MS96-S('1O('-L965P M72!;<VEG;F%L('1O('-E;F1=#0`T0#"I``[L9#06C0O&#>=A%P`;,F0UP#1` M[F2N9C06(`7G81<`".;`)O<R9#7`-$#N9NQ&A(#$(L$")CB!@"<'-$`7`9PR M8NQ&Q`0G+,P``30&,&?L2#06YD?$0"<%%P.7(`,7`WDR9A"#__\F.>9'RB#G M1\S__S7`A`$F"31`%P"I[>$F[J[$YF7G@*_$K$0D#.9'Q$`G#^9EP0TF"31` M%P"([>$FS>QD-<`T0.YFYF0T1A?_>.9IYV$7_W$R9#7`-$`PJ0`!QA`T!#00 MC0HU$#`-:N0F]#7$-$#N9!`G_Y/L1A`G_XW$`B<(-$"-%S)B(`)/7S0&[$@T M!A<"V3)B3U_M1C7&-$#N9!`G_V;L1L0BP0(0)O]<A(`F!S1`%P#`,F(T0(T$ M,F(UP#1`[F0R?*9&A`$F(^S$$*-$)QQ/7S0&-$`7`(\R8NP"-`;LA#0&[$@T M!A<"L#)H[,2C0NUB$"<`7NQ&A`$0)P!6Q$`G+>Q"("$T!NS$-`;L2#0&%P)W M,F;MY!"#__\G*.QBH^3M8NS$X^3MQ.QB)MD@)>QB-`;L0C0&[$@T!A<",S)F M$*-B)P_F1\H@YT?L1.W$S/__(!"F1HH!IT;L0NW$XTOM1$]?,F0UP#"I`1-/ M7^V$[0(Y-$#N9.9'Q<`F'S+HX##D[$@T%D]?-`87`1_&0*9F)P+&@#+H)NI' MYT>F1HJ`IT;$#"8Y[$LF!<P!`.U+[$(F$>Q+-`87`M$R8NU"$(/__R<$Q@@@ M"S!*KT+,``'M2\8$ZD?G1^Q"XTOM1.W$-<`T0.YD3U\T!C0$YL#!("?ZP0DG M]L$M)@3GY"`;P2LF&2`5[&%825A)XV%8230&YE]/P##CX>UAYL#!,"4$P3DC MX6W@-08G!$!0@@`UP.QB)QTT!A`_)2013Q`_#!`_'"0%S``*(`/,`&07``P@ M`\P``30&%P'0-9!-)A)M8B8.IF,]KN2O8HX``.WD-88T!LP``#0&-`:F9>9I M/>UBIF7F:#WC8>UA)`)LY*9DYFD]XV'M820";.2F9.9H/>/D[>2N9J]HKN3L M8C)H.31@IFGF9R<TP0$G,L$")Q3!!2<0P08G)L$.)R#!#R<9QM`@!1`_C20% M-6`6`M2O^`JN:N\"3U\UX!"N;*YJ$#^--6`6`L4T8*9IYF<G2,$")T+!`R=` MP00G-\$*)TC!"R<TP0PG0,$-)S#!#R<HP1`G),$1)Q[!%"<7P14G$\$9)P_! M&B<0P1LG',;0-6`6`G$0KF[N;*YJ(`P?B:9KKFP0KF[NZ!`0/XXU8!8"7:YB MIF40/X00)0))'XE/.:9C$#^/%@)&-"`0KF@G#J9EKF80/XHD!34@%@(H'R`U MH#0@$*YH)_6F9:YF$#^,(.4T0.QJ)@C.``".```@-!"#``$G)1"#``(G%,;W M3^VI`1_,__\PJ0$3[83M`C7`IF7&`A`_C27E(`FF9<8%$#^-)=H?,.-H[:D! M%1\#'Q#I9ZEF*\@?`>VI`1.F91`_B"6[,*D!$S7`.8X``%\0/PH6`:(Y-&"N M9A"N:.YJ$#\7->"F8^9E$#\/$"4!B#FN8A`_"A`E`7X?$#GLJ0$1-`;L9!"C MJ0$A)28T($]?$#\'XV80/P<?(#4@)`;,__\R8CGMJ0$1XZD!(:/D[:D!(3)B M[*D!(30&HV3MJ0$A[*D!$:/A-`9/KN2G@*RI`1$E^#6&[&+CJ0$;)2$0HZD! M'20:-`:NJ0$;3ZSD)`2G@"#X[*D!&S40KZD!&SG,__\Y[&(T(!`_!R0%S/__ M-:`?(#4@[:D!$4]?[:D!(3FF8^9E$#\(%@#83U\0/P00)0#&KF(G!.<!;X0? MB4\YIF/F91`_#18`N3/D,JD`_ZY"$*Y$IDE(2$A(JDOF3>Y&$#\%$#\&-&"N M9A"N:.YJIFVJ;^;H$1`_`S5@$"4`>A^)3SDT(!`_##4@'XE/.30@$#\,'R`U MH#0@(`\T((WO[7XG!\;6-2`6`$\0KF00/QPD#,'0)N\?(!"^`$OM*4]?-:`T M8*9GQCDT!LP0/S0&[FSL0:Y$$*Y&[DBMY#1![F\S2#8^-1*GPJ](,F0U8(4! M)P3,__\Y3U\Y3^VI`1_,__\Y)?5/7SD7``@7^I'L8A`_!CD``0``T``````` M```!`````````````````@`!`````````````$8``@`````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` E````````````````````````````````````86QA<FUD`+CV<0`` ` end SHAR_EOF fi # end of overwriting check if test -f 'readme' then echo shar: will not over-write existing file "'readme'" else cat << \SHAR_EOF > 'readme' Alarmd is a support pacakage that will allow programs to use an external timing and alarm mechanism. It may be used from C, BASIC09, assembly, or Pascal09. An example program 'talarmd' is provided to show one example of possible use from within a C program. To see how it works, load 'alarmd' (possibly also the test program 'talarmd') and type: Talarmd 15 Talarmd will tell 'alarmd' to send it an alarm in 15 seconds, and then go into an infinite loop. The 'talarmd' program will be sent an alarm in 15 seconds (21 on a coco - see the manual page for the reason) that will break it out of its loop. See the manual page for additional explanations. Pete Lyall. SHAR_EOF fi # end of overwriting check if test -f 'talarmd.c' then echo shar: will not over-write existing file "'talarmd.c'" else cat << \SHAR_EOF > 'talarmd.c' /* Talarmd - short example program to display proper ** use of the 'alarmd' program. Note: To be ** useful, the 'alarmd' program really should ** be memory resident ** ** Pete Lyall ** 76703,4230 ** 7/9/87 ** */ #include <stdio.h> #define SIGALARM 5 /* could be anything */ int ignalarm, gotalarm; int sigcatcher(); /* predclare it */ main(argc, argv) int argc; char **argv; { char parameter[80]; if(argc != 2) usage(); /* set up a function to catch the alarm */ intercept(sigcatcher); /* now start the 'alarmd' task ticking .. ** ** This could be cleaner by nabbing the 'alarmd's ** task id, and making SURE that it's that taskid ** that comes back in the 'wait(0)' call in the ** signal processing code. It could also be used ** to kill the 'alarmd' process if we have to bail ** out because of a signal, or whatever. ** ** Also remember - 'alarmd' should be memory resident, ** or you'll waste additional time loading it. ** ** This setup could even be made into a simple ** function, i.e 'wakemein(20)' - you get the idea. */ sprintf(parameter,"%s %d\n", argv[1], SIGALARM); if(os9fork("alarmd",strlen(parameter),parameter,1,1,0) == ERROR) { fputs("Whooops! Couldn't start 'alarmd'\n", stderr); exit(errno); } /* now let's do whatever needs to be interrupted */ while(gotalarm == FALSE) { puts("do wha ditty ditty dum ditty do...", stdout); } /* at this point, the alarm has broken us free */ puts("\nWhew! I was tired of singing!"); exit(0); } /* This is the function that catches and evaluates all ** the received signals. */ sigcatcher(sig) int sig; { if(sig == SIGALARM) { puts("Received the alarm!"); wait(0); /* receive the dead child's carcass */ /* see if we have it software disabled */ if(ignalarm) puts(".. but I'm ignoring it!"); else gotalarm = TRUE; } else { puts("Ooops! Got some other signal ... aborting!"); exit(sig); } } usage() { fputs("\nusage: talarmd [seconds]\n"); exit(1); } SHAR_EOF fi # end of overwriting check if test -f 'talarmd.uue' then echo shar: will not over-write existing file "'talarmd.uue'" else cat << \SHAR_EOF > 'talarmd.uue' begin 664 talarmd MA\T,>``-$8%<`!X&P'1A;&%R;>0"IJ"GP#`?)O@Y-"`T0$]?I\!:)ONNY#.$ M,(D!P#00,8T*TJZA)P2-V.YB,\D``:ZA)P*-S$\1H^0G!*?`(/?N8NRA)P<P MC?^C%P$+[*$G!3#$%P$",F0U$*_)`9P0K\D!7,P``>W)`9@QR0%>,.2F@.;) M`9G!'2=4@0TG4($@)P2!+"8$IH`@\($B)P2!)R8>KZ%LR0&9-`*F@($-)P2A MY";V-01O'X$-)R*F@"#",!^OH3`!;,D!F8$-)PR!("<(@2PG!*:`(/!O'R"D M,,D!7#00[,D!F#0&,<2-"A<`D6_B;^(7"@(PJ0'`KZD!IA#OJ0&:$.^I`:C, M_X(?0300,.NLX2(JK*D!J"0*K*D!IB4>KZD!J#DJ*BHJ(%-404-+($]615)& M3$]7("HJ*BH-,(SDQL\T!(8"$(X`9!`_C&_B%PFJ[*D!FJ.I`:@Y[*D!J*.I M`:8Y-!`PJS"+-!#LH3#+[(3C8NV$$*SD)O$R9#DT0,S_8!?_@S+HL.SH5!"# M``(G`Q<`[3"-`)PT$!<)*#)BS``%-`:NZ%CL`C0&,(T`\300,&8T$!<"&#)H M3U\T!LP``30&S``!-`8P9C00,&@T$!<&B.WD,(T`SC00%PC*,FP0@___)B\P MJ0`F-!`PC0"^-!`7`:8R9.RI`:HT!A<(]3)B(!$PJ0`9-!`PC0#"-!`7`7$R M9.RI`:XGZ3"-`-0T$!<!8#)B3U\T!A<(R#)B,NA0-<`T0,S_NA?^S.QD$(,` M!28N,(T`RC00%P$W,F)/7S0&%P@6,F+LJ0&L)PLPC0#$-!`7`1T@,\P``>VI M`:X@+#"-`,@T$!<!"3)B[&0@%C1`S/^Z%_Y_,(T`W#00%P$),F+,``$T!A<( M63)B-<`E<R`E9`T`86QA<FUD`%=H;V]O<',A($-O=6QD;B=T('-T87)T("=A M;&%R;60G#0!D;R!W:&$@9&ET='D@9&ET='D@9'5M(&1I='1Y(&1O+BXN``U7 M:&5W(2!)('=A<R!T:7)E9"!O9B!S:6YG:6YG(0!296-E:79E9"!T:&4@86QA M<FTA`"XN(&)U="!))VT@:6=N;W)I;F<@:70A`$]O;W!S(2!';W0@<V]M92!O M=&AE<B!S:6=N86P@+BXN(&%B;W)T:6YG(0`-=7-A9V4Z('1A;&%R;60@6W-E M8V]N9'-=#0`T0#"I`!GL9#06C0O&#>=A%P)^,F0UP#1`[F2N9C06(`7G81<" M:^;`)O<R9#7`-$`S9C"I`!GL9"`(-$`S:*YD[&:OJ0&P,(T"+B`0-$#L9.VI M`;`S:.QF,(T"*#1&-!"-!S)F-<`R:#GN9#)X(`FN;NR!KVZM^`KFP"?JP24F M]5^&?>WDYV?G8N;`P2TF!.=GYL#!,"<"QB#G9N9?%P&M[6/FP,$N)@OG8N;` M%P&>[>3FP,%C)[@T0,%F)S;!92<RP6<G+L%%)RK!1R<FP6PG0\%S)V'!9"=Y MP6\0)P$9P7@0)P#+P5@0)P#%P74G=C5`((+L930&,.@2[&1M9B8#S``&-!;, M?0#M:.9?3S0&%P.](!LT0*[H$NP"-`;LA#0&,`2OZ!;FP.]F-`87`X,R:!\# M%@"LC6\?`S1`%P.8,F)M9"<'$*-B(@+M8A<`R!8`DHU/-'9-*A!`4((`[>3& M+>?`(`2-/#1VS``%[6*G9#"I``$U!B`=;.2CA"3ZXX$T!.9A;6,F!5TG!FQC MRS#GP&]A-01J82;ARS#GP&_$,F0@/3.I`;*NZ!+L@:_H$CG$(.=GC>TT1L0/ M-`2&,,$)+P2&-ZMLJ^"GP.SD1%9$5D161%;MY";@;\2N8HT3,F(U0(TL-4`6 M_H_FA*;"IX#GQ#1`K.$E\CF-J31&Q`?+,.?`[.1$5D161%;MY";N(,@T0!<" MPC)B0%""`.-G[6=M:R8+C1X@!^;`)PRM^`[L9(,``>UD*O!M:R<"C08YYFRM M^!#L:8,``>UI*O(Y;^)OXC-?,*D`W"`7[.182>WD6$E82>/DZ\")`(,`,.WD MYL2FA80()N,UAJZI`;`T%A<`$#)D.:ZI`;#G@*^I`;!OA#DT0.YF[$:$@,0B MP0(F.(&`)P<T0!<!G#)B[$;$!"<LS``!-`8P9^Q(-!;F1\1`)P47`P$@`Q<" MXS)F$(/__R8YYD?*(.='S/__-<"$`28)-$`7`*GMX2;NKL3F9>>`K\2L1"0, MYD?$0"</YF7!#28)-$`7`(CMX2;-[&0UP#1`[F;F9#1&%_]XYFGG81?_<3)D M-<`T0#"I``S&$#0$-!"-"C40,`UJY";T-<0T0.YD$"?_D^Q&$"?_C<0")P@T M0(T7,F(@`D]?-`;L2#0&%P)#,F)/7^U&-<8T0.YD$"?_9NQ&Q"+!`A`F_UR$ M@"8'-$`7`,`R8C1`C00R8C7`-$#N9#)\ID:$`28C[,00HT0G'$]?-`8T0!<` MCS)B[`(T!NR$-`;L2#0&%P(:,FCLQ*-"[6(0)P!>[$:$`1`G`%;$0"<M[$(@ M(30&[,0T!NQ(-`87`>$R9NWD$(/__R<H[&*CY.UB[,3CY.W$[&(FV2`E[&(T M!NQ"-`;L2#0&%P&=,F80HV(G#^9'RB#G1^Q$[<3,__\@$*9&B@&G1NQ"[<3C M2^U$3U\R9#7`,*D!GD]?[83M`CDT0.YDYD?%P"8?,NC@,.3L2#063U\T!A<` MB<9`IF8G`L:`,N@FZD?G1Z9&BH"G1L0,)CGL2R8%S`$`[4OL0B81[$LT!A<" M"3)B[4(0@___)P3&""`+,$JO0LP``>U+Q@3J1^='[$+C2^U$[<0UP.9C,*D` M"\%D)Q#!;R<,P7@G",%8)P0P'N<!'Q`Y,(T``Q\0.0`T0.YDYL`F_#-?'S"C M9#7`-&"F:>9G)S3!`2<RP0(G%,$%)Q#!!B<FP0XG(,$/)QG&T"`%$#^-)`4U M8!8"3J_X"JYJ[P)/7S7@$*YLKFH0/XTU8!8"/S1@IFGF9R=(P0(G0L$#)T#! M!"<WP0HG2,$+)S3!#"=`P0TG,,$/)RC!$"<DP1$G'L$4)Q?!%2<3P1DG#\$: M)Q#!&R<<QM`U8!8!ZQ"N;NYLKFH@#!^)IFNN;!"N;N[H$!`_CC5@%@'7KF*F M91`_A!`E`<,?B4\YIF,0/X\6`<`T(!"N:"<.IF6N9A`_BB0%-2`6`:(?(#6@ M-"`0KF@G]:9EKF80/XP@Y31`[&HF",X``(X``"`T$(,``2<E$(,``B<4QO=/ M[:D!JLS__S"I`9[MA.T"-<"F9<8"$#^-)>4@":9EQ@40/XTEVA\PXVCMJ0&@ M'P,?$.EGJ68KR!\![:D!GJ9E$#^();LPJ0&>-<#LJ0&<-`;L9!"CJ0&\)28T M($]?$#\'XV80/P<?(#4@)`;,__\R8CGMJ0&<XZD!O*/D[:D!O#)B[*D!O#0& MHV3MJ0&\[*D!G*/A-`9/KN2G@*RI`9PE^#6&[&+CJ0&F)2$0HZD!J"0:-`:N MJ0&F3ZSD)`2G@"#X[*D!IC40KZD!ICG,__\Y[&(T(!`_!R0%S/__-:`?(#4@ M[:D!G$]?[:D!O#FF8^9E$#\(%@"$3U\0/P00)0!RKF(G!.<!;X0?B4\YIF/F M91`_#18`93/D,JD`_ZY"$*Y$IDE(2$A(JDOF3>Y&$#\%$#\&-&"N9A"N:.YJ MIFVJ;^;H$1`_`S5@$"4`)A^)3SDT0!\CKF2OJ0&^,(T`"!`_"35`%@`5'S)/ M-`:MN0&^,F([3^VI`:K,__\Y)?5/7SD7``@7^ZWL8A`_!CD``0`!6R<0`^@` M9``*;'@```````````$````````````````"``$`````````````1@`"```` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````````````````````$!`0$!`0$!`1$1 M$1$1`0$!`0$!`0$!`0$!`0$!`0$!,"`@("`@("`@("`@("`@($A(2$A(2$A( M2$@@("`@("`@0D)"0D)"`@("`@("`@("`@("`@("`@("`@(@("`@("!$1$1$ J1$0$!`0$!`0$!`0$!`0$!`0$!`0$!"`@("`!`````'1A;&%R;60`Z-/K ` end SHAR_EOF fi # end of overwriting check # End of shell archive exit 0 -- Pete Lyall (OS9 Users Group VP)| DELPHI: OS9UGVP | Eaton Corp.(818)-706-5693 Compuserve: 76703,4230 (OS9 Sysop) OS9 (home): (805)-985-0632 (24hr./1200 baud) Internet: pete@wlbr.eaton.com UUCP: {scgvax,jplgodo,voder}!wlbr!pete