-- File: PupMiscServer.mesa, Last Edit: HGM November 13, 1980 10:14 AM DIRECTORY Process USING [Yield], Event USING [Item, Reason, AddNotifier], MiscServerDefs, PupDefs USING [ PupBuffer, ReturnFreePupBuffer, veryLongWait, PupSocketKick, PupSocket, PupSocketMake, PupSocketDestroy, PupPackageMake, PupPackageDestroy], PupTypes USING [fillInPupAddress, miscSrvSoc]; PupMiscServer: PROGRAM IMPORTS Process, Event, PupDefs EXPORTS MiscServerDefs = BEGIN OPEN PupDefs; useCount: CARDINAL _ 0; pleaseStop, running: BOOLEAN _ FALSE; miscSocket: PupSocket _ NIL; miscFork: PROCESS; bootServer: PROCEDURE [PupBuffer] _ IgnoreThisPacket; nameServer: PROCEDURE [PupBuffer] _ IgnoreThisPacket; directoryServer: PROCEDURE [PupBuffer] _ IgnoreThisPacket; timeServer: PROCEDURE [PupBuffer] _ IgnoreThisPacket; eventItem: Event.Item _ [eventMask: 177777B, eventProc: Broom]; PupMiscServerOn: PUBLIC PROCEDURE = BEGIN IF (useCount _ useCount + 1) = 1 THEN BEGIN running _ TRUE; Starter[]; END; END; Starter: PROCEDURE = BEGIN pleaseStop _ FALSE; PupDefs.PupPackageMake[]; miscSocket _ PupSocketMake[ PupTypes.miscSrvSoc, PupTypes.fillInPupAddress, veryLongWait]; miscFork _ FORK Misc[]; END; PupMiscServerOff: PUBLIC PROCEDURE = BEGIN IF useCount # 0 AND (useCount _ useCount - 1) = 0 THEN BEGIN running _ FALSE; Stopper[]; END; END; Stopper: PROCEDURE = BEGIN pleaseStop _ TRUE; PupSocketKick[miscSocket]; JOIN miscFork[]; PupSocketDestroy[miscSocket]; PupDefs.PupPackageDestroy[]; END; IgnoreThisPacket: PUBLIC PROCEDURE [b: PupBuffer] = BEGIN ReturnFreePupBuffer[b]; END; SetBootServer: PUBLIC PROCEDURE [proc: PROCEDURE [PupBuffer]] = BEGIN bootServer _ proc; END; SetNameServer: PUBLIC PROCEDURE [proc: PROCEDURE [PupBuffer]] = BEGIN nameServer _ proc; END; SetDirectoryServer: PUBLIC PROCEDURE [proc: PROCEDURE [PupBuffer]] = BEGIN directoryServer _ proc; END; SetTimeServer: PUBLIC PROCEDURE [proc: PROCEDURE [PupBuffer]] = BEGIN timeServer _ proc; END; -- This procedure is the only HOT chunk of code Misc: PROCEDURE = BEGIN OPEN MiscServerDefs; -- lots of PupType values b: PupBuffer; UNTIL pleaseStop DO IF (b _ miscSocket.get[]) # NIL THEN BEGIN SELECT b.pupType FROM bootFileSend, microcodeRequest, bootDirReq, bootDirReply, lockBooterRequest, unlockBooterRequest, bootStatsRequest => bootServer[b]; netDirVersion, sendNetDir, lockDirRequest, unlockDirRequest => directoryServer[b]; nameLookup, addressLookup, whoAmI, nameStatsRequest => nameServer[b]; dateTextRequest, dateTenexRequest, dateAltoRequest, lockTimeRequest, resetTimeRequest, timeStatsRequest => timeServer[b]; ENDCASE => ReturnFreePupBuffer[b]; END; Process.Yield[]; -- avoid hogging machine ENDLOOP; END; Broom: PROCEDURE [why: Event.Reason] = BEGIN SELECT why FROM makeImage, makeCheck => IF running THEN Stopper[]; startImage, restartCheck, continueCheck => IF running THEN Starter[]; ENDCASE => NULL; END; -- initialization Event.AddNotifier[@eventItem]; END.