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