mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-25 09:30:50 +00:00
860 lines
31 KiB
C
860 lines
31 KiB
C
/*
|
||
File: PPCInit.c
|
||
|
||
Copyright: © 1989-1993 by Apple Computer, Inc., all rights reserved.
|
||
|
||
Change History (most recent first):
|
||
|
||
<6> 7/2/93 IH Reality Update: Change Gestalt call to use
|
||
SelectorFunctionProcPtr.
|
||
<62> 10/28/92 DTY Use new Get/Set macros to access ExpandMem.
|
||
<61> 6/8/92 JSM For TheFuture, check emProcessMgrExists global instead of
|
||
calling Gestalt all the time in initUserGroupFile().
|
||
<60> 4/17/92 JSM Don’t ever check to see whether to return
|
||
gestaltPPCSupportsStoreAndForward in PPCGESTALTFUNCTION(), it
|
||
will never happen for CubeE.
|
||
<59> 4/14/92 BBM <JSM>: Remove unfinished PPC code that is under the contitional
|
||
“TheFutute”, and remove the conditional “CubeE” since that is
|
||
reality. Remove conditionals, since all they do is confuse.
|
||
<58> 10/4/91 JSM Change PsychoticFarmerOrLater conditionals to TheFuture.
|
||
<57> 9/30/91 DTY Dean’s in the dog house. The System build got derailed with that
|
||
last change.
|
||
<56> 9/29/91 DTY Conditionalize <54> and <55> out of CubeE.
|
||
<55> 6/10/91 EMT Optimize code for size
|
||
<54> 6/4/91 EMT Roll in StoreAndForward Revisions
|
||
<53> 2/1/91 EMT VC: Fix bug <52> that calls MultiFinder Begin and End System
|
||
mode without checking to see if it is implemented first. Also
|
||
moved call to GetIndString after it has been determined that we
|
||
need to open the users and groups b-tree.
|
||
<52> 1/27/91 csd gbm: Begin and End System Mode around the call to OpenUGBT so
|
||
that the Users & Groups Data File doesn’t get closed when the
|
||
active process terminates.
|
||
<51> 1/25/91 EMT VC: GSM-089, Fix problem that prevents PPC from opening the .MPP
|
||
driver when the portable wakes up.
|
||
<50> 1/24/91 EMT VC: Fix problem in startup that prevents PPC from allowing
|
||
incomming requests. Found and fixed problem that could lead to
|
||
system hanging.
|
||
<49> 1/22/91 EMT VC: Fix bug that prevents processing of Transition Event. Move
|
||
initUserGroupFile from PPCLoader.c to this file, and fix bug in
|
||
same procedure.
|
||
<48> 1/2/91 EMT <VC> Fix bug that registers name, on name change event when PPC
|
||
is not network enabled.
|
||
<47> 12/14/90 EMT <VC> Fix bug in examining of FlagShip attributes returned from
|
||
gestalt.
|
||
<46> 12/13/90 EMT <JSM> Support FlagShip name changes.
|
||
<45> 11/28/90 EMT <VC> Update AtalkEvent procedure to work with the about to close
|
||
event message. Remove obsolete GetMyAtalkZone procedure.
|
||
<44> 11/15/90 EMT <stb> Fix bug in PPCGetstaulFunction.
|
||
<43> 11/8/90 EMT <stb> Fix KillUserSession and PPCCountAcceptedNetworkSessions to
|
||
use the same string comparison routines as the BTreeManager.
|
||
<42> 11/6/90 EMT use STATIC in place of static for link maps
|
||
<41> 10/30/90 EMT Fix EnableIncoming
|
||
<40> 10/24/90 EMT Change some calls to be an internal interface for enabling IAC
|
||
and Disabling IAC. Found and fixed bug in Gestault.
|
||
<39> 10/18/90 EMT Change userName to machineName where needed
|
||
<38> 10/11/90 EMT Make changes to support the obsoleting CompletionGlue.a
|
||
Changed how PPC works with Network Setup Control Pannel.
|
||
PPC no-longer get gestault, since if MPP can't be open,
|
||
the version number is wrong. We will assume we are
|
||
running with the correct version of AppleTalk.
|
||
<37> 10/10/90 gbm change ioCRefNum of ioRefNum
|
||
<36> 10/4/90 EMT Temporary Hack, make SetupToolBoxName always check for other
|
||
machines with objects in the same zone
|
||
<35> 10/4/90 EMT Fix bug in ObjectInMyZone
|
||
<34> 10/4/90 EMT Fix PPCCheckDupName so that it does not report duplicate name
|
||
when self send is on, and the name exists on this machine. Also
|
||
fix bug that caused name not to be registered when changed in
|
||
the network setup control pannel.
|
||
<33> 9/21/90 EMT Update constants, types, and field names as dictated by
|
||
PPCToolBox.h
|
||
<32> 9/14/90 EMT Add changes to re-register locnames with correct object when it
|
||
changes
|
||
<31> 9/6/90 EMT Fix bug in PPCInit that return's a bogas result code.
|
||
<30> 9/4/90 EMT Eric's Changes rolled in
|
||
<29> 8/21/90 EMT Fix Shutdown bug for SE with router.
|
||
<28> 8/13/90 S Bug Fix Related Checking Duplicate Network Name.
|
||
<27> 8/10/90 gbm get rid of “unused local variable” warning in SetToolBoxName
|
||
<26> 8/10/90 gbm fix power manager attribute test for sleep proc install
|
||
<25> 8/10/90 S Change CountAcceptedNetworkSessions to pascal interface
|
||
<24> 8/8/90 S Fixed Portable Problem & CountAcceptedSessions Problem.
|
||
<23> 8/6/90 S Some more Bug Fixes.
|
||
<22> 8/6/90 S Bug Fixes.
|
||
<21> 7/10/90 dba get rid of C warnings
|
||
<20> 7/2/90 S Fix a bug in Dynamic allocation for seeions.
|
||
<19> 6/28/90 S To Improve Dynamic allocation and fix other bugs.
|
||
<18> 6/12/90 JSM Make PPC a linked patch: OpenUGBT is back in PPCLoader.c.
|
||
<17> 6/4/90 VC Make the OpenUGBT call if it is not already opened.
|
||
<16> 5/31/90 EMT Support force ending of sessions that did not originate from
|
||
host machine.
|
||
<15> 4/25/90 S Implement Expansion and deletion of Port and Session Tables in
|
||
PPCSystemTask.
|
||
<14> 4/24/90 S To Include PPCSystemTask Procedure.
|
||
<13> 4/18/90 JSM Add prototype for BTSEARCHPPC, use Gestalt instead of
|
||
SysEnvirons to get AppleTalk version, fix bug in PPCSetup where
|
||
err was checked before being initialized (it's unlikely this
|
||
would ever have been hit), don't HLock things for BlockMove,
|
||
miscellaneous other code size reductions.
|
||
<12> 4/11/90 S To Fix Gestalt and add to ShutDown Que for Closing AppleTalk
|
||
Driver.
|
||
<11> 4/10/90 S Gestalt and Global PPC Check box support.
|
||
<10> 3/21/90 S To use the configuration parameters.
|
||
<9> 3/20/90 S Bug Fix
|
||
<8> 3/20/90 S To Fix AppleTalk Inactive to active Transition work.
|
||
<7> 2/13/90 S Fix problem with AtalkEvent Checcking.
|
||
<6> 2/8/90 S Removed Debugger Statement from AtakEvent routine.
|
||
<5> 2/7/90 S Fix the zoneName, when getMyZone fails.
|
||
<4> 1/23/90 S Change Resource ID t0 -16413 to obtain Macintosh name for
|
||
PPCLocation for ToolBox registration with NBP.
|
||
<2+> 1/5/90 S Some Error Codes
|
||
<2> 12/28/89 dba use quotes around the names of local header files, angle
|
||
brackets around the names of header files from Interfaces or
|
||
Internals
|
||
<1.6> 11/7/89 CVC Changed PPCInit to not register blank name
|
||
<1.5> 10/12/89 CCH Fixed header
|
||
<•1.4> 10/12/89 CVC Added access control stuff
|
||
<1.3> 9/25/89 ss Added netErr falg and changed err returned to LocalOnly
|
||
<1.2> 9/18/89 CVC no change from 1.1
|
||
<1.0> 9/18/89 CVC Adding PPC toolbox for the first time.
|
||
|
||
|
||
Old Revision History:
|
||
|
||
05/30/89 Sangam New Today
|
||
07/20/89 Sangam 1.0d2 release today!
|
||
09/07/89 Sangam Added Appletalk Phase2 Transition Routines
|
||
so that Network can be switched dynamicallly.
|
||
09/18/89 Sangam Added netErr flag and changed err returned to LocalOnly
|
||
09/27/89 Victor Added 'initAuth' call to initialize the Authentication stuff.
|
||
10/09/89 Sangam Changes to handle the absence of bridge, call initauth when
|
||
btree is not opened.
|
||
10/12/89 Victor Removed the 'initAuth' call. moved it to ppcLoader.c
|
||
|
||
*/
|
||
|
||
#include "PPCCommon.h"
|
||
#include <PPCPriv.h>
|
||
#include "UserGroup.h"
|
||
|
||
#include <Errors.h>
|
||
#include <GestaltEqu.h>
|
||
#include <ShutDown.h>
|
||
#include <Packages.h>
|
||
#include <Power.h>
|
||
#include <String.h>
|
||
#include <Folders.h>
|
||
#include <MFPrivate.h> /* <52> */
|
||
|
||
#if TheFuture
|
||
#include <ExpandMemPriv.h> /* <61> */
|
||
#endif
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
Prototypes of functions used only in this file.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC void EndAllNetworkSessions(PPCGlobalParamsPtr ppcglobPtr);
|
||
STATIC OSErr AtalkEvent(long theEvent, ATQEntry *qElem, StringPtr newName);
|
||
STATIC OSErr EnableIncoming(void);
|
||
STATIC OSErr DisableIncoming(void);
|
||
STATIC void initUserGroupFile(short *refNum);
|
||
STATIC void RemoveConnectionListeners(PPCGlobalParamsPtr ppcglobPtr);
|
||
STATIC OSErr SetUpToolBoxName(PPCGlobalParamsPtr ppcglobPtr);
|
||
STATIC OSErr RemoveToolBoxName(PPCGlobalParamsPtr ppcglobPtr);
|
||
STATIC OSErr SetUpConnectionListeners(PPCGlobalParamsPtr ppcglobPtr);
|
||
STATIC long PPCSleepEvent(void);
|
||
STATIC Boolean GetPPCGlobalFlag(PPCGlobalParamsPtr ppcglobPtr);
|
||
|
||
STATIC void EndAllNetworkSessions(PPCGlobalParamsPtr ppcglobPtr);
|
||
STATIC Boolean KillUserSession(CommonSessionParamsPtr sessPtr,unsigned char *userName);
|
||
|
||
STATIC OSErr ObjectInMyZone(Str32 Object);
|
||
|
||
STATIC void UnRegisterAllNBPNames(PPCGlobalParamsPtr ppcglobPtr);
|
||
STATIC void ReRegisterAllNBPNames(PPCGlobalParamsPtr ppcglobPtr);
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
PPCSetUp is actually the code that is executed when PPCInit() call is made.
|
||
----------------------------------------------------------------------------------------*/
|
||
|
||
OSErr PPCSetUp(void)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
PPCConfigInfo *configPtr; // <56>
|
||
long powerMgrAttrs;
|
||
|
||
if (!(ppcglobPtr = (PPCGlobalParamsPtr)getGlobal()))
|
||
return noGlobalsErr;
|
||
|
||
if (!ppcglobPtr->inited)
|
||
{
|
||
ppcglobPtr->canLocal = true; // This is always the case.
|
||
configPtr = (PPCConfigInfo *)&(ppcglobPtr->configData);
|
||
|
||
ppcglobPtr->nextPortRefNum = 1;
|
||
ppcglobPtr->nextSessRefNum = 1;
|
||
ppcglobPtr->dspDrvrRef = 0;
|
||
ppcglobPtr->listsessPtr = NULL;
|
||
BlockMove(*GetResource('STR ', -16413), ppcglobPtr->machineName, sizeof(Str32));
|
||
if(!MPPOpen()) // If AppleTalk is enabled.
|
||
{
|
||
ppcglobPtr->mppOpen = true;
|
||
ppcglobPtr->canRemote = true;
|
||
|
||
if(OpenADSPDriver(&ppcglobPtr->dspDrvrRef))
|
||
{
|
||
ppcglobPtr->dspDrvrRef = 0;
|
||
ppcglobPtr->canRemote = false;
|
||
}
|
||
else if(GetPPCGlobalFlag(ppcglobPtr))
|
||
{
|
||
EnableIncoming();
|
||
}
|
||
}
|
||
|
||
ppcglobPtr->trQEle.CallAddr = (ProcPtr)AtalkEvent;
|
||
AddtoAtalkQ((Ptr)&(ppcglobPtr->trQEle));
|
||
|
||
if (!Gestalt(gestaltPowerMgrAttr, &powerMgrAttrs))
|
||
{
|
||
if ((powerMgrAttrs & 1<<gestaltPMgrExists) && // <26>
|
||
(powerMgrAttrs & 1<<gestaltPMgrCPUIdle)) // <26>
|
||
{
|
||
|
||
ppcglobPtr->sleepQEle.sleepQProc = (ProcPtr)PPCSleepEvent;
|
||
ppcglobPtr->sleepQEle.sleepQType = SleepQueType;
|
||
SleepQInstall((SleepQRecPtr)&ppcglobPtr->sleepQEle);
|
||
}
|
||
}
|
||
ppcglobPtr->inited = true;
|
||
}
|
||
return(noErr);
|
||
} // PPCSetUp
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
AtalkEvent handle the AppleTalk Transition Queue.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC OSErr AtalkEvent(long theEvent, ATQEntry *qElem, StringPtr newName)
|
||
{
|
||
#pragma unused(qElem)
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
OSErr Result;
|
||
|
||
ppcglobPtr = (PPCGlobalParamsPtr)getGlobal();
|
||
|
||
if (theEvent == AOpenTask) // MPP Driver is opening.
|
||
{
|
||
ppcglobPtr->mppOpen = true;
|
||
ppcglobPtr->canRemote = true;
|
||
if(OpenADSPDriver(&ppcglobPtr->dspDrvrRef))
|
||
{
|
||
ppcglobPtr->dspDrvrRef = 0;
|
||
ppcglobPtr->canRemote = false;
|
||
return(noErr);
|
||
}
|
||
else if(GetPPCGlobalFlag(ppcglobPtr))
|
||
{
|
||
EnableIncoming();
|
||
}
|
||
}
|
||
else if (theEvent == ACloseAskTask) // MPP Driver is about to close.
|
||
{
|
||
return(ppcglobPtr->RemSessQueue.qSize?1:0); // Object if we are currently networking.
|
||
}
|
||
else if (theEvent == ACloseTellTask) // MPP Driver just closed.
|
||
{
|
||
if(ppcglobPtr->allowIncommingRequests)
|
||
DisableIncoming();
|
||
EndAllNetworkSessions(ppcglobPtr);
|
||
ppcglobPtr->mppOpen = false;
|
||
ppcglobPtr->canRemote = false;
|
||
ppcglobPtr->dspDrvrRef = 0;
|
||
}
|
||
else if(theEvent == ANameChangeTellTask) // Machine name changed.
|
||
{
|
||
BlockMove(newName, ppcglobPtr->machineName, sizeof(Str32)); // This is now our primary name.
|
||
if(ppcglobPtr->allowIncommingRequests)
|
||
{
|
||
RemoveToolBoxName(ppcglobPtr); // Remove the old PPCToolBox name.
|
||
ppcglobPtr->whichName ^= 1; // we switched names.
|
||
ppcglobPtr->AltNameRegistered = false; // alt name is now the primary.
|
||
UnRegisterAllNBPNames(ppcglobPtr); // Remove our clients alias names.
|
||
ReRegisterAllNBPNames(ppcglobPtr); // Register our clients alias names.
|
||
}
|
||
}
|
||
else if (ppcglobPtr->allowIncommingRequests) // Ignore Name events if we don't allow incoming requests.
|
||
{
|
||
if (theEvent == ANameChangeAskTask) // Register the new name.
|
||
{
|
||
NBPparms NBPPB;
|
||
|
||
Result = RegisterName(newName,
|
||
ppcglobPtr->configData.ppctoolboxName,
|
||
"\p*",
|
||
ppcglobPtr->adspSocket,
|
||
false, // Call Syncronously
|
||
nil, // No Completion Routine
|
||
(Ptr)&ppcglobPtr->nteQEle[ppcglobPtr->whichName ^ 1], // ntePtr
|
||
&NBPPB); // PB for NBP call
|
||
|
||
if(!Result)
|
||
ppcglobPtr->AltNameRegistered = true;
|
||
return(Result);
|
||
}
|
||
else if (theEvent == ACancelNameChange)
|
||
{
|
||
NBPparms NBPPB;
|
||
if(ppcglobPtr->AltNameRegistered)
|
||
{
|
||
RemoveName((EntityName *)ppcglobPtr->nteQEle[ppcglobPtr->whichName ^ 1].nt.entityData,
|
||
false,
|
||
(ProcPtr)nil,
|
||
&NBPPB); // PB for NBP call
|
||
|
||
ppcglobPtr->AltNameRegistered = false; // Even if this fails, it should be OK to set this false.
|
||
}
|
||
}
|
||
}
|
||
return(noErr);
|
||
} // AtalkEvent
|
||
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
EnableIncoming is called when in the Network Setup Control Pannel, the user enables
|
||
IAC for incoming requests. If the process fails, we will DisableIncoming. NOTE:
|
||
Sharing setup does not set the global flag before calling EnableIncoming. For that
|
||
reason we don't examine the flag here. Be sure to call GetPPCGlobalFlag to find out
|
||
if it is safe to call EnableIncoming.
|
||
----------------------------------------------------------------------------------------*/
|
||
OSErr EnableIncoming(void)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
OSErr Result;
|
||
|
||
if (ppcglobPtr = getGlobal())
|
||
{
|
||
if(ppcglobPtr->allowIncommingRequests) // An ounce of prevention is worth a beta cycle.
|
||
return(noErr); // Someone is confused about my state, but I will just humor them.
|
||
|
||
if(ppcglobPtr->mppOpen)
|
||
{
|
||
initUserGroupFile(&ppcglobPtr->ugFile.refNum);
|
||
if(ppcglobPtr->ugFile.refNum) // Can we access the user group file
|
||
{
|
||
if(Result = SetUpConnectionListeners(ppcglobPtr))
|
||
{
|
||
DisableIncoming(); // <56>
|
||
return(Result); // <56>
|
||
}
|
||
if(Result = SetUpToolBoxName(ppcglobPtr))
|
||
{
|
||
DisableIncoming(); // <56>
|
||
return(Result); // <56>
|
||
}
|
||
ppcglobPtr->allowIncommingRequests = true;
|
||
ReRegisterAllNBPNames(ppcglobPtr);
|
||
}
|
||
else
|
||
{
|
||
DisableIncoming();
|
||
return(noUserGroupErr);
|
||
}
|
||
}
|
||
else // Driver isn't open, so we attempt to open it.
|
||
{
|
||
Result = MPPOpen();
|
||
}
|
||
return(Result);
|
||
}
|
||
else
|
||
return(noGlobalsErr);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
DisableIncoming is called when in the Network Setup Control Pannel, the user disables
|
||
IAC for incoming requests.
|
||
----------------------------------------------------------------------------------------*/
|
||
OSErr DisableIncoming(void)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
|
||
if (ppcglobPtr = getGlobal())
|
||
{
|
||
ppcglobPtr->allowIncommingRequests = false;
|
||
RemoveToolBoxName(ppcglobPtr); // Remove the default port location name.
|
||
UnRegisterAllNBPNames(ppcglobPtr); // Remove all alias port location names.
|
||
RemoveConnectionListeners(ppcglobPtr); // <56> Kill our connection listeners.
|
||
PPCCloseUserSessions(NULL); // <56> Kill any sessions we did not initiate.
|
||
return(noErr);
|
||
}
|
||
else
|
||
return(noGlobalsErr);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
initUserGroupFile opens the user's and groups data file. The file name is now kept
|
||
in a resource so that it can be internationalized.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC void initUserGroupFile(short *refNum)
|
||
{
|
||
Str255 fname;
|
||
short vRefNum;
|
||
long dirID;
|
||
|
||
if (!*refNum) // If the file is not open, then open it.
|
||
{
|
||
GetIndString(fname, -16410, 1); /* <53> */
|
||
if (!FindFolder(0, kPreferencesFolderType, false, &vRefNum, &dirID))
|
||
{
|
||
Boolean MultiFinderRunning; /* <53> */
|
||
|
||
#if TheFuture
|
||
// check ExpandMem to see if ProcessMgr is running <61>
|
||
MultiFinderRunning = (Boolean)(GetExpandMemProcessMgrExists());
|
||
#else
|
||
long OSFlags; /* <53> */
|
||
MultiFinderRunning = !Gestalt(gestaltOSAttr,&OSFlags); /* <53> */
|
||
#endif
|
||
if(MultiFinderRunning) /* <53> */
|
||
BeginSystemMode(); /* <52> */
|
||
OpenUGBT( vRefNum, dirID, fname, fsRdWrShPerm, refNum);
|
||
if(MultiFinderRunning) /* <53> */
|
||
EndSystemMode(); /* <52> */
|
||
}
|
||
}
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------------------------------
|
||
Removes all connection listeners.
|
||
---------------------------------------------------------------------------------------------------*/
|
||
STATIC void RemoveConnectionListeners(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
DSPParamBlock dsp;
|
||
|
||
dsp.ccbRefNum = ppcglobPtr->dspListener.dsp1.ccbRefNum;
|
||
dsp.ioCRefNum = ppcglobPtr->dspDrvrRef;
|
||
RemoveConnectionListener(true, false, nil, &dsp);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
SetUpToolBoxName registers the <MachineName>:<PPCToolBox>@<*>. It gets the machine
|
||
name from a string resource that Network setup maintains. It gets the PPCToolBox
|
||
name from the 'ppci' resource. This has changes the name that is registered, the
|
||
Str32 in the PPCGlobals, and changes the netErr value.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC OSErr SetUpToolBoxName(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
Handle machineName;
|
||
OSErr Result;
|
||
long flagShipAttributes;
|
||
|
||
if (ppcglobPtr->configData.ppctoolboxName[0] == '\0')
|
||
return noToolboxNameErr;
|
||
|
||
if (!(machineName = GetResource('STR ', -16413)))
|
||
return noMachineNameErr;
|
||
|
||
BlockMove(*machineName, ppcglobPtr->machineName, sizeof(Str32));
|
||
|
||
Result = noMachineNameErr; // Assume the worst for now.
|
||
if(!Gestalt(gestaltFlagshipAttr,&flagShipAttributes)) // If flagship exists
|
||
{
|
||
if((flagShipAttributes & 0x03) == 0x03)
|
||
{
|
||
NBPparms NBPPB;
|
||
Result = RegisterName(ppcglobPtr->machineName,
|
||
ppcglobPtr->configData.ppctoolboxName,
|
||
"\p*",
|
||
ppcglobPtr->adspSocket,
|
||
false, // Call Syncronously
|
||
nil, // No Completion Routine
|
||
(Ptr)&ppcglobPtr->nteQEle[ppcglobPtr->whichName], // ntePtr
|
||
&NBPPB); // PB for NBP call
|
||
}
|
||
}
|
||
return(Result);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
RemoveToolBoxName un-registers the PPCToolBox default NBP name.
|
||
----------------------------------------------------------------------------------------*/
|
||
|
||
STATIC OSErr RemoveToolBoxName(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
NBPparms nbpPB;
|
||
|
||
return RemoveName((EntityName *)ppcglobPtr->nteQEle[ppcglobPtr->whichName].nt.entityData,
|
||
false,
|
||
(ProcPtr)nil,
|
||
&nbpPB); // PB for NBP call
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
SetUpConnectionListeners performs everything necessary to recieve network requests.
|
||
----------------------------------------------------------------------------------------*/
|
||
|
||
STATIC OSErr SetUpConnectionListeners(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
OSErr result;
|
||
|
||
if ((result =CreateConnectionListener((Ptr)&(ppcglobPtr->dspListener.ce),
|
||
&ppcglobPtr->dspListener.dsp1,
|
||
ppcglobPtr->dspDrvrRef,
|
||
ppcglobPtr->adspSocket = 0,
|
||
false, // No Async
|
||
nil // No Completion
|
||
) == noErr))
|
||
{
|
||
ppcglobPtr->adspSocket = ppcglobPtr->dspListener.dsp1.u.initParams.localSocket;
|
||
ppcglobPtr->dspListener.dsp2.ccbRefNum = ppcglobPtr->dspListener.dsp1.ccbRefNum;
|
||
ppcglobPtr->dspListener.dsp2.ioCRefNum = ppcglobPtr->dspDrvrRef;
|
||
|
||
if ((result = ListenConnectionRequest(&(ppcglobPtr->dspListener.dsp1),
|
||
true, // Async
|
||
(ProcPtr)ConnectionRequestCompletion // No Completion
|
||
)) == noErr)
|
||
result = ListenConnectionRequest(&(ppcglobPtr->dspListener.dsp2),
|
||
true, // Async
|
||
(ProcPtr)ConnectionRequestCompletion // No Completion
|
||
);
|
||
}
|
||
return result;
|
||
} // SetUpConnectionListeners
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
PPCSleepEvent handles sleep events from the portable. We will deny sleep requests
|
||
if we have any network sessions.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC long PPCSleepEvent(void)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
short sleepEvent;
|
||
|
||
sleepEvent = GetD0();
|
||
ppcglobPtr = getGlobal();
|
||
if(sleepEvent == sleepRequest)
|
||
{
|
||
return(ppcglobPtr->RemSessQueue.qSize?1:0); // Object if we are currently networking.
|
||
}
|
||
else if(sleepEvent == sleepDemand)
|
||
{
|
||
if(ppcglobPtr->allowIncommingRequests)
|
||
DisableIncoming();
|
||
EndAllNetworkSessions(ppcglobPtr);
|
||
ppcglobPtr->mppOpen = false;
|
||
ppcglobPtr->canRemote = false;
|
||
ppcglobPtr->dspDrvrRef = 0;
|
||
}
|
||
else if (sleepEvent == WakeupCall)
|
||
{
|
||
MPPOpen(); // I will just open the driver. Rest will take care of itself.
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
EndAllNetworkSessions ends all network sessions.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC void EndAllNetworkSessions(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
CommonSessionParamsPtr theSess;
|
||
while(theSess = ServeQueue(&ppcglobPtr->RemSessQueue))
|
||
EndNetworkSession(nil,(NetIPCParamsPtr)theSess);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
KillUserSession determines if the session qualifies to be ended. If it qualifies,
|
||
the session is ended. A NULL pointer for userName qualifies all network sessions
|
||
that this machine did not start. Otherwise if the userName matches any sessions we
|
||
did not start, they are ended.
|
||
----------------------------------------------------------------------------------------*/
|
||
|
||
STATIC Boolean KillUserSession(CommonSessionParamsPtr sessPtr,unsigned char *userName)
|
||
{
|
||
Boolean Killit;
|
||
|
||
Killit = false;
|
||
if (!sessPtr->originator)
|
||
{
|
||
if(userName)
|
||
{
|
||
if(EqualString(((NetIPCParams *)sessPtr)->userName,userName,false,true))
|
||
Killit = true;
|
||
}
|
||
else
|
||
Killit = true;
|
||
}
|
||
if(Killit)
|
||
EndNetworkSession(nil,(NetIPCParamsPtr) sessPtr);
|
||
return(Killit);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
Closes all network sessions that originated external to this machine by userName. If
|
||
userName is a NULL pointer, all network sessions are ended that were not originated
|
||
here. This can be called from the Network setup control pannel.
|
||
----------------------------------------------------------------------------------------*/
|
||
OSErr PPCCloseUserSessions(unsigned char *userName)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
short saveint;
|
||
|
||
if (!(ppcglobPtr = (PPCGlobalParamsPtr)getGlobal()))
|
||
return noGlobalsErr;
|
||
|
||
saveint = spl(kNoInterrupts);
|
||
DeleteMultiple(&ppcglobPtr->RemSessQueue,(unsigned long)userName,(SearchFuncPtr)KillUserSession);
|
||
spl(saveint);
|
||
return noErr;
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
PPCCountAcceptedNetworkSessions is called from the Network setup control panel to
|
||
find out how many sessions originated on other machines.
|
||
----------------------------------------------------------------------------------------*/
|
||
short PPCCountAcceptedNetworkSessions(unsigned char *userName)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
CommonSessionParamsPtr sessPtr;
|
||
short numberOfNetworkSessionsAccepted = 0;
|
||
short saveint;
|
||
|
||
if (!(ppcglobPtr = (PPCGlobalParamsPtr)getGlobal()))
|
||
return 0;
|
||
|
||
saveint = spl(kNoInterrupts);
|
||
FOREACHELEMENT(sessPtr,&ppcglobPtr->RemSessQueue)
|
||
{
|
||
if (!sessPtr->originator)
|
||
{
|
||
if(userName)
|
||
{
|
||
if(EqualString(((NetIPCParams *)sessPtr)->userName,userName,false,true))
|
||
++numberOfNetworkSessionsAccepted;
|
||
}
|
||
else
|
||
++numberOfNetworkSessionsAccepted;
|
||
}
|
||
}
|
||
spl(saveint);
|
||
return numberOfNetworkSessionsAccepted;
|
||
}
|
||
|
||
/*---------------------------------------------------------------------------------------------------
|
||
PPCCheckDupNBPName is called to find out if some one has a machine name the same as the one we
|
||
want. It is called from the Network Setup control pannel.
|
||
|
||
This procedure is now obsolete, and does nothing now. This procedure is going away before B4.
|
||
---------------------------------------------------------------------------------------------------*/
|
||
OSErr PPCCheckDupNBPName(void)
|
||
{
|
||
return(noErr);
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
PPCGESTALTFUNCTION returns the attributs about PPC.
|
||
----------------------------------------------------------------------------------------*/
|
||
pascal OSErr PPCGESTALTFUNCTION(long selector, long *myResp)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
|
||
if (selector == gestaltPPCToolboxAttr)
|
||
{
|
||
*myResp = gestaltPPCToolboxPresent;
|
||
if (ppcglobPtr = getGlobal())
|
||
{
|
||
if (ppcglobPtr->inited)
|
||
*myResp += gestaltPPCSupportsRealTime;
|
||
if (ppcglobPtr->canRemote)
|
||
{
|
||
*myResp += gestaltPPCSupportsOutGoing;
|
||
if (ppcglobPtr->allowIncommingRequests)
|
||
*myResp += gestaltPPCSupportsIncoming;
|
||
}
|
||
}
|
||
return noErr;
|
||
}
|
||
return gestaltUnknownErr;
|
||
} // PPCGestaltFunction
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
This call examines the usergroup BTree and returns true if we are currently allowing
|
||
incoming requests.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC Boolean GetPPCGlobalFlag(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
UserRecPb urec;
|
||
char keyName[32];
|
||
|
||
initUserGroupFile(&ppcglobPtr->ugFile.refNum);
|
||
if(ppcglobPtr->ugFile.refNum)
|
||
{
|
||
keyName[0] = 0;
|
||
urec.btPb.ioBTKeyPtr = (Ptr)&(urec.key);
|
||
BldFSKey( 0, keyName, urec.btPb.ioBTKeyPtr); // make the key
|
||
urec.btPb.ioBuffer= (Ptr)&(urec.u.record); // set pointer to record
|
||
urec.btPb.ioReqCount = sizeof (urec.u);
|
||
urec.btPb.ioRefNum= ppcglobPtr->ugFile.refNum;
|
||
urec.btPb.ioCompletion= 0; // assembly glue completion
|
||
urec.btPb.ioBTHint1= 0; // zero Hint field
|
||
urec.usrCompletion= nil; // set up completion routine
|
||
if (BTSEARCHPPC( &(urec.btPb), 0) == noErr) // dispatch the call
|
||
{
|
||
if (urec.u.ulRecord.ServerFlags & IACGlobalEnabled)
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
} // GetPPCGlobalFlag
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
PPCSHUTDOWN is called when the computer is being shut down. Just kill all network things.
|
||
----------------------------------------------------------------------------------------*/
|
||
pascal void PPCSHUTDOWN(void)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
|
||
ppcglobPtr = (PPCGlobalParamsPtr)getGlobal();
|
||
DisableIncoming();
|
||
EndAllNetworkSessions(ppcglobPtr);
|
||
ppcglobPtr->mppOpen = false;
|
||
ppcglobPtr->canRemote = false;
|
||
ppcglobPtr->dspDrvrRef = 0;
|
||
} // PPCSHUTDOWN
|
||
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
PPCSystemTask is called every time through system task, and we make sure we have enough
|
||
supplies.
|
||
----------------------------------------------------------------------------------------*/
|
||
OSErr PPCSystemTask(void)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
|
||
if (!(ppcglobPtr = (PPCGlobalParamsPtr)getGlobal()))
|
||
return noGlobalsErr;
|
||
|
||
Replenish(ppcglobPtr); // Make sure we have plenty of resources
|
||
Excess(ppcglobPtr); // Make sure we don't have too many
|
||
}
|
||
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
UnRegisterAllNBPNames will for each port that has an NBP location registered with it un-register
|
||
the name from the network.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC void UnRegisterAllNBPNames(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
PPCPortEntryPtr portPtr;
|
||
|
||
FOREACHELEMENT(portPtr,&ppcglobPtr->OpenPortQueue)
|
||
{
|
||
if (portPtr->nbpRegistered) // PortName was registered with nbp
|
||
{
|
||
PortLocationTablePtr locInfo;
|
||
|
||
locInfo = portPtr->locationInfo;
|
||
RemoveName((EntityName *)locInfo->nteQEle.nt.entityData,
|
||
false,
|
||
(ProcPtr)nil,
|
||
&locInfo->nbpPB); // PB for NBP call
|
||
portPtr->nbpRegistered = false;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
ReRegisterAllNBPNames will for each port registered with an NBP location name
|
||
re-register the name on the network. It is assumed that the NBPName is currently
|
||
un-registered at this point.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC void ReRegisterAllNBPNames(PPCGlobalParamsPtr ppcglobPtr)
|
||
{
|
||
PPCPortEntryPtr portPtr;
|
||
|
||
FOREACHELEMENT(portPtr,&ppcglobPtr->OpenPortQueue)
|
||
{
|
||
if (portPtr->locationInfo) // if port has a location name, re-register it
|
||
{
|
||
PortLocationTablePtr locInfo;
|
||
OSErr result;
|
||
|
||
locInfo = portPtr->locationInfo;
|
||
result = RegisterName(ppcglobPtr->machineName,
|
||
locInfo->typeStr,
|
||
"\p*",
|
||
ppcglobPtr->adspSocket,
|
||
false, // Call Syncronously
|
||
NULL, // NBPCompletion
|
||
(Ptr)&locInfo->nteQEle, // ntePtr
|
||
&locInfo->nbpPB); // PB for NBP call
|
||
if(!result)
|
||
portPtr->nbpRegistered = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
Return the PPC is here, but supports nothing.
|
||
----------------------------------------------------------------------------------------*/
|
||
STATIC pascal OSErr PPCDEADGESTAULT(OSType selector, long *myResp)
|
||
{
|
||
#pragma unused(selector)
|
||
*myResp = 0; // We are dead.
|
||
return noErr;
|
||
}
|
||
|
||
/*----------------------------------------------------------------------------------------
|
||
KillPPC takes the steps to remove PPCToolBox from the system. Once called PPC is dead, and
|
||
a new one must be installed.
|
||
----------------------------------------------------------------------------------------*/
|
||
OSErr KillPPC(void)
|
||
{
|
||
PPCGlobalParamsPtr ppcglobPtr;
|
||
SelectorFunctionProcPtr oldFunc;
|
||
long powerMgrAttrs;
|
||
void *p;
|
||
|
||
ppcglobPtr = (PPCGlobalParamsPtr)getGlobal();
|
||
ReplaceGestalt(gestaltPPCToolboxAttr,PPCDEADGESTAULT,&oldFunc);
|
||
|
||
if(ppcglobPtr->inited)
|
||
{
|
||
RemoveToolBoxName(ppcglobPtr);
|
||
RmvfromAtalkQ((Ptr)&(ppcglobPtr->trQEle));
|
||
EndAllNetworkSessions(ppcglobPtr);
|
||
ShutDwnRemove(PPCSHUTDOWN);
|
||
if (!Gestalt(gestaltPowerMgrAttr, &powerMgrAttrs))
|
||
{
|
||
if ((powerMgrAttrs & 1<<gestaltPMgrExists) &&
|
||
(powerMgrAttrs & 1<<gestaltPMgrCPUIdle))
|
||
{
|
||
SleepQRemove((SleepQRecPtr)&ppcglobPtr->sleepQEle);
|
||
}
|
||
}
|
||
while(p = ServeQueue(&ppcglobPtr->OpenPortQueue))
|
||
DisposeMem(p);
|
||
|
||
while(p = ServeQueue(&ppcglobPtr->LocSessQueue))
|
||
DisposeMem(p);
|
||
|
||
while(p = ServeQueue(&ppcglobPtr->RemSessQueue))
|
||
DisposeMem(p);
|
||
|
||
while(p = ServeQueue(&ppcglobPtr->IPMSessQueue))
|
||
DisposeMem(p);
|
||
|
||
while(p = ServeQueue(&ppcglobPtr->ListSessQueue))
|
||
DisposeMem(p);
|
||
|
||
while(p = ServeQueue(&ppcglobPtr->UserEntryQueue))
|
||
DisposeMem(p);
|
||
|
||
if(ppcglobPtr->listsessPtr)
|
||
DisposeMem(ppcglobPtr->listsessPtr);
|
||
}
|
||
memset((Ptr)&ppcglobPtr->configData,0,sizeof(PPCConfigInfo)); // Clear configuration.
|
||
Excess(ppcglobPtr); // Remove free ports and sessions.
|
||
DisposeMem((Ptr)ppcglobPtr);
|
||
return(noErr);
|
||
}
|
||
|