Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (07/07/90)
Submitted-by: sas.UUCP!walker%sas@rti.rti.org (Doug Walker) Posting-number: Volume 90, Issue 200 Archive-name: comm/dnet/netkeys-2.0/part02 #!/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 archive 2 (of 2)." # Contents: netkeys.c netkeys.uu # Wrapped by tadguy@xanth on Sat Jul 7 11:13:12 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'netkeys.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'netkeys.c'\" else echo shar: Extracting \"'netkeys.c'\" \(15146 characters\) sed "s/^X//" >'netkeys.c' <<'END_OF_FILE' X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ X/* |_o_o|\\ Copyright (c) 1990 The Software Distillery. All Rights Reserved.*/ X/* |. o.| || This program may not be distributed without the permission of */ X/* | . | || the authors. */ X/* | o | || */ X/* | . |// Written by Doug Walker */ X/* ====== BBS:(919)-471-6436 VOICE:(919)-467-4764 */ X/* BIX: djwalker USENET: ...!mcnc!rti!sas!walker */ X/* 405 B3 Gooseneck Dr, Cary, NC 27513, USA */ X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ X/* X * Based on POPCLI III, written by John Toebes X * Uses Matt Dillon's DNET X */ X X#include "netkeys.h" X#include <intuition/intuitionbase.h> X#include <proto/intuition.h> X X#ifdef DEBUG X#undef DEBUG X#endif X X#define DEBUG 0 X X#if DEBUG X#define BUG(x) if(_Backstdout) MSG(_Backstdout, x); X#else X#define BUG(x) ; X#endif X X/* Declarations for CBACK */ Xextern BPTR _Backstdout; /* standard output when run in background */ Xlong _BackGroundIO = 1; /* Flag to tell it we want to do I/O */ Xlong _stack = 4000; /* Amount of stack space our task needs */ Xchar *_procname = "NetKeys II"; /* The name of the task to create */ Xlong _priority = 20; /* The priority to run us at */ X Xint InitDevice(GLOBAL_DATA *, int); Xint TermDevice(GLOBAL_DATA *); X Xstruct InputEvent * __regargs myhandler(struct InputEvent *ev, GLOBAL_DATA *gptr) X{ X struct InputEvent *ep, *laste; X struct NETKEYMSG *nkm; X int msgtype; X X if(gptr->state < EM_DOIT) return(ev); /* In the process of quitting */ X X /* run down the list of events to see if they pressed the magic button */ X for (ep = ev, laste = NULL; ep != NULL; ep = ep->ie_NextEvent) X { X msgtype = NKM_NONE; X if(gptr->state == EM_RELURK) X { X gptr->state = EM_LURK; X msgtype = NKM_ACK; X } X else if(ep->ie_Class == IECLASS_RAWKEY || ep->ie_Class == IECLASS_RAWMOUSE) X { X if( X ( X ep->ie_Class == IECLASS_RAWKEY && X ep->ie_Code == gptr->dokey && X (ep->ie_Qualifier & IEQUALIFIER_LCOMMAND) X ) X || X ( X gptr->state == EM_LURK && X ep->ie_Class == IECLASS_RAWMOUSE && X (ep->ie_Qualifier & IEQUALIFIER_RELATIVEMOUSE) && X (ep->ie_Code == IECODE_NOBUTTON) && X ((gptr->ibase->MouseX == 0 && ep->ie_X < 0 && X (gptr->exit & IECODE_NKLEFT)) || X (gptr->ibase->MouseX == gptr->swidth && ep->ie_X > 0 && X (gptr->exit & IECODE_NKRIGHT)) X ) X ) X ) X { X /* Remove the event from the chain */ X if (laste == NULL) X ev = ep->ie_NextEvent; X else X laste->ie_NextEvent = ep->ie_NextEvent; X X /* Telling us to toggle... */ X if(gptr->state == EM_DOIT) X { X gptr->state = EM_LURK; X msgtype = NKM_WEBEDONE; X } X else X { X gptr->state = EM_DOIT; X msgtype = NKM_HEREWEGO; X } X } X else if(gptr->state != EM_LURK) X { X /* Remove the event from the chain */ X if (laste == NULL) X ev = ep->ie_NextEvent; X else X laste->ie_NextEvent = ep->ie_NextEvent; X X msgtype = NKM_IEVENT; X } X } X else X laste = ep; X X if(msgtype != NKM_NONE) X { X if(!(nkm=(struct NETKEYMSG *)GetMsg(gptr->rtnp))) X { X if(gptr->nmsgs <= MAXMSGS) X nkm=AllocMem(NKMSZ, MEMF_CLEAR|MEMF_PUBLIC); X } X if(nkm) X { X nkm->msgtype = msgtype; X if(msgtype == NKM_IEVENT || msgtype == NKM_HEREWEGO) nkm->ie = *ep; X PutMsg((struct MsgPort *)gptr->nkmp, (struct Message *)nkm); X } X } X } X X /* pass on the pointer to the event */ X return(ev); X} X X#if DEBUG > 1 XBPTR _Backstdout = NULL; Xchar *cmd; X#define DCLMAIN int main(int argc, char *argv[]) X#else X#define DCLMAIN int _main(char *cmd) X#endif X XDCLMAIN X{ X struct MsgPort *inputDevPort = NULL; X struct MsgPort *oldport; X struct IOStdReq *inputRequestBlock = NULL; X struct Interrupt handlerStuff; X GLOBAL_DATA global; X struct NETKEYMSG *msg, *oldmsg, *tmpmsg; X int quit = 0; X UWORD smooth = 2; X struct Screen wbdat; X struct IntuitionBase *IntuitionBase; X struct GfxBase *GfxBase = NULL; X UWORD *NoSprData = NULL; X ULONG IBaseLock; X X#if DEBUG > 1 X /* Not really linked with cback */ X cmd = argv[1]; X _Backstdout = Output(); X#endif X X MSG(_Backstdout, BANNER); X X memset(&global, 0, sizeof(global)); X global.buddy = FindTask(0L); X global.dokey = DEFDOKEY; X global.state = EM_LURK; X X if(!(global.rtnp = CreatePort(0,0))) X { X MSG(_Backstdout, "Can't CreatePort\n"); X goto abort; X } X X oldport = FindPort(NKMPNAME); X X if(cmd) X { X long tmpl = DEFDOKEY; X while(*cmd) X { X while(*cmd != ' ' && *cmd != '\0') cmd++; X while(*cmd == ' ') cmd++; X X switch(cmd[0]) X { X case '\0': X case '\n': X break; X X case '0': X if(cmd[1] == 'x') X { X stch_l(cmd+2, &tmpl); X global.dokey = tmpl; X } X break; X X case 'F': case 'f': X smooth = 0; X break; X X case 'L': case 'l': X global.exit = IECODE_NKLEFT; X break; X X case 'Q': case 'q': X quit = 1; X break; X X case 'R': case 'r': X global.exit = IECODE_NKRIGHT; X break; X X case 'S': case 's': X smooth = 1; X break; X X case 'W': case 'w': X global.exit = IECODE_NKLEFT|IECODE_NKRIGHT; X break; X X default: X MSG(_Backstdout, X "USAGE: NetKeys [0xkey] [F|S] [L|R|W] [Q]\n"); X MSG(_Backstdout, " [0xkey] - RAW key code for hotkey\n"); X MSG(_Backstdout, " [F|S] - FAST or SMOOTH mode\n"); X MSG(_Backstdout, X " [L|R|W] - Mouse cursor exits LEFT, RIGHT or WRAPs\n"); X MSG(_Backstdout, " [Quit] - Terminate NetKeys\n"); X goto abort; X } X } X } X X if(!(oldmsg = AllocMem(NKMSZ, MEMF_CLEAR|MEMF_PUBLIC))) X { X MSG(_Backstdout, "No memory\n"); X goto abort; X } X if(quit) X { X if(!oldport) X { X MSG(_Backstdout, "Netkeys not installed\n"); X goto abort; X } X else X { X oldmsg->msgtype = NKM_QUIT; X oldmsg->m.mn_Node.ln_Type = NT_MESSAGE; X oldmsg->m.mn_ReplyPort = global.rtnp; X X PutMsg(oldport, (struct Message *)oldmsg); X while(!GetMsg(global.rtnp)) X WaitPort(global.rtnp); X GetMsg(global.rtnp); X X MSG(_Backstdout, "NetKeys removed\n"); X goto abort; X } X } X X if(oldport) X { X /* Modify the parms for the existing guy */ X oldmsg->msgtype = NKM_CONTROL; X oldmsg->m.mn_Node.ln_Type = NT_MESSAGE; X oldmsg->m.mn_ReplyPort = global.rtnp; X oldmsg->ie.ie_Class = global.dokey; X oldmsg->ie.ie_SubClass = global.exit; X oldmsg->ie.ie_Code = smooth; X PutMsg(oldport, (struct Message *)oldmsg); X X while(!GetMsg(global.rtnp)) X WaitPort(global.rtnp); X GetMsg(global.rtnp); X X MSG(_Backstdout, "Parameters modified on existing NetKeys command\n"); X goto abort; X } X FreeMem(oldmsg, NKMSZ); X oldmsg = NULL; X X MSG(_Backstdout, INSTR); X X if(global.exit == 0) global.exit = IECODE_NKLEFT|IECODE_NKRIGHT; X X if(smooth == 2) smooth = 0; X X if ( X ((global.nkmp = CreatePort(NKMPNAME, 0)) == NULL) || X ((inputDevPort = CreatePort(0,0)) == NULL) || X InitDevice(&global, NKM_HANDLER) || X ((inputRequestBlock = X CreateIOReq(inputDevPort, sizeof(struct IOStdReq))) == NULL) || X X !(global.ibase = (struct IntuitionBase *) X OpenLibrary("intuition.library", 0)) || X X !(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0)) || X X !(NoSprData = AllocMem(12, MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR)) || X X OpenDevice("input.device",0,(struct IORequest *)inputRequestBlock,0)) X { X MSG(_Backstdout, "Can't initialize - check DNET connection\n"); X goto abort; X } X X MSG(_Backstdout, "NetKeys installed\n"); X X#if DEBUG < 1 X if(_Backstdout) Close(_Backstdout); X _Backstdout = 0; X#endif X X IntuitionBase = global.ibase; X NoSprData[0] = 0xFE00; X NoSprData[1] = 0xFF00; X X /* If we have an appropriate version of intuition, ask for info */ X /* about the workbench screen */ X if(IntuitionBase->LibNode.lib_Version < 33 X || !(GetScreenData((char *)&wbdat, sizeof(struct Screen), X WBENCHSCREEN, NULL))) X { X /* Either we're running on an old version of the system, or the */ X /* GetScreenData call failed for some reason. In either case, */ X /* simply assume a 640x200 screen and be done with it. */ X global.swidth = 639; X } X else X { X /* Use the wb width, and STDSCREENHEIGHT. */ X global.swidth = wbdat.Width-1; X } X X handlerStuff.is_Data = (APTR)&global; X handlerStuff.is_Code = (VOID (*)()) myhandler; X handlerStuff.is_Node.ln_Pri = 52; X X inputRequestBlock->io_Command = IND_ADDHANDLER; X inputRequestBlock->io_Data = (APTR)&handlerStuff; X X DoIO((struct IORequest *)inputRequestBlock); X X while(global.state >= EM_DOIT && X !(SIGBREAKF_CTRL_C & Wait((1<<global.nkmp->mp_SigBit) | SIGBREAKF_CTRL_C))) X { X while(msg=(struct NETKEYMSG *)GetMsg(global.nkmp)) X { X if(msg->msgtype == NKM_QUIT) /* Msg from another invocation */ X { X ReplyMsg((struct Message *)msg); X goto abort; X } X else if(msg->msgtype == NKM_CONTROL) /* Msg from another invocation */ X { X global.dokey = msg->ie.ie_Class; X if(msg->ie.ie_SubClass) X global.exit = msg->ie.ie_SubClass; X if(msg->ie.ie_Code != 2) X smooth = msg->ie.ie_Code; X ReplyMsg((struct Message *)msg); X continue; X } X else if(msg->msgtype == NKM_HEREWEGO) /* From handler - start sending */ X { X if(msg->ie.ie_Class == IECLASS_RAWMOUSE) X msg->ie.ie_Code = global.exit; X else X msg->ie.ie_Code = global.exit|IECODE_NKHOTKEY; X X msg->ie.ie_Class = IECLASS_NKCONTROL; X X msg->ie.ie_Y = IntuitionBase->MouseY; X msg->ie.ie_X = IntuitionBase->MouseX; X X mshow(GfxBase, NoSprData, 0); /* Blank mouse */ X } X else if(msg->msgtype == NKM_WEBEDONE) /* From handler - quit sending*/ X { X mshow(GfxBase, NoSprData, 1); /* Unblank mouse */ X msg->ie.ie_Class = IECLASS_NKCONTROL; X msg->ie.ie_Code = IECODE_NKHOTQUIT|global.exit; X msg->ie.ie_Y = IntuitionBase->MouseY; X msg->ie.ie_X = IntuitionBase->MouseX; X } X X tmpmsg = NULL; X if( !smooth && X msg->ie.ie_Class == IECLASS_RAWMOUSE && X msg->ie.ie_Code == IECODE_NOBUTTON) X { X while((tmpmsg = (struct NETKEYMSG *)GetMsg(global.nkmp)) && X tmpmsg->msgtype == NKM_IEVENT && X tmpmsg->ie.ie_Class == IECLASS_RAWMOUSE && X tmpmsg->ie.ie_Code == IECODE_NOBUTTON && X (tmpmsg->ie.ie_Qualifier & IEQUALIFIER_RELATIVEMOUSE)) X { X tmpmsg->ie.ie_X += msg->ie.ie_X; X tmpmsg->ie.ie_Y += msg->ie.ie_Y; X PutMsg(global.rtnp, (struct Message *)msg); X msg = tmpmsg; X tmpmsg = NULL; X } X } Xputit: X if(DWrite(global.chan, (char *)&msg->ie, IESZ) != IESZ) X break; X X PutMsg(global.rtnp, (struct Message *)msg); X X if(DNRead(global.chan, (char *)&msg->ie, IESZ) == IESZ) X { X while(DNRead(global.chan, (char *)&msg->ie, IESZ) == IESZ); X X IBaseLock = LockIBase(0); X IntuitionBase->MouseY = msg->ie.ie_Y; X IntuitionBase->MouseX = (msg->ie.ie_X == 0 ? global.swidth-1 : 1); X UnlockIBase(IBaseLock); X X /* Set global state to RELURK and wait for handler to acknowledge */ X global.state = EM_RELURK; X do X { X if(!(msg=(struct NETKEYMSG *)GetMsg(global.nkmp))) X WaitPort(global.nkmp); X } X while(!msg || msg->msgtype != NKM_ACK); X mshow(GfxBase, NoSprData, 1); X } X else if(tmpmsg) X { X msg = tmpmsg; X tmpmsg = NULL; X goto putit; X } X } X } X Xabort: X if(global.ibase) CloseLibrary((struct Library *)global.ibase); X X if(GfxBase) X { X if(NoSprData) X { X mshow(GfxBase, NoSprData, 1); X FreeMem(NoSprData, 12); X } X CloseLibrary((struct Library *)GfxBase); X } X X TermDevice(&global); X X if (inputRequestBlock != NULL) X { X if (inputRequestBlock->io_Device != NULL) X { X inputRequestBlock->io_Command = IND_REMHANDLER; X inputRequestBlock->io_Data = (APTR)&handlerStuff; X DoIO((struct IORequest *)inputRequestBlock); X X CloseDevice((struct IORequest *)inputRequestBlock); X } X DeleteIOReq(inputRequestBlock); X } X X if (inputDevPort != NULL) DeletePort(inputDevPort); X X if(global.nkmp) X { X while(msg=(struct NETKEYMSG *)GetMsg(global.nkmp)) FreeMem(msg, NKMSZ); X DeletePort(global.nkmp); X } X X if(global.rtnp) X { X while(msg=(struct NETKEYMSG *)GetMsg(global.rtnp)) FreeMem(msg, NKMSZ); X DeletePort(global.rtnp); X } X X if(_Backstdout) Close(_Backstdout); X X return(0); X} X Xint InitDevice(GLOBAL_DATA *global, int which) X{ X X if(global->active) return(1); X global->active = 1; X X if(!(global->chan=(struct DChannel *) X DOpen(NULL, (uword)(PORT_NETKEYS), 127, 127))) X return(1); X X return(0); X} X Xint TermDevice(GLOBAL_DATA *global) X{ X if(!global->active) return(1); X X global->active = 0; X X if(global->chan) DClose(global->chan); X X global->chan = NULL; X X return(0); X} X Xvoid MemCleanup(void); Xvoid MemCleanup(){} END_OF_FILE if test 15146 -ne `wc -c <'netkeys.c'`; then echo shar: \"'netkeys.c'\" unpacked with wrong size! fi # end of 'netkeys.c' fi if test -f 'netkeys.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'netkeys.uu'\" else echo shar: Extracting \"'netkeys.uu'\" \(13190 characters\) sed "s/^X//" >'netkeys.uu' <<'END_OF_FILE' Xbegin 666 netkeys XM```#\P`````````#``````````(```#*````:P``!]<```/I````RDCG?OY+Z XM[P`T)$@D`$GY`````"QX``0I3@!:*4\`8D*L`%Y'^0```:!R`"`\`````V`"H XM)L%1R/_\)FX!%'``(CP``#``3J[^SBEK`)@`5DJK`*QG``%080`"G"(L`%8L4 XM;`&H3J[_H"E``%8@:P"LT<C1R")H`!#3R=/)(`)R`!(9*`DF`=*!T(%:@.6(L XMT*P`%"E``!1![```+'@`!$ZN_R(B0"\`(FD`$$?I`.8@1"`#8`(6V%'(__P6" XM_``@($H@`F`"%MA1R/_\0ALI2P!V($0@`V`"%MA1R/_\0A-%Z0!L*4H`&D7ZY XM_Q8B_````#DF">2+(M)"DD7Z`38@/````-T2VE'(__Q*K`"(9P``&D'L`(8B5 XM""0\```#[2QL`:A.KO_B*4``<BQX``1.KO]\(BP`D"0L`)0H+`",+&P!J$ZN/ XM_W8F3DJ`9@``("1?(FH`$"(L`%9.KO^F($HL>``$3J[_''!H8```)B1`(E]%. XMZO^D0>H`2D'H``0@*``$(4D`!"*((T``!"!`((EP`"QX``1.KO]V(DLL>``$A XM3J[^8DS??WY.=2EK`#H`)@:L````@``F80`!0$7Z`/`I2@`:80`!3"E``%XO5 XM`"1`("H`)&<2+&P!J"!`(B@``"E!`%9.KO^"(BH`(&<:)#P```/M3J[_XBE`V XM`&YG"N6(($`G:``(`*0@;`!>+PA(;``B(&@`)"EH``0`=DZZ`0A.N0``!"!P! XM`&```(0````Y`````"`/2.=^_BI`+'@`!$GY`````"E/`&)A``"ND\DL>``$X XM3J[^VB9`*6L`.@`F!JP```"``"8@:P"`T<C1R")H``S3R=/)*5$`'B%1``PB) XM+`!6+&P!J$ZN_X)(>@"$3KD```0@6$\B+``>+&P!J$ZN_V0B+`!63J[_IG``9 XM("P`3F<$($!.D$ZY```-CBQX``0B;`&H3J[^8DZY```88DJL`%YG&B(L`&YG9 XM!$ZN_]PL>``$3J[_?")L`%Y.KOZ&+FP`8DS??WY.=4/L`'IP`$ZN_=@I0`&H) XM9P``!$YU<&1@G$'K`%Q.KOZ`0>L`7$ZN_HQ.=0``3OD``!A@<&$```/L````0 XM`P````$````D```"/`````X````%`````@```L8```*T```"C````AP```,B* XM`````````_(```/J````:`````````````````````$````!````YD[Y````Y XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````9&]S+FQI8G)A<GD`*@`````!```/H````9`````4```````@("`@("`@( XM("`H*"@H*"`@("`@("`@("`@("`@("`@($@0$!`0$!`0$!`0$!`0$!"$A(2$0 XMA(2$A(2$$!`0$!`0$(&!@8&!@0$!`0$!`0$!`0$!`0$!`0$!`0$!$!`0$!`0" XM@H*"@H*"`@("`@("`@("`@("`@("`@("`@(0$!`0("`@("`@("`@("@H*"@H\ XM("`@("`@("`@("`@("`@("`@2!`0$!`0$!`0$!`0$!`0$(2$A(2$A(2$A(00P XM$!`0$!`0@8&!@8&!`0$!`0$!`0$!`0$!`0$!`0$!`0$0$!`0$!""@H*"@H("H XM`@("`@("`@("`@("`@("`@("`A`0$!`@```````#[`````$````"````D```( XM``````/R```#Z0``!]=.5?_L2.<A,B9()$DP*@`&2D!J!B`+8``!<"M+__Q"S XMK?_X2JW__&<``5Y^_W`"L&H`!F8,<`$U0``&?@-@``#*(&W__!`H``1R`;`!< XM9PAT`K`"9@``L+`!9A0R*``&-"H`!+1!9@@(*``&``EF4C(J``9T`;)"9G15N XM`&9P""@`!P`(9V@,:`#_``9F8")J`!)*:0!&9A`P*``*2D!J"`@J``(`&68:; XM,"D`1K!J`!9F/#`H``I*0&\T""H``P`99RQ*K?_X9@0F4&`((E`L;?_X+(E*8 XM:@`&9@IP`35```9^!6`F<``U0``&?@1@'%-!9QA*K?_X9@0F4&`&(FW_^"*0] XM?@!@!"M(__AP_[Z`9VP@:@`.+'@`!$ZN_HPK0/_T2H!F&`QJ`&0`"&X0<"PB6 XM/``!``%.KO\Z*T#_]$J`9SPB!R!`,4$`%$J!9P9T!+Z"9AI#Z``6+TD`%")M9 XM__PL;P`4=`0LV5'*__P\D2!J``HB;?_T+'@`!$ZN_I(@;?_\*U#__&``_IX@N XM"TS?3(1.74YU3F5T2V5Y<R!)20``FS%M3F5T2V5Y<R`R+C";,&T@8GD@1&]U0 XM9R!786QK97(*0V]P>7)I9VAT(*D@,3DY,"!4:&4@4V]F='=A<F4@1&ES=&ELA XM;&5R>0HR,S4@5')I;&QI;F=H86T@3&XL($-A<GD@3D,@,C<U,3,@55-!"D)": XM4SHH.3$Y*3,X,BTX,C8U"@``0V%N)W0@0W)E871E4&]R=`H`3F5T2V5Y<R`R/ XM+C``55-!1T4Z($YE=$ME>7,@6S!X:V5Y72!;1GQ372!;3'Q2?%==(%M170H`> XM("`@6S!X:V5Y72`@+2!205<@:V5Y(&-O9&4@9F]R(&AO=&ME>0H``"`@(%M&* XM?%-=("`@("T@1D%35"!O<B!334]/5$@@;6]D90H``"`@(%M,?%)\5UT@("T@# XM36]U<V4@8W5R<V]R(&5X:71S($Q%1E0L(%))1TA4(&]R(%=205!S"@``("`@A XM6U%U:71=("`@+2!497)M:6YA=&4@3F5T2V5Y<PH``$YO(&UE;6]R>0H``$YE1 XM=&ME>7,@;F]T(&EN<W1A;&QE9`H``$YE=$ME>7,@<F5M;W9E9`H``%!A<F%M; XM971E<G,@;6]D:69I960@;VX@97AI<W1I;F<@3F5T2V5Y<R!C;VUM86YD"@``X XM57-E("=.971+97ES(%%5250G('1O(')E;6]V90I);G-T86QL:6YG+"!P;&5A_ XM<V4@=V%I="XN+@H``&EN='5I=&EO;BYL:6)R87)Y`&=R87!H:6-S+FQI8G)A0 XM<GD``&EN<'5T+F1E=FEC90``0V%N)W0@:6YI=&EA;&EZ92`M(&-H96-K($1.5 XM150@8V]N;F5C=&EO;@H`3F5T2V5Y<R!I;G-T86QL960*``!.5?XX2.<W$B9O& XM`>R1R'X`?`(K2/Y$*TC^2"M(__0K2/_\2JP`<F<8<$'0@"(L`')!^OU*)`@F` XM`"QL`:A.KO_0<"%R`$'M_[P0P5'(__R3R2QX``1.KO[:*T#_O#M\`!/_P#M\; XM``'_PD*G0J=.N@D"4$\K0/_*2H!F(DJL`')G``=H<!$B+`!R0?K]=B0()@`LW XM;`&H3J[_T&``!TY#^OUT+'@`!$ZN_GHK0/_X(`MG``&`<!,K0/X\2A-G``%TU XM$!-R(+`!9PA*`&<$4HM@\'`@L!-F!%*+8/9P`!`3<EI=06L``+RP>Q`(9O1.V XM^Q`$`'=@``"B`%=@``"<`'-@``"0`%-@``"*`')@``!Z`%)@``!T`'%@``!HF XM`%%@``!B`&Q@``!2`$Q@``!,`&9@``!``$9@```Z`#!@```.``I@`/]X``!@N XM`/]R<'BP*P`!9@#_:$'K``)(;?X\+PA.NAF"4$\@+?X\.T#_P&``_TQ\`&``@ XM_T8[?``$_]1@`/\\?@%@`/\V.WP`"/_48`#_+'P!8`#_)CM\``S_U&``_QQ*\ XMK`!R9Q9P*2(L`')!^OQR)`@F`"QL`:A.KO_02JP`<F<6<"8B+`!R0?K\@"0(9 XM)@`L;`&H3J[_T$JL`')G%G`B(BP`<D'Z_(PD""8`+&P!J$ZN_]!*K`!R9Q9P? XM-B(L`')!^OR4)`@F`"QL`:A.KO_02JP`<F<`!=1P("(L`')!^ORN)`@F`"QLF XM`:A.KO_08``%NG`L(CP``0`!+'@`!$ZN_SHK0/^T2H!F*$JL`')G``6:<@HO[ XM00`<(BP`<D'Z_)(D""8O`!PL;`&H3J[_T&``!7I*AV<``)A*K?_X9B)*K`!R< XM9P`%9G`6(BP`<D'Z_&XD""8`+&P!J$ZN_]!@``5,(&W_M#%\``$`%!%\``4`@ XM""%M_\H`#B!M__@B;?^T+'@`!$ZN_I(@;?_*+'@`!$ZN_HQ*@&8*(&W_RDZNW XM_H!@YB!M_\HL>``$3J[^C$JL`')G``3X<!`B+`!R0?K\&"0()@`L;`&H3J[_P XMT&``!-Y*K?_X9P``A"!M_[0Q?``"`!01?``%``@A;?_*``XP+?_`$4``&C`M1 XM_]010``;,48`'"!M__@B;?^T+'@`!$ZN_I(@;?_*+'@`!$ZN_HQ*@&8*(&W_6 XMRDZN_H!@YB!M_\HL>``$3J[^C$JL`')G``1N<#`B+`!R0?K[H"0()@`L;`&H8 XM3J[_T&``!%0B;?^T<"PL>``$3J[_+D*M_[1*K`!R9Q9P."(L`')!^ON@)`@F) XM`"QL`:A.KO_0,"W_U&8&.WP`#/_4<`*\0&8"?`!"ITAZ^C9.N@604$\K0/_&7 XM2H!G``",0J="ITZZ!7Q03RM`__Q*@&=X2'@``DAM_[QA``3V4$]*@&9F2'@`( XM,"\M__Q.N@7N4$\K0/_T2H!G4$/Z^V9P`"QX``1.KOW8*T#_SDJ`9SI#^OMB$ XM<`!.KOW8*T#^2$J`9RAP#"(\``$``TZN_SHK0/Y$2H!G%$'Z^TYP`")M__1RX XM`$ZN_D1*@&<B2JP`<F<``VIP*2(L`')!^OLZ)`@F`"QL`:A.KO_08``#4$JL= XM`')G%G`2(BP`<D'Z^T0D""8`+&P!J$ZN_]!*K`!R9PPB+`!R+&P!J$ZN_]Q"^ XMK`!R(&W_SB)M_D0RO/X`,WS_```"*TC^3`QH`"$`%&4:0>W^4"`\```!6G(!P XMD\DL;?Y,3J[^5DJ`9@@[?`)__])@"C`M_EQ30#M`_])![?^\*TC_[$'Z]L`KS XM2/_P&WP`-/_G(&W_]#%\``D`'$'M_]XB;?_T(T@`*"QX``1.KOXX,"W_PFT`_ XM`IAP`"!M_\80*``/<@$D`>&B`$(0`"`"+'@`!$ZN_L((```,9@`"<B!M_\8L" XM>``$3J[^C"M`_[A*@&>^<@$@0+)H`!1F"B)`3J[^AF```DIR`K)H`!1F+G0`\ XM%"@`&CM"_\!**``;9PIT`!0H`!L[0O_4,B@`''0"LD)G`BP!(D!.KOZ&8*)RW XM!+)H`!1F2'("LB@`&F8*,BW_U#%!`!Q@##(M_]0`00`!,4$`'!%\``0`&B)M@ XM_DPQ:0!$`"(Q:0!&`"!"IR\M_D0O+?Y(3KH-BD_O``Q@0G`%L&@`%&8Z2'@`_ XM`2\M_D0O+?Y(3KH-;$_O``QP!"!M_[@10``:,"W_U`!```(Q0``<(FW^3#%IA XM`$0`(C%I`$8`($*M_[!*1F9P<`(@;?^XL"@`&F9D#&@`_P`<9EP@;?_&+'@`C XM!$ZN_HPK0/^P2H!G2"!`2F@`%&9`<@*R*``:9C@,:`#_`!QF,`@H``<`'F<HX XM(FW_N#(I`"#3:``@,"D`(M%H`"(@;?_*3J[^DBMM_[#_N$*M_[!@I"!M_[C0( XM_``62'@`%B\(+RW_VDZZ"!1/[P`,<A:P@68`_DH@;?_*(FW_N"QX``1.KOZ2Y XM(&W_N-#\`!9(>``6+P@O+?_:3KH&$D_O``QR%K"!9@``H"!M_[C0_``62'@`W XM%B\(+RW_VDZZ!?!/[P`,<A:P@6?@<``L;?Y,3J[^8BH`(&W_N#UH`"(`1$IHC XM`"!F"C`M_])(P%.`8`)P`3U``$8@14ZN_EP[?``"_\(@;?_&+'@`!$ZN_HPK/ XM0/^X2H!F""!M_\9.KOZ`2JW_N&?><`,@;?^XL&@`%&;22'@``2\M_D0O+?Y(* XM3KH+X$_O``Q@`/VH2JW_L&<`_:`K;?^P_[A"K?^P8`#^^DJM_\YG#")M_\XL? XM>``$3J[^8DJM_DAG-$JM_D1G(DAX``$O+?Y$+RW^2$ZZ"Y1/[P`,(FW^1'`,Q XM+'@`!$ZN_RXB;?Y(+'@`!$ZN_F)(;?^\80`!!EA/2JW_]&<T(&W_]$JH`!1G; XM(#%\``H`'$/M_]XA20`H(D@L>``$3J[^.")M__1.KOX^+RW_]$ZZ`=Q83TJMB XM__QG"B\M__Q.N@%<6$]*K?_&9R@@;?_&+'@`!$ZN_HPK0/^X2H!G"B)`<"Q.# XMKO\N8.(O+?_&3KH!+EA/2JW_RF<H(&W_RBQX``1.KOZ,*T#_N$J`9PHB0'`L* XM3J[_+F#B+RW_RDZZ`0!83TJL`')G#"(L`'(L;`&H3J[_W'``3-]([$Y=3G5.^ XM50``+PLF;P`,2JL`&F<$<`%@)G`!)T``&G!_+P`O`$AX)19"ITZZ`TI/[P`0G XM)T``'F8$<`%@`G``)E].74YU+PLF;P`(2JL`&F8$<`%@&D*K`!I*JP`>9PHO: XM*P`>3KH'XEA/0JL`'G``)E].=4YU2.<#,B9O`!@N+P`<</\L>``$3J[^MBP`D XM#`8`_V8$<`!@2'`B(CP``0`!3J[_.B1`(`IF#'``$`9.KOZP<`!@*B5+``H@^ XM!Q5```D5?``$``A"*@`.%48`#Y/)3J[^VB5``!`B2DZN_IX@"DS?3,!.=4CGB XM`!(F;P`,(DLL>``$3J[^F'``$"L`#TZN_K`B2W`B3J[_+DS?2`!.=4Y5__Q(" XMYP$2)F\`&"XO`!P@!R(\``$``2QX``1.KO\Z*T#__$J`9Q8@0!%\``4`"$(H5 XM``DB!S%!`!(A2P`.3-](@$Y=3G5(YP`2)F\`#!=\`/\`"#!\__\G2``4)T@`I XM&'``,"L`$B)++'@`!$ZN_RY,WT@`3G5.5?_X2.<!`CXO`!I"K?_\<!!R`2QX] XM``1.KO\Z<@`R!R\!2'H`:B\`*T#_^$ZZ#S1/[P`,+'@`!$ZN_WPB;?_X3J[^% XM>DJ`9A1"IR\M__A.NOZ@4$\K0/_\2H!F#B)M__AP$"QX``1.KO\N+'@`!$ZN> XM_W8@+?_\3-]`@$Y=3G5$3D54+E!/4E0N6%A86%@`1$Y%5"Y03U)4+B5L9``P+ XM`$1.150N54Y)5"X``"5S)7,``$CG`#(F;P`0)&L`"B`+9RPL>``$3J[_?"\+M XM80``NEA/2H!F]"\+3KK^B%A/+'@`!$ZN_W8B2G`03J[_+DS?3`!.=4Y5__A(? XMYS`RE<H@"F8^(&T`""QX``1.KOZ,)D`@2R`(9RHP*P`<#$``(68.0J<O"V$`? XM!NQ03R1`8`87?``!`!\B2RQX``1.KOZ&8+X@;0`(T/P`&")M``@B:0`4L\AG2 XM('``(&T`"!`H``]R`20!X:)V`!8`YZ$@`BQX``1.KO[.(`IG!"!*8`*1R"`(/ XM3-],#$Y=3G5.5?_\2.<P$B9O`!P@2RQX``1.KOZ,*T#__$J`9PX@0!%\``$`= XM'R)`3J[^AD'K`!@B:P`4L\AG&'``$"L`#W(!)`'AHG8`%@#GH2`"3J[^SDJMJ XM__Q6P$0`2(!(P$S?2`Q.74YU3E4``$Y=3G5.5?_,2.<'$B9O`%`^+P!6'"\`, XM6QHO`%\@"V8$1_K^C"\+2&W_T&$`!?903RM`_\QR?KH!8P(J`0P%`(%D`GJ!` XMO`%C`BP!#`8`@60"?($@0$JH`")G7#M\`"#_['(`,@<K0?_H*T#__"M`_]X;% XM1O_9<@`2!2M!_]H@:``B0^W_T"QX``1.KOZ22&W_T&$`!-)83Q`M_^]*`&88> XM("W_Z"!M_\PQ0``T+PAA``9(("W_S&`*+RW_S&$`!A9P`$SM2.#_N$Y=3G5.! XM5?_T2.<W,B9O`#0N+P`\?`!**P`V9P9P_V```41*AV<``1)!ZP`F+'@`!$ZNK XM_OXD0"!*(`AF$"!+3J[^C"1`($H@"&<``.YP![`J``AF+DJK`#QG!%.K`#Q*Q XMJ@`D9Q`B:@`H("H`)"QX``1.KO\N(DIP,"QX``1.KO\N8*`P*@`<#$``)&<B$ XM#$``(V<(#$``(F8``(P7?``!`#8B2BQX``1.KOZ&8`#_=B`J`"`B*@`DDH`J' XM`;J';BH@:@`HT<`@!2)M``Q@`A+84X!D^IZ%W(7;K0`,(DHL>``$3J[^AF``F XM_SP@:@`HT<`@!R)M``Q@`A+84X!D^MR'WZH`('X`+'@`!$ZN_WP5?``%``A!% XMZP`4(DI.KO\03J[_=F``_P`5?``!`!\B2BQX``1.KOZ&8`#^["\+80`$]%A// XM2BL`-F<<<``0*P`/<@$D`>&B=@`6`.>A(`(L>``$3J[^SB`&3-],[$Y=3G5(H XMYP<R)F\`'"1O`"`N+P`D?`!**P`V9P1P_V`P2H=G*B!++'@`!$ZN_H`O!R\*T XM+PMA`/YF3^\`#"H`W(5*A6L*U<6>A4HK`#9GTB`&3-],X$YU2.<!$"9O``PN( XM+P`0)T<`.$S?"(!.=4Y5_\A(YP,R)F\`5"1O`%@N+P!<+`=*JP`X9WI"IR\+: XM80`"[%!/2H!K:'`P(CP``0`!+'@`!$ZN_SH@0#%\`"0`''(`,BL`-"%!`!@A3 XM2P`L(4L`#BM`_\P@!W(!3J[_.B!M_\PA0``H(4<`)"`'(DHL:``H8`(<V5.`< XM9/H@:P`B(FW_S"QX``1.KOZ24JL`/&!&?/]@0CM\`"3_['``,"L`-"M`_^@K7 XM2__\*TO_WBM*__@K1__T(&L`(D/M_]`L>``$3J[^DDAM_]!A``'^6$]*+?_OZ XM9P)\_R\+80`#@"`&3.U,P/^T3EU.=4Y5_]!(YP`2)F\`0#M\`"/_['``,"L`F XM-"M`_^@K2__\*TO_WB!K`")#[?_0+'@`!$ZN_I)(;?_080`!IBZ+80`#,DSM^ XM2`#_R$Y=3G5.5?_02.<'$B9O`$P>+P!3/"\`5AHO`%L[?``F_^QP`#`K`#0K/ XM0/_H*TO__"M+_]YP`#`&2$!"0'(`$@7A@8"!<@`2!X"!*T#_^"!K`")#[?_0A XM+'@`!$ZN_I)(;?_080`!-"Z+80`"P$SM2.#_O$Y=3G5.5?^<2.<`$B9O`'0@< XM"V8$1_KZ6B\+2'KZ5DAZ^EY(;?^E3KH)#D_O`!!#[?^E+'@`!$ZN_GHK0/^<L XM9T)"IT*G3KKX?CM\`"7_[$*M_^A"K?_\*T#_WBM`_Z`@;?^<0^W_T"QX``1.O XMKOZ22&W_T&$``+(NK?^@3KKXN$_O``Q*K?^<5L!$`$B`2,!,WT@`3EU.=4Y51 XM_\Q(YP`2)F\`1#M\`"+_['``,"L`-"M`_^@K2__\*TO_WB!K`")#[?_0+'@`. XM!$ZN_I)2JP`\0JL`.$AM_]`O"V$``)!03T'K`"8L>``$3J[^_BM`_\Q*@&8.B XM($M.KOZ,*T#_S$J`9Q8@;?_,$7P``0`?(D@L>``$3J[^AF#(+PMA``%Z3.U($ XM`/_$3EU.=4CG(!(F;P`0<`>P*P`(9QP@:P`.<``0*``/<@$D`>&B(`(L>``$) XM3J[^PF#<+'@`!$ZN_WPB2TZN_P1.KO]V3-](!$YU3E7_^DCG`3(F;P`>?@`@] XM*P`\L*L`.&]6($LL>``$3J[^@"!+3J[^C"1`<`>P*@`(9C!*1V8&?@`>*@`?R XMM>T`#&<:2JH`)&<,(FH`*"`J`"1.KO\N(DIP,$ZN_RY3JP`\8*Q!ZP`F(DI., XMKO\*8*`@!TC`3-],@$Y=3G5.5?_02.<`,B9O`$0D;P!(<$`B/``!``$L>``$* XM3J[_.B!`$7P`!``(*T#__'#_3J[^MB!M__P10``/D\E.KO[:(&W__"%``!!#' XMZ``4+PE.N@A((&W__-#\`"8NB$ZZ"#I83R`K`!@@;?_\,4``-"=(`"P@"F<F/ XM+PI(>O@42'KX'$AM_]%.N@;,3^\`$$/M_]$L>``$3J[^>B=```X@;?_\(6L`O XM#@`B(`A,WTP`3EU.=4CG`!(F;P`,<``0*P`/+'@`!$ZN_K`B2W!`3J[_+DS?< XM2`!.=4CG,!(F;P`40>L`&")K`!2SR&8,0>L`*B)K`":SR&<<<``0*P`/<@$D/ XM`>&B=@`6`.>A(`(L>``$3J[^SDS?2`Q.=0``3E7__$CG(3`F;P`<)&\`("XO+ XM`"0K:P`F__Q*AV<L2JP`F&=L("P`F"(`0D%(02!M__PQ00`*)#P``/__P((Q' XM0``.D\DI20"88$8@;?_\#&@!(``(9CH,:`$B``QF,DJL`)AF%G``,"@`"DA`^ XM0D!R`#(H``Z`@2E``)@@"D)`2$`Q0``*(`H"@```__\Q0``.3-\,A$Y=3G5.M XM=4YU3E7_Q$CG)S`F;P!<)&\`8'X`?`!Z`'``&WP`(/_[<@`K0?_V=/\K0O_R! XM0>W_T!M`__$;0/_\*T'_Y"M!_^@K2/_,2A-G0G``$!-R&%U!:SBP>Q`(9O9./ XM^Q`$`"-@```@`"!@```6`"M@```,`"U@```"?@%@#GP!8`IZ`6`&&WP``?_\V XM4HM@NA`3<C"P`68&4HL;0?_[<"JP$V80(%)#Z``$)(DK4/_V4HM@#DAM__8O! XM"TZZ!(103]?`$!-R+K`!9B92BW`JL!-F$"!20^@`!"2)*U#_\E*+8`Y(;?_RL XM+PM.N@164$_7P!`3<FRP`68*&WP``?_Q4HM@"')HL`%F`E*+$!MR`!(`&T#_: XM\'`P74!K``)4LGL`"&;T3OL`!`!C8``"*@!S8``!Z`!88``!?@!X8``!>`!PM XM8``!7@!O8``!#`!U8```X@!D8````DHM__%G#"!20^@`!"2)(!!@"B!20^@`W XM!"2)(!`K0/_L;`IR`42M_^PK0?_H2JW_Z&<$<"U@"DH&9P1P*V`"<"`;0/_01 XM<``0!B(M_^B"@'``$`6"@&<(4JW_S%*M_^0O+?_L+RW_S$ZZ`N903RM`_\@@O XM+?_R2H!J!G(!*T'_\B`M_\@B+?_RDH!([0`"_\1O+B!M_\PB2-/!8`(2V%.`: XM9/IP`!`M__LB+?_$(&W_S&`"$,!3@63Z("W_\BM`_\C1K?_D0>W_T"M(_\Q*I XM!V<``5`;?``@__M@``%&2BW_\6<,(%)#Z``$)(D@$&`*(%)#Z``$)(D@$"M`" XM_^Q@`/]B2BW_\6<,(%)#Z``$)(D@$&`*(%)#Z``$)(D@$"M`_^Q*+?_\9Q(@- XM;?_,$/P`,'(!*T'_Y"M(_\PO`"\M_\Q.N@)`4$\K0/_(8`#_*!M\`##_^R`MZ XM__)*@&H&<`@K0/_R2BW_\6<,(%)#Z``$)(D@$&`*(%)#Z``$)(D@$"M`_^Q*? XM+?_\9Q8@;?_,$/P`,!#\`'AR`BM!_^0K2/_,+P`O+?_,3KH"'%!/*T#_R'!83 XML"W_\&8`_KY(;?_03KH!4%A/8`#^L"!20^@`!"2)(E`K2?_,9@A!^@#<*TC_V XMS"!M_\Q*&&;\4XB1[?_,*TC_Y"`M__)*@&LJL<!O)BM`_^1@('`!*T#_Y"!2$ XM0^@`!"2)(!`;0/_00BW_T6`&<`!@``",("W_Y"(M__:R@&P(=``K0O_V8`21< XMK?_V2@=G-E.M_^1M&'``(&W_S!`8+P`K2/_,(&T`$$Z06$]@XE.M__9M2'``3 XM$"W_^R\`(&T`$$Z06$]@Z%.M__9M$G``$"W_^R\`(&T`$$Z06$]@Z%.M_^1M4 XM&'``(&W_S!`8+P`K2/_,(&T`$$Z06$]@XB`+3-\,Y$Y=3G4``$Y5__9(YP$P% XM)F\`'B1O`"(K;0`0__8>&DH'9S1P);X`9B*P$F8$4HI@&B\+2&W_]B\*80#[_ XMS$_O``PK0/_Z9P0D0<``0!R\`3I-83V#&3-\,@$Y=3G5(YR`P)F\`$"1+7 XM2A)G)'``$!)![`"="#```0@`9PIR`!(`=""2@F`$<@`2`!2!4HI@V"`+3-\,4 XM!$YU``````````!P82`O``@@;P`$3E7_]")/<@I.N@%<!D$`,!+!2H!F\"`)] XM$.&_R6;Z0A"0CTY=3G4``"`O``@@;P`$3E7_]")/(@`"00`'!D$`,!+!YHAFS XM\"`)$.&_R6;Z0A"0CTY=3G4``#`Q,C,T-38W.#EA8F-D968@+P`((&\`!$/O/ XM``0R``)!``\2^Q#<Z(AF\B`)(@]8@1#ALHEF^D(0D(%.=2!O``0B2'(`<``O\ XM`@P0`"MG!@P0`"UF`E)($!@$```P;1(,```);@PD`>6!TH+2@=*`8.8,$0`M_ XM9@)$@20?(`A3@"!O``@@@9")3G4O!RXO``A2K`&D(`<@;`&@$,`I2`&@+A].. XM=4Y5``!(YP`P)F\`$"1O`!1"K`&D*4L!H$AM`!`O"DAZ_\9.NOX^(&P!H$(0S XM("P!I$SM#`#_^$Y=3G5*@&H``!Y$@$J!:@``#$2!80``($2!3G5A```81(!$! XM@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$P3`"B XM2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&944,,00@`9```!NF964,,= XM02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(0<3!( XMD()D```(4T/0@63^<@`R`TA#Y[A(0,%!)A\D'TYU(&\`!")(<@!P`!`8!```X XM,&TH#```"6\<!```$6T<#```!6\,!```(&T0#```!6X*!@``"NF!TH!@T"`(= XD4X`@;P`(((&0B4YU(&\`!""(6)!"J``$(4@`"$YU``````/RA X`` Xend Xsize 9396 END_OF_FILE if test 13190 -ne `wc -c <'netkeys.uu'`; then echo shar: \"'netkeys.uu'\" unpacked with wrong size! fi # end of 'netkeys.uu' fi echo shar: End of archive 2 \(of 2\). cp /dev/null ark2isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@cs.odu.edu>. Mail comments to the moderator at <amiga-request@cs.odu.edu>. Post requests for sources, and general discussion to comp.sys.amiga.