2 DNR.c - DNR library for MPW
4 © Copyright 1988 by Apple Computer. All rights reserved
13 #include <Resources.h>
16 #include <GestaltEqu.h>
18 #include <MixedMode.h>
19 #include <ToolUtils.h>
20 #include "AddressXlation.h"
25 static void GetSystemFolder(short *vRefNumP, long *dirIDP);
26 static void GetCPanelFolder(short *vRefNumP, long *dirIDP);
27 static short SearchFolderForDNRP(long targetType, long targetCreator, short vRefNum,
29 static short OpenOurRF( void );
32 #define OPENRESOLVER 1L
33 #define CLOSERESOLVER 2L
41 Handle codeHndl = nil;
42 UniversalProcPtr dnr = nil;
45 static TrapType GetTrapType(unsigned long theTrap)
47 if (BitAnd(theTrap, 0x0800) > 0)
53 static Boolean TrapAvailable(unsigned long trap)
55 TrapType trapType = ToolTrap;
56 unsigned long numToolBoxTraps;
58 if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xAA6E, ToolTrap))
59 numToolBoxTraps = 0x200;
61 numToolBoxTraps = 0x400;
63 trapType = GetTrapType(trap);
64 if (trapType == ToolTrap) {
65 trap = BitAnd(trap, 0x07FF);
66 if (trap >= numToolBoxTraps)
67 trap = _Unimplemented;
69 return(NGetTrapAddress(trap, trapType) != NGetTrapAddress(_Unimplemented, ToolTrap));
73 static void GetSystemFolder(short *vRefNumP, long *dirIDP)
78 SysEnvirons(1, &info);
79 if (GetWDInfo(info.sysVRefNum, vRefNumP, dirIDP, &wdProcID) != noErr) {
85 static void GetCPanelFolder(short *vRefNumP, long *dirIDP)
87 Boolean hasFolderMgr = false;
90 if (Gestalt(gestaltFindFolderAttr, &feature) == noErr)
93 GetSystemFolder(vRefNumP, dirIDP);
97 if (FindFolder(kOnSystemDisk, kControlPanelFolderType, kDontCreateFolder, vRefNumP, dirIDP) != noErr) {
104 /* SearchFolderForDNRP is called to search a folder for files that might
105 contain the 'dnrp' resource */
106 static short SearchFolderForDNRP(long targetType, long targetCreator, short vRefNum, long dirID)
112 fi.fileParam.ioCompletion = nil;
113 fi.fileParam.ioNamePtr = filename;
114 fi.fileParam.ioVRefNum = vRefNum;
115 fi.fileParam.ioDirID = dirID;
116 fi.fileParam.ioFDirIndex = 1;
118 while (PBHGetFInfoSync(&fi) == noErr) {
119 /* scan system folder for driver resource files of specific type & creator */
120 if (fi.fileParam.ioFlFndrInfo.fdType == targetType &&
121 fi.fileParam.ioFlFndrInfo.fdCreator == targetCreator) {
122 /* found the MacTCP driver file? */
123 refnum = HOpenResFile(vRefNum, dirID, filename, fsRdPerm);
124 if (GetIndResource('dnrp', 1) == NULL)
125 CloseResFile(refnum);
129 /* check next file in system folder */
130 fi.fileParam.ioFDirIndex++;
131 fi.fileParam.ioDirID = dirID; /* PBHGetFInfo() clobbers ioDirID */
138 /* OpenOurRF is called to open the MacTCP driver resources */
140 static short OpenOurRF()
146 /* first search Control Panels for MacTCP 1.1 */
147 GetCPanelFolder(&vRefNum, &dirID);
148 refnum = SearchFolderForDNRP('cdev', 'ztcp', vRefNum, dirID);
149 if (refnum != -1) return(refnum);
151 /* next search System Folder for MacTCP 1.0.x */
152 GetSystemFolder(&vRefNum, &dirID);
153 refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID);
154 if (refnum != -1) return(refnum);
156 /* finally, search Control Panels for MacTCP 1.0.x */
157 GetCPanelFolder(&vRefNum, &dirID);
158 refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID);
159 if (refnum != -1) return(refnum);
167 typedef OSErr (*OpenResolverProcPtr)(long selector, char* fileName);
170 uppOpenResolverProcInfo = kCStackBased
171 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
172 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
173 | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
176 #if USESROUTINEDESCRIPTORS
177 typedef UniversalProcPtr OpenResolverUPP;
179 #define NewOpenResolverProc(userRoutine) \
180 (OpenResolverUPP) NewRoutineDescriptor(userRoutine, uppOpenResolverProcInfo, GetCurrentISA())
181 #define CallOpenResolverProc(userRoutine, selector, filename) \
182 CallUniversalProc(userRoutine, uppOpenResolverProcInfo, selector, filename)
184 typedef OpenResolverProcPtr OpenResolverUPP;
186 #define NewOpenResolverProc(userRoutine) \
187 (OpenResolverUPP)(userRoutine)
188 #define CallOpenResolverProc(userRoutine, selector, filename) \
189 (*(OpenResolverProcPtr)userRoutine)(selector, filename)
194 OSErr OpenResolver(char *fileName)
200 /* resolver already loaded in */
203 /* open the MacTCP driver to get DNR resources. Search for it based on
204 creator & type rather than simply file name */
205 refnum = OpenOurRF();
207 /* ignore failures since the resource may have been installed in the
208 System file if running on a Mac 512Ke */
210 /* load in the DNR resource package */
211 codeHndl = GetIndResource('dnrp', 1);
212 if (codeHndl == nil) {
217 DetachResource(codeHndl);
220 CloseResFile(refnum);
223 /* lock the DNR resource since it cannot be relocated while opened */
225 dnr = (UniversalProcPtr) *codeHndl;
227 /* call open resolver */
228 rc = CallOpenResolverProc(dnr, OPENRESOLVER, fileName);
230 /* problem with open resolver, flush it */
232 DisposeHandle(codeHndl);
240 typedef OSErr (*CloseResolverProcPtr)(long selector);
243 uppCloseResolverProcInfo = kCStackBased
244 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
245 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
248 #if USESROUTINEDESCRIPTORS
249 typedef UniversalProcPtr CloseResolverUPP;
251 #define NewCloseResolverProc(userRoutine) \
252 (CloseResolverUPP) NewRoutineDescriptor(userRoutine, uppCloseResolverProcInfo, GetCurrentISA())
253 #define CallCloseResolverProc(userRoutine, selector) \
254 CallUniversalProc(userRoutine, uppCloseResolverProcInfo, selector)
256 typedef CloseResolverProcPtr CloseResolverUPP;
258 #define NewCloseResolverProc(userRoutine) \
259 (CloseResolverUPP)(userRoutine)
260 #define CallCloseResolverProc(userRoutine, selector) \
261 (*(CloseResolverProcPtr)userRoutine)(selector)
266 OSErr CloseResolver()
269 /* resolver not loaded error */
272 /* call close resolver */
273 CallCloseResolverProc(dnr, CLOSERESOLVER);
275 /* release the DNR resource package */
277 DisposeHandle(codeHndl);
285 typedef OSErr (*StrToAddrProcPtr)(long selector, char* hostName, struct hostInfo* rtnStruct,
286 long resultProc, char* userData);
289 uppStrToAddrProcInfo = kCStackBased
290 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
291 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
292 | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
293 | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct hostInfo *)))
294 | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
295 | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
298 #if USESROUTINEDESCRIPTORS
299 typedef UniversalProcPtr StrToAddrUPP;
301 #define NewStrToAddrProc(userRoutine) \
302 (StrToAddrUPP) NewRoutineDescriptor(userRoutine, uppStrToAddrProcInfo, GetCurrentISA())
303 #define CallStrToAddrProc(userRoutine, selector, hostName, rtnStruct, resultProc, userData) \
304 CallUniversalProc(userRoutine, uppStrToAddrProcInfo, selector, hostName, rtnStruct, resultProc, userData)
306 typedef StrToAddrProcPtr StrToAddrUPP;
308 #define NewStrToAddrProc(userRoutine) \
309 (StrToAddrUPP)(userRoutine)
310 #define CallStrToAddrProc(userRoutine, selector, hostName, rtnStruct, resultProc, userData) \
311 (*(StrToAddrProcPtr)userRoutine)(selector, hostName, rtnStruct, resultProc, userData)
316 OSErr StrToAddr(char *hostName, struct hostInfo *rtnStruct, ResultUPP resultupp, char *userDataPtr)
319 /* resolver not loaded error */
322 return(CallStrToAddrProc(dnr, STRTOADDR, hostName, rtnStruct, (long)resultupp, userDataPtr));
326 typedef OSErr (*AddrToStrProcPtr)(long selector, long address, char* hostName);
329 uppAddrToStrProcInfo = kCStackBased
330 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
331 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
332 | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned long)))
333 | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(char *)))
336 #if USESROUTINEDESCRIPTORS
337 typedef UniversalProcPtr AddrToStrUPP;
339 #define NewAddrToStrProc(userRoutine) \
340 (AddrToStrUPP) NewRoutineDescriptor(userRoutine, uppAddrToStrProcInfo, GetCurrentISA())
341 #define CallAddrToStrProc(userRoutine, selector, address, hostName) \
342 CallUniversalProc(userRoutine, uppAddrToStrProcInfo, selector, address, hostName)
344 typedef AddrToStrProcPtr AddrToStrUPP;
346 #define NewAddrToStrProc(userRoutine) \
347 (AddrToStrUPP)(userRoutine)
348 #define CallAddrToStrProc(userRoutine, selector, address, hostName) \
349 (*(AddrToStrProcPtr)userRoutine)(selector, address, hostName)
353 OSErr AddrToStr(unsigned long addr, char *addrStr)
356 /* resolver not loaded error */
359 CallAddrToStrProc(dnr, ADDRTOSTR, addr, addrStr);
366 typedef OSErr (*EnumCacheProcPtr)(long selector, long result, char* userData);
369 uppEnumCacheProcInfo = kCStackBased
370 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
371 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
372 | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
373 | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(char *)))
376 #if USESROUTINEDESCRIPTORS
377 typedef UniversalProcPtr EnumCacheUPP;
379 #define NewEnumCacheProc(userRoutine) \
380 (EnumCacheUPP) NewRoutineDescriptor(userRoutine, uppEnumCacheProcInfo, GetCurrentISA())
381 #define CallEnumCacheProc(userRoutine, selector, result, userData) \
382 CallUniversalProc(userRoutine, uppEnumCacheProcInfo, selector, result, userData)
384 typedef EnumCacheProcPtr EnumCacheUPP;
386 #define NewEnumCacheProc(userRoutine) \
387 (EnumCacheUPP)(userRoutine)
388 #define CallEnumCacheProc(userRoutine, selector, result, userData) \
389 (*(EnumCacheProcPtr)userRoutine)(selector, result, userData)
394 OSErr EnumCache(EnumResultUPP resultupp, char *userDataPtr)
397 /* resolver not loaded error */
400 return(CallEnumCacheProc(dnr, ENUMCACHE, (long)resultupp, userDataPtr));
405 typedef OSErr (*AddrToNameProcPtr)(long selector, unsigned long addr, struct hostInfo* rtnStruct,
406 long resultProc, char* userData);
409 uppAddrToNameProcInfo = kCStackBased
410 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
411 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
412 | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned long)))
413 | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct hostInfo *)))
414 | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
415 | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
419 #if USESROUTINEDESCRIPTORS
420 typedef UniversalProcPtr AddrToNameUPP;
422 #define NewAddrToNameProc(userRoutine) \
423 (AddrToNameUPP) NewRoutineDescriptor(userRoutine, uppAddrToNameProcInfo, GetCurrentISA())
424 #define CallAddrToNameProc(userRoutine, selector, addr, rtnStruct, resultProc, userData) \
425 CallUniversalProc(userRoutine, uppAddrToNameProcInfo, selector, addr, rtnStruct, resultProc, userData)
427 typedef AddrToNameProcPtr AddrToNameUPP;
429 #define NewAddrToNameProc(userRoutine) \
430 (AddrToNameUPP)(userRoutine)
431 #define CallAddrToNameProc(userRoutine, selector, addr, rtnStruct, resultProc, userData) \
432 (*(AddrToNameProcPtr)userRoutine)(selector, addr, rtnStruct, resultProc, userData)
437 OSErr AddrToName(unsigned long addr, struct hostInfo *rtnStruct, ResultUPP resultupp,
441 /* resolver not loaded error */
444 return(CallAddrToNameProc(dnr, ADDRTONAME, addr, rtnStruct, (long)resultupp, userDataPtr));
448 typedef OSErr (*HInfoProcPtr)(long selector, char* hostName, struct returnRec* returnRecPtr,
449 long resultProc, char* userData);
452 uppHInfoProcInfo = kCStackBased
453 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
454 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
455 | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
456 | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct returnRec *)))
457 | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
458 | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
462 #if USESROUTINEDESCRIPTORS
463 typedef UniversalProcPtr HInfoUPP;
465 #define NewHInfoProc(userRoutine) \
466 (HInfoUPP) NewRoutineDescriptor(userRoutine, uppHInfoProcInfo, GetCurrentISA())
467 #define CallHInfoProc(userRoutine, selector, hostName, returnRecPtr, resultProc, userData) \
468 CallUniversalProc(userRoutine, uppHInfoProcInfo, selector, hostName, returnRecPtr, resultProc, userData)
470 typedef HInfoProcPtr HInfoUPP;
472 #define NewHInfoProc(userRoutine) \
473 (HInfoUPP)(userRoutine)
474 #define CallHInfoProc(userRoutine, selector, hostName, returnRecPtr, resultProc, userData) \
475 (*(HInfoProcPtr)userRoutine)( selector, hostName, returnRecPtr, resultProc, userData)
478 extern OSErr HInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2Ptr resultProc,
482 /* resolver not loaded error */
485 return(CallHInfoProc(dnr, HINFO, hostName, returnRecPtr, (long)resultProc, userDataPtr));
490 typedef OSErr (*MXInfoProcPtr)(long selector, char* hostName, struct returnRec* returnRecPtr,
491 long resultProc, char* userData);
494 uppMXInfoProcInfo = kCStackBased
495 | RESULT_SIZE(SIZE_CODE(sizeof(short)))
496 | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
497 | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *)))
498 | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct returnRec *)))
499 | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
500 | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *)))
504 #if USESROUTINEDESCRIPTORS
505 typedef UniversalProcPtr MXInfoUPP;
507 #define NewMXInfoProc(userRoutine) \
508 (MXInfoUPP) NewRoutineDescriptor(userRoutine, uppMXInfoProcInfo, GetCurrentISA())
509 #define CallMXInfoProc(userRoutine, selector, hostName, returnRecPtr, resultProc, userData) \
510 CallUniversalProc(userRoutine, selector, hostName, returnRecPtr, resultProc, userData)
512 typedef MXInfoProcPtr MXInfoUPP;
514 #define NewMXInfoProc(userRoutine) \
515 (MXInfoUPP)(userRoutine)
516 #define CallMXInfoProc(userRoutine, selector, hostName, returnRecPtr, resultProc, userData) \
517 (*(MXInfoProcPtr)userRoutine)(selector, hostName, returnRecPtr, resultProc, userData)
521 extern OSErr MXInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2Ptr resultProc,
525 /* resolver not loaded error */
528 return(CallMXInfoProc(dnr, MXINFO, hostName, returnRecPtr, (long)resultProc, userDataPtr));