mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			301 lines
		
	
	
		
			No EOL
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			No EOL
		
	
	
		
			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));
 | |
| 
 | |
| 	} | 
