home *** CD-ROM | disk | FTP | other *** search
- /*
- UDP Probe.c
-
- Main code for Host Probe. This is just a simple program that will 'probe' a host using
- UDP.
-
- This was originally could only probe a host using UDP (hence everything is named with UDP ;-)
- As an afterthought I decided to add TCP probing (should be easy, right? ;-) so the code may
- look a little kludgy, but it should work as advertised.
-
- History:
- 03/08/94 dn - Created.
- 06/27/95 dn - Prepared for initial release.
- 06/28/95 dn - Added TCP probing facilities.
- 11/28/95 mc - Converted to CodeWarrior
- */
-
- // System Includes
- #include <MyTCPIncludes.h>
- #include <Sound.h>
- #include <Icons.h>
-
- #if defined(SYMANTEC_C)||defined(THINK_C)
- #else
- #include <stdio.h>
- #include <SIOUX.h>
- #endif
-
- // Local Includes
- #include "UDP Probe.h"
- #include "Probes.h"
-
- Boolean gQuit,gResolverDone;
- short gMacTCP;
-
- IPAddr gOurAddr;
-
- AEEventHandlerUPP gOappUpp,gOdocUpp,gPdocUpp,gQuitUpp;
-
- Boolean gUDP=true;
-
- // Main Code Entry Point
- void main(void){
- OSErr err;
-
- #if defined(SYMANTEC_C)||defined(THINK_C)
- #else
- SIOUXSettings.initializeTB = FALSE;
- SIOUXSettings.standalone = FALSE;
- SIOUXSettings.setupmenus = FALSE;
- SIOUXSettings.autocloseonquit = FALSE;
- SIOUXSettings.showstatusline = TRUE;
- #endif
- err=InitToolbox();
-
- #if defined(SYMANTEC_C)||defined(THINK_C)
- #else
- printf("\r");
- fflush(stdout);
- #endif
- if (err==noErr){
- err=Initialize();
-
- if (err==noErr){
- err=MainLoop();
- }
-
- err=CleanUp();
- }
-
- KillMacTCP();
- }
-
- // appleevents.h
- OSErr InitializeAppleEvents(void){
- OSErr err=noErr;
-
- gOappUpp=NewAEEventHandlerProc(HandleOApp);
- gOdocUpp=NewAEEventHandlerProc(HandleODoc);
- gPdocUpp=NewAEEventHandlerProc(HandlePDoc);
- gQuitUpp=NewAEEventHandlerProc(HandleQuit);
-
- err=AEInstallEventHandler(kCoreEventClass,kAEOpenApplication,gOappUpp, 0, FALSE);
-
- if (err!=noErr)
- return err;
-
- err=AEInstallEventHandler(kCoreEventClass,kAEOpenDocuments,gOdocUpp, 0, FALSE);
-
- if (err!=noErr)
- return err;
-
- err=AEInstallEventHandler(kCoreEventClass,kAEPrintDocuments,gPdocUpp, 0, FALSE);
-
- if (err!=noErr)
- return err;
-
- err=AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,gQuitUpp, 0, FALSE);
-
- return err;
- }
-
- pascal OSErr HandleOApp(AppleEvent* ae,AppleEvent* reply,long refCon){
- OSErr err=noErr;
-
- err=HandleRequiredParams(ae);
-
- if (err==noErr){
- // do any open application stuff here.
-
- // nothing to do, it has been done in the initialization routines...
- err=NewProbeDialog();
-
- } else
- HandleMissedParams(reply);
-
- return err;
- }
-
- pascal OSErr HandleODoc(AppleEvent* ae,AppleEvent* reply,long refCon){
- OSErr err=noErr;
-
- err=HandleRequiredParams(ae);
-
- if (err==noErr){
- // do any open document stuff here...
- err=NotHandledEvent(reply);
-
- }
-
- return err;
- }
-
- OSErr NotHandledEvent(AppleEvent* ae){
- OSErr err;
-
- if (ae->dataHandle!=nil){
- Str255 errStr="\pUDP Probe can't process the event";
-
- err=AEPutParamPtr(ae,keyErrorString,typeChar,(Ptr)&errStr[1],errStr[0]);
- }
-
- return errAEEventNotHandled;
- }
-
- OSErr HandleMissedParams(AppleEvent* ae){
- OSErr err=noErr;
-
- if (ae->dataHandle!=nil){
- Str255 errStr="\pRequired parameters were not received";
-
- err=AEPutParamPtr(ae,keyErrorString,typeChar,(Ptr)&errStr[1],errStr[0]);
- }
-
- return err;
- }
-
- pascal OSErr HandlePDoc(AppleEvent* ae,AppleEvent* reply,long refCon){
- OSErr err=noErr;
-
- err=HandleRequiredParams(ae);
-
- if (err==noErr){
- // do any print document stuff here
- err=NotHandledEvent(reply);
- } else
- HandleMissedParams(reply);
-
- return err;
- }
-
- pascal OSErr HandleQuit(AppleEvent* ae,AppleEvent* reply,long refCon){
- OSErr err=noErr;
-
- err=HandleRequiredParams(ae);
-
- if (err==noErr){
- // do any error free quit stuff here.
- } else
- HandleMissedParams(reply);
-
- gQuit=true;
-
- return noErr; // force to noErr because we don't care about errors...
- }
-
- OSErr HandleRequiredParams(AppleEvent* ae){
- DescType type;
- Size size;
- OSErr err;
-
- err=AEGetAttributePtr(ae, keyMissedKeywordAttr,typeWildCard, &type,nil, 0, &size);
-
- if (err==errAEDescNotFound){ // you got all the required parameters
- err=noErr;
- } else {
- if (err == noErr) // you missed a required parameter
- err=errAEParamMissed;
- // else the call to AEGetAttributePtr failed
- }
-
- return err;
- }
-
- OSErr Initialize(void){
- OSErr err=noErr,serr;
- Handle mbar;
- MenuHandle mh;
-
- // Initialize our application...
-
- // init the globals
- gQuit=false;
- gMacTCP=-1;
- gOurAddr.a.addr=(b_32)0L;
-
- // install our menu bar
- mbar=GetNewMBar(kMBar);
- SetMenuBar(mbar);
- DrawMenuBar();
- mh=GetMHandle(kMApple);
- AddResMenu(mh,'DRVR');
-
- // Initialize the apple events...
- err=InitializeAppleEvents();
-
- if (err==noErr){
- // Initialize TCP & DNR
- err=OpenMacTCP(&gMacTCP,true);
-
- if (err==noErr){
-
- // pass null to use the "Hosts" file in the system folder
- err=OpenResolver((StringPtr)NULL);
-
- if (err==noErr){
- // Have the resolver, now get our address...
- GetAddrParamBlock* ip;
-
- ip=NewGetIPParmBlkPtr();
-
- ip->ioCRefNum=gMacTCP; // the TCP driver refnum global...
-
- // get our ip address
- err=GetMyIPAddr(ip,FALSE); // do it sync...
-
- if (err!=noErr){
- // Sometimes it can return an error, but it can be ignored
- // if the ioResult field for the IP parm block is noErr.
- // check the ioResult to be sure...
- err=ip->ioResult;
- }
-
- if (err==noErr){
- // continue...
-
- InitProbes();
- } else
- HandleError("\pError getting local Macintosh address",err);
-
- // Done with the GetIPParmBlock
- DisposeGetIPParmBlkPtr(ip);
- } else
- HandleError("\pError opening the Resolver",err);
- } else
- HandleError("\pError opening MacTCP",err);
- }
-
- return err;
- }
-
- pascal void ResolverDone(HostInfoPtr rp,char* userData){
-
- gResolverDone=true;
- }
-
- OSErr CleanUp(void){
- OSErr err=noErr;
- WindowPtr wind;
- WindowPeek wp;
-
- #if defined(SYMANTEC_C)||defined(THINK_C)
- // For some reason Mike didn't like this.
- // I know it is overkill, but I still like to properly
- // clean things up before dying
- // (with all of the strange inits/cdevs out there, something might depend upon this)
-
- // close any open windows
- wind=FrontWindow();
-
- if (wind!=(WindowPtr)0L){
- while (wind!=(WindowPtr)0L){
- wp=(WindowPeek)wind;
-
- if (wp->windowKind<0){
- // da window
- CloseDeskAcc(wp->windowKind);
- } else {
- // get rid of the window...
- DisposeWindow(wind);
- }
-
- wind=FrontWindow();
- }
- }
- #endif
-
- CleanupProbes();
-
- // close DNR
- err=CloseResolver();
-
- // Get rid of the UPPs for our apple event handlers...
- DisposeRoutineDescriptor(gOappUpp);
- DisposeRoutineDescriptor(gOdocUpp);
- DisposeRoutineDescriptor(gPdocUpp);
- DisposeRoutineDescriptor(gQuitUpp);
-
- return err;
- }
-
- OSErr MainLoop(void){
- OSErr err=noErr;
- EventRecord er;
- Boolean gotEvent;
-
- while (!gQuit){
- err=HandleDataArrivals();
-
- if (err!=noErr)
- break;
-
- gotEvent=WaitNextEvent(everyEvent,&er,60,(RgnHandle)0L); // no null events
-
- #if defined(SYMANTEC_C)||defined(THINK_C)
- #else
- if (SIOUXHandleOneEvent(&er))
- continue;
- #endif
-
- if (gotEvent){
-
- if (IsDialogEvent(&er)){
- // let the dialog handle it
- Boolean did;
- DialogPtr dlg;
- short item;
-
- did=DialogSelect(&er,&dlg,&item);
-
- if (did){
- // we must handle the event for the dialog
- if (dlg!=(DialogPtr)0L){
- long ref=GetWRefCon((WindowPtr)dlg);
- if ((ref=='NebU')||(ref=='NebP')){
- // it's our dialog...
- HandleProbeDialog(&er,dlg,item);
- }
- }
- }
- } else {
- // let the normal routines handle the event
- err=HandleEvent(&er);
- }
-
- if (err!=noErr){
- //gQuit=true;
- HandleError("\pHandleEvent Returns Error",err);
- }
- } else {
- // didn't get a good event, perhaps an event for the dialog to process
- if (IsDialogEvent(&er)){
- DialogPtr dlg;
- short part;
-
- if (DialogSelect(&er,&dlg,&part)){
- // needs more work
- err=HandleProbeDialog(&er,dlg,part);
- }
- }
- }
- }
-
- return err;
- }
-
- OSErr HandleProbeDialog(EventRecord* erp,DialogPtr dlg,short item){
- OSErr err=noErr;
- long ref;
- short i;
- Handle h;
- Rect r;
-
- if (dlg==(DialogPtr)0L)
- return paramErr;
-
- ref=GetWRefCon((WindowPtr)dlg);
-
- if ((ref!='NebU')&&(ref!='NebP'))
- return paramErr;
-
- switch (item){
- case 1: // ok button
- // Hide the dialog
- HideWindow((WindowPtr)dlg);
-
- if (ref=='NebU')
- err=StartProbe(dlg);
-
- // now get rid of the dialog...
- DisposeDialog(dlg);
-
- break;
- case 2: // cancel button
- if (ref=='NebU'){
- // Hide the dialog
- HideWindow((WindowPtr)dlg);
-
- // now get rid of the dialog...
- DisposeDialog(dlg);
- }
- break;
- case 11: // udp radio
- if (ref=='NebU'){
- GetDItem(dlg,11,&i,&h,&r);
-
- if (GetCtlValue((ControlHandle)h)==0){
- // must change
- SetCtlValue((ControlHandle)h,1);
-
- GetDItem(dlg,12,&i,&h,&r);
- SetCtlValue((ControlHandle)h,0);
- }
- }
- break;
- case 12: // tcp radio
- if (ref=='NebU'){
- GetDItem(dlg,12,&i,&h,&r);
-
- if (GetCtlValue((ControlHandle)h)==0){
- // must change
- SetCtlValue((ControlHandle)h,1);
-
- GetDItem(dlg,11,&i,&h,&r);
- SetCtlValue((ControlHandle)h,0);
- }
- }
- break;
- default:
- break;
- }
-
- return err;
- }
-
- // handle any events we get...
- OSErr HandleEvent(EventRecord* erp){
- OSErr err=noErr;
-
- switch (erp->what){
- case mouseDown:
- err=HandleMouse(erp);
- break;
- case keyDown:
- case autoKey:
- err=HandleKey(erp);
- break;
- case diskEvt:
- err=HandleDisk(erp);
- break;
- case updateEvt:
- err=HandleUpdate(erp);
- break;
- case activateEvt:
- err=HandleActivateEvt(erp);
- break;
- case kHighLevelEvent:
- err=HandleHighLevelEvent(erp);
- break;
- case osEvt:
- if (erp->message & 0x01000000){
- if (erp->message & 0x00000001){ // resume event
- err=HandleActivate(erp);
- } else {
- err=HandleDeactivate(erp);
- }
- }
-
- if ((erp->message & 0xff000000)==0xfa000000){ // mouse moved
- // you only get this when a non-nil value is passed to WNE
- err=HandleMouseMoved(erp);
- }
-
- break;
- default:
- break;
- }
-
- return err;
- }
-
- // use this routine to handle mouse clicks.
- OSErr HandleLimitedMouse(EventRecord* erp,short* ppart,Boolean* handled){
- OSErr err=noErr;
- short part;
- WindowPtr wind;
- Point pt,lpt;
- long ms;
-
- pt=erp->where;
- lpt=pt;
- LocalToGlobal(&pt);
-
- part=FindWindow(erp->where,&wind);
-
- *ppart=part;
-
- if (wind==(WindowPtr)0L)
- return noErr;
-
- switch (part){
- case inMenuBar:
- case inDesk:
- case inSysWindow:
- SysBeep(5);
- break;
- case inContent:
- break;
- case inDrag:
- {
- Rect br;
-
- BlockMoveData((Ptr)(&qd.screenBits.bounds),(Ptr)&br,sizeof(Rect));
-
- InsetRect(&br,4,4);
-
- DragWindow(wind,lpt,&br);
- *handled=true;
- }
- break;
- case inGoAway:
- // perhaps we should close the window?
- break;
- case inZoomIn:
- case inZoomOut:
- {
- Boolean sel=true;
-
- if (erp->modifiers & cmdKey)
- sel=false; // don't select if the cmd key is down
-
- ZoomWindow(wind,part,sel);
- *handled=true;
- }
- break;
- default:
- // some weird part was clicked
- // we ignore it...
- SysBeep(5);
- break;
- }
-
- return err;
- }
-
- OSErr HandleMouse(EventRecord* erp){
- OSErr err=noErr;
- short part;
- WindowPtr wind;
- Point pt,lpt;
- long ms;
-
- pt=erp->where;
- lpt=pt;
- LocalToGlobal(&pt);
-
- part=FindWindow(erp->where,&wind);
-
- switch (part){
- case inMenuBar:
- err=HandleMenuEnabling();
- ms=MenuSelect(lpt);
- err=HandleMenu(ms);
- break;
- case inDesk:
- case inSysWindow:
- SystemClick(erp,wind);
- break;
- case inContent:
- SelectWindow(wind);
- break;
- case inDrag:
- {
- Rect br;
-
- BlockMoveData((Ptr)(&qd.screenBits.bounds),(Ptr)&br,sizeof(Rect));
-
- InsetRect(&br,4,4);
-
- DragWindow(wind,pt,&br);
- }
- break;
- case inGoAway:
- // we shouldn't get these...
- DisposeWindow(wind);
- break;
- case inZoomIn:
- case inZoomOut:
- {
- Boolean sel=true;
-
- if (erp->modifiers & cmdKey)
- sel=false; // don't select if the cmd key is down
-
- ZoomWindow(wind,part,sel);
- }
- break;
- default:
- // some weird part was clicked
- // we ignore it...
- break;
- }
-
- return err;
- }
-
- OSErr HandleMenuEnabling(void){
- OSErr err=noErr;
-
- // nothing to activate or deactivate.
-
- return err;
- }
-
- OSErr HandleMenu(long ms){
- OSErr err=noErr;
- short menu,item;
-
- menu=HiWord(ms);
- item=LoWord(ms);
-
- if (menu!=0){
- // a valid menu choice
- switch (menu){
- case kMApple:
- err=HandleApple(item);
- break;
- case kMFile:
- err=HandleFile(item);
- break;
- default:
- // could be an error, but I am ignoring them...
- break;
- }
- } else {
- ms=MenuChoice();
-
- // ms represents a disabled choice the user picked.
- }
-
- HiliteMenu(0);
-
- return err;
- }
-
- OSErr HandleError(StringPtr errStr,OSErr err){
- OSErr ierr=noErr;
- Str255 numErr;
- long lerr;
-
- // build the error number string
- lerr=(long)err;
- NumToString(lerr,numErr);
-
- // have paramtext fill in the alert
- ParamText(errStr,numErr,"\p","\p");
-
- // let stopalert display the error message.
- StopAlert(128,(ModalFilterUPP)0L);
-
- return ierr;
- }
-
- OSErr HandleLongError(StringPtr errStr,long err){
- OSErr ierr=noErr;
- Str255 numErr;
- long lerr;
-
- // build the error number string
- lerr=(long)err;
- NumToString(lerr,numErr);
-
- // have paramtext fill in the alert
- ParamText(errStr,numErr,"\p","\p");
-
- // let stopalert display the error message.
- StopAlert(128,(ModalFilterUPP)0L);
-
- return ierr;
- }
-
- OSErr HandleApple(short item){
- OSErr err=noErr;
-
- switch (item){
- case kMAbout:
- err=HandleAbout();
- break;
- default:
- // handle da's here
- {
- MenuHandle mh=GetMHandle(kMApple);
- Str255 da;
- GrafPtr savePort;
-
- GetItem(mh,item,da);
-
- GetPort(&savePort);
-
- OpenDeskAcc(da);
-
- SetPort(savePort);
- }
- break;
- }
-
- return err;
- }
-
- OSErr HandleFile(short item){
- OSErr err=noErr;
-
- switch (item){
- case kMProbe:
- err=NewProbeDialog();
- break;
- case kMQuit:
- gQuit=true;
- break;
- default:
- break;
- }
-
- return err;
- }
-
- OSErr NewProbeDialog(void){
- OSErr err=noErr;
- DialogPtr dlg;
- GrafPtr save;
- short i;
- Handle h;
- Rect r;
-
- GetPort(&save);
-
- dlg=GetNewDialog(128,(Ptr)0L,(WindowPtr)-1);
-
- if (dlg!=(DialogPtr)0L){
- // have the dialog
- SetPort((GrafPtr)dlg);
-
- GetDItem(dlg,11,&i,&h,&r);
- SetCtlValue((ControlHandle)h,1);
-
- GetDItem(dlg,12,&i,&h,&r);
- SetCtlValue((ControlHandle)h,0);
-
- ShowWindow((WindowPtr)dlg);
-
- SelIText(dlg,3,0,30000);
-
- SetWRefCon((WindowPtr)dlg,'NebU');
-
- InvalRect(&(dlg->portRect));
-
- SetPort(save);
- }
-
- return err;
- }
-
- OSErr HandleEdit(short item){
- OSErr err=noErr;
-
- // This application doesn't use any editing features so they
- // are being ignored...
-
- return err;
- }
-
- // use this routine to handle key events.
- OSErr HandleKey(EventRecord* erp){
- OSErr err=noErr;
- char ch,key;
- long mk;
-
- ch=erp->message&charCodeMask;
- key=(erp->message&keyCodeMask)>>8;
-
- if (erp->modifiers & cmdKey){
- // menu event
- err=HandleMenuEnabling();
- mk=MenuKey(ch);
- err=HandleMenu(mk);
- } else {
- // normal key events
-
- // currently ignored
- }
-
- return err;
- }
-
- // Handle window activate events here
- OSErr HandleActivateEvt(EventRecord* erp){
- OSErr err=noErr;
- WindowPtr wind;
-
- wind=(WindowPtr)erp->message;
-
- if (wind==(WindowPtr)0L)
- return noErr;
-
- if (erp->modifiers&activeFlag){
- BringToFront(wind); // make it the frontmost
- HiliteWindow(wind,true); // activate the window...
- } else {
- HiliteWindow(wind,false); // deactivate the window...
- }
-
- return err;
- }
-
- // Handle Window Updates
- OSErr HandleUpdate(EventRecord* erp){
- OSErr err=noErr;
- WindowPtr wind;
-
- wind=(WindowPtr)erp->message;
-
- if (wind!=(WindowPtr)0L){
- BeginUpdate(wind);
- EndUpdate(wind);
- }
-
- return err;
- }
-
- // Handle Disk Events here...
- OSErr HandleDisk(EventRecord* erp){
- OSErr err=noErr;
- Point pt;
-
- SetPt(&pt,100,100);
- err=(OSErr)DIBadMount(pt,erp->message);
-
- return err;
- }
-
- // Entry point for Apple Event Handling
- OSErr HandleHighLevelEvent(EventRecord* erp){
- OSErr err=noErr;
-
- err=AEProcessAppleEvent(erp);
-
- return err;
- }
-
- // use this routine to handle activate events...
- OSErr HandleActivate(EventRecord* erp){
- OSErr err=noErr;
- WindowPtr wind;
-
- wind=FrontWindow();
- if (wind!=(WindowPtr)0L)
- HiliteWindow(wind,true); // hilite the window
-
- return err;
- }
-
- // use this routine to handle the deactivate events
- OSErr HandleDeactivate(EventRecord* erp){
- OSErr err=noErr;
- WindowPtr wind;
-
- wind=FrontWindow();
- if (wind!=(WindowPtr)0L)
- HiliteWindow(wind,false); // deactivate the window
-
- return err;
- }
-
- // use this routine to change the mouse cursor depending on where the mouse is located.
- OSErr HandleMouseMoved(EventRecord* erp){
- OSErr err=noErr;
-
- return err;
- }
-
- // Initialize the Mac Toolbox
- OSErr InitToolbox(void){
- OSErr err=noErr;
-
- InitGraf((Ptr) &qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- FlushEvents(everyEvent,0);
- TEInit();
- InitDialogs(0L);
- InitCursor();
-
- return err;
- }
-
- OSErr HandleAbout(void){
- OSErr err=noErr;
-
- ParamText("\p1.0","\p","\p","\p");
- Alert(129,(ModalFilterUPP)0L);
-
- return err;
- }
-
-
-
-
-
-
-
-
-
-