/* DNR.c - DNR library for MPW (c) Copyright 1988 by Apple Computer. All rights reserved Modifications by Jim Matthews, Dartmouth College, 5/91 Again modified for use with python by Jack Jansen, CWI, October 1994. */ #include #include #include #include #include #include #include #include #include #include #include #include "AddressXlation.h" TrapType GetTrapType(unsigned long theTrap); Boolean TrapAvailable(unsigned long trap); void GetSystemFolder(short *vRefNumP, long *dirIDP); void GetCPanelFolder(short *vRefNumP, long *dirIDP); short SearchFolderForDNRP(long targetType, long targetCreator, short vRefNum, long dirID); short OpenOurRF(void); #define OPENRESOLVER 1L #define CLOSERESOLVER 2L #define STRTOADDR 3L #define ADDRTOSTR 4L #define ENUMCACHE 5L #define ADDRTONAME 6L #define HINFO 7L #define MXINFO 8L Handle codeHndl = nil; OSErrProcPtr dnr = nil; TrapType GetTrapType(theTrap) unsigned long theTrap; { if (BitAnd(theTrap, 0x0800) > 0) return(ToolTrap); else return(OSTrap); } Boolean TrapAvailable(trap) unsigned long trap; { TrapType trapType = ToolTrap; unsigned long numToolBoxTraps; if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xAA6E, ToolTrap)) numToolBoxTraps = 0x200; else numToolBoxTraps = 0x400; trapType = GetTrapType(trap); if (trapType == ToolTrap) { trap = BitAnd(trap, 0x07FF); if (trap >= numToolBoxTraps) trap = _Unimplemented; } return(NGetTrapAddress(trap, trapType) != NGetTrapAddress(_Unimplemented, ToolTrap)); } void GetSystemFolder(short *vRefNumP, long *dirIDP) { SysEnvRec info; long wdProcID; SysEnvirons(1, &info); if (GetWDInfo(info.sysVRefNum, vRefNumP, dirIDP, &wdProcID) != noErr) { *vRefNumP = 0; *dirIDP = 0; } } void GetCPanelFolder(short *vRefNumP, long *dirIDP) { Boolean hasFolderMgr = false; long feature; if (Gestalt(gestaltFindFolderAttr, &feature) == noErr) hasFolderMgr = true; if (!hasFolderMgr) { GetSystemFolder(vRefNumP, dirIDP); return; } else { if (FindFolder(kOnSystemDisk, kControlPanelFolderType, kDontCreateFolder, vRefNumP, dirIDP) != noErr) { *vRefNumP = 0; *dirIDP = 0; } } } /* SearchFolderForDNRP is called to search a folder for files that might contain the 'dnrp' resource */ short SearchFolderForDNRP(long targetType, long targetCreator, short vRefNum, long dirID) { HParamBlockRec fi; Str255 filename; short refnum; fi.fileParam.ioCompletion = nil; fi.fileParam.ioNamePtr = filename; fi.fileParam.ioVRefNum = vRefNum; fi.fileParam.ioDirID = dirID; fi.fileParam.ioFDirIndex = 1; while (PBHGetFInfo(&fi, false) == noErr) { /* scan system folder for driver resource files of specific type & creator */ if (fi.fileParam.ioFlFndrInfo.fdType == targetType && fi.fileParam.ioFlFndrInfo.fdCreator == targetCreator) { /* found the MacTCP driver file? */ refnum = HOpenResFile(vRefNum, dirID, filename, fsRdPerm); if (GetIndResource('dnrp', 1) == NULL) CloseResFile(refnum); else return refnum; } /* check next file in system folder */ fi.fileParam.ioFDirIndex++; fi.fileParam.ioDirID = dirID; /* PBHGetFInfo() clobbers ioDirID */ } return(-1); } /* OpenOurRF is called to open the MacTCP driver resources */ short OpenOurRF() { short refnum; short vRefNum; long dirID; /* first search Control Panels for MacTCP 1.1 */ GetCPanelFolder(&vRefNum, &dirID); refnum = SearchFolderForDNRP('cdev', 'ztcp', vRefNum, dirID); if (refnum != -1) return(refnum); /* next search System Folder for MacTCP 1.0.x */ GetSystemFolder(&vRefNum, &dirID); refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID); if (refnum != -1) return(refnum); /* finally, search Control Panels for MacTCP 1.0.x */ GetCPanelFolder(&vRefNum, &dirID); refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID); if (refnum != -1) return(refnum); return -1; } OSErr OpenResolver(fileName) char *fileName; { short refnum; OSErr rc; if (dnr != nil) /* resolver already loaded in */ return(noErr); /* open the MacTCP driver to get DNR resources. Search for it based on creator & type rather than simply file name */ refnum = OpenOurRF(); /* ignore failures since the resource may have been installed in the System file if running on a Mac 512Ke */ /* load in the DNR resource package */ codeHndl = GetIndResource('dnrp', 1); if (codeHndl == nil) { /* can't open DNR */ return(ResError()); } DetachResource(codeHndl); if (refnum != -1) { CloseWD(refnum); CloseResFile(refnum); } /* lock the DNR resource since it cannot be reloated while opened */ HLock(codeHndl); dnr = (OSErrProcPtr) *codeHndl; /* call open resolver */ rc = (*dnr)(OPENRESOLVER, fileName); if (rc != noErr) { /* problem with open resolver, flush it */ HUnlock(codeHndl); DisposHandle(codeHndl); dnr = nil; } return(rc); } OSErr CloseResolver() { if (dnr == nil) /* resolver not loaded error */ return(notOpenErr); /* call close resolver */ (void) (*dnr)(CLOSERESOLVER); /* release the DNR resource package */ HUnlock(codeHndl); DisposHandle(codeHndl); dnr = nil; return(noErr); } OSErr StrToAddr(hostName, rtnStruct, resultproc, userDataPtr) char *hostName; struct hostInfo *rtnStruct; ResultProcPtr resultproc; char *userDataPtr; { if (dnr == nil) /* resolver not loaded error */ return(notOpenErr); return((*dnr)(STRTOADDR, hostName, rtnStruct, resultproc, userDataPtr)); } OSErr AddrToStr(addr, addrStr) unsigned long addr; char *addrStr; { if (dnr == nil) /* resolver not loaded error */ return(notOpenErr); (*dnr)(ADDRTOSTR, addr, addrStr); return(noErr); } OSErr EnumCache(resultproc, userDataPtr) EnumResultProcPtr resultproc; char *userDataPtr; { if (dnr == nil) /* resolver not loaded error */ return(notOpenErr); return((*dnr)(ENUMCACHE, resultproc, userDataPtr)); } OSErr AddrToName(addr, rtnStruct, resultproc, userDataPtr) unsigned long addr; struct hostInfo *rtnStruct; ResultProcPtr resultproc; char *userDataPtr; { if (dnr == nil) /* resolver not loaded error */ return(notOpenErr); return((*dnr)(ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr)); } extern OSErr HInfo(hostName, returnRecPtr, resultProc, userDataPtr) char *hostName; struct returnRec *returnRecPtr; ResultProc2Ptr resultProc; char *userDataPtr; { if (dnr == nil) /* resolver not loaded error */ return(notOpenErr); return((*dnr)(HINFO, hostName, returnRecPtr, resultProc, userDataPtr)); } extern OSErr MXInfo(hostName, returnRecPtr, resultProc, userDataPtr) char *hostName; struct returnRec *returnRecPtr; ResultProc2Ptr resultProc; char *userDataPtr; { if (dnr == nil) /* resolver not loaded error */ return(notOpenErr); return((*dnr)(MXINFO, hostName, returnRecPtr, resultProc, userDataPtr)); }