301 lines
6.9 KiB
C
301 lines
6.9 KiB
C
|
/* 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 <Traps.h>
|
||
|
#include <OSUtils.h>
|
||
|
#include <Errors.h>
|
||
|
#include <Files.h>
|
||
|
#include <Resources.h>
|
||
|
#include <Memory.h>
|
||
|
#include <Traps.h>
|
||
|
#include <GestaltEqu.h>
|
||
|
#include <Folders.h>
|
||
|
#include <ToolUtils.h>
|
||
|
#include <MacTCPCommonTypes.h>
|
||
|
#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));
|
||
|
|
||
|
}
|