-- File: GateInit.mesa - last edit: -- AOF 15-Feb-88 11:09:26 -- HGM 5-Oct-85 19:44:27 -- Copyright (C) 1981, 1984, 1985, 1988 by Xerox Corporation. All rights reserved. DIRECTORY Event USING [aboutToSwap], EventTypes USING [aboutToBoot, aboutToBootPhysicalVolume], Format USING [HostNumber], Process USING [Priority, SetPriority, Pause, priorityNormal], Put USING [Text], Runtime USING [GetBcdTime], SpecialSystem USING [GetProcessorID], String USING [AppendChar, AppendString], Supervisor USING [ AddDependency, AgentProcedure, CreateSubsystem, SubsystemHandle], System USING [GetClockPulses, HostNumber, Pulses, PulsesToMicroseconds], Time USING [AppendCurrent, Append, Packed, Unpack, Unpacked], Version USING [Append], NSName USING [maxLocalLength, Name, NameRecord], NSString USING [String, StringFromMesaString], IRSNetMgtInternal USING [], Buffer USING [], Driver USING [GetDeviceChain, Device], ForwarderDefs USING [PupForwarderOn, PeekAtRoutingPup, SetupForwarderThings], Indirect USING [GetParmFileName], GateDefs USING [ScanParameterFile, SetupWindow], EchoServer USING [CreateServer, DeleteServer], Protocol1 USING [EncapsulateAndTransmit, GetContext], PupRouterDefs USING [DoForwardPupBuffer, NetworkContext, SetPupForwarder, SetPupChecksum], PupDefs USING [ Body, PupBuffer, PupPackageMake, PupSocket, PupSocketDestroy, PupSocketMake, SecondsToTocks, SetPupContentsWords, UniqueLocalPupSocketID, AccessHandle, DestroyPool, GetBuffer, MakePool, ReturnBuffer], PupTypes USING [gatewaySoc, fillInPupAddress, allHosts, PupHostID, PupSocketID], StatsOpsExtras USING[CaptureErrors, GetDoStats], Inr USING [ActivateINR], Trouble USING [PupGlitchTrap, SetUncaughtSignalTrap]; GateInit: PROGRAM IMPORTS Event, Format, Process, Put, Runtime, SpecialSystem, String, Supervisor, System, Time, Version, NSString, Buffer, Driver, EchoServer, StatsOpsExtras, Inr, Protocol1, PupRouterDefs, PupDefs, ForwarderDefs, Indirect, GateDefs, Trouble EXPORTS Buffer, IRSNetMgtInternal, GateDefs = BEGIN OPEN GateDefs; Device: PUBLIC <<Buffer>> TYPE = Driver.Device; version: STRING = [75]; -- "Pup Gateway 14.0 of 15-Feb-88 11:07:23 on nnnnnnnnnnnnnnnn" broom: Supervisor.SubsystemHandle = Supervisor.CreateSubsystem[Broom]; name: STRING = [NSName.maxLocalLength]; nameRecord: NSName.NameRecord; GetInrName: PUBLIC PROCEDURE RETURNS [NSName.Name] = BEGIN parmFileName: LONG STRING ← Indirect.GetParmFileName[]; IF parmFileName = NIL THEN parmFileName ← "NoName"L; name.length ← 0; FOR i: CARDINAL IN [0..parmFileName.length) DO SELECT parmFileName[i] FROM '. => EXIT; '[, '], '<, '> => name.length ← 0; ENDCASE => { String.AppendChar[name, parmFileName[i]]; IF name.length = NSName.maxLocalLength THEN EXIT; }; ENDLOOP; nameRecord.org ← NSString.StringFromMesaString["Xerox"]; nameRecord.domain ← NSString.StringFromMesaString["Pup"]; nameRecord.local ← NSString.StringFromMesaString[name]; RETURN[@nameRecord]; END; GetVersionText: PUBLIC PROCEDURE RETURNS [LONG STRING] = BEGIN RETURN[version]; END; CheckNetworks: PROCEDURE = BEGIN OPEN PupRouterDefs, PupDefs; pool: PupDefs.AccessHandle ← PupDefs.MakePool[send: 1, receive: 0]; b: PupBuffer; me: PupTypes.PupSocketID ← UniqueLocalPupSocketID[]; firstDevice: Device ← Driver.GetDeviceChain[]; pupGateSoc: PupSocket; time: System.Pulses; stop: BOOLEAN ← FALSE; checker: PROCESS; FlushAnswers: PROCEDURE = BEGIN b: PupBuffer; UNTIL stop DO -- If we get an answer here, it is probably ok. -- The screwup case will look like it should get forwarded. IF (b ← pupGateSoc.get[]) # NIL THEN PupDefs.ReturnBuffer[b]; ENDLOOP; END; pupGateSoc ← PupSocketMake[me, PupTypes.fillInPupAddress, SecondsToTocks[1]]; checker ← FORK FlushAnswers[]; FOR i: CARDINAL IN [0..5) DO time ← System.GetClockPulses[]; -- We can't just broadcast a request because the answer that we are really looking for would go back to the wrong network. FOR network: Device ← firstDevice, network.next UNTIL network = NIL DO body: PupDefs.Body; allHosts: PupTypes.PupHostID ← PupTypes.allHosts; context: PupRouterDefs.NetworkContext ← Protocol1.GetContext[network, pup]; b ← PupDefs.GetBuffer[pool, send]; body ← b.pup; body.pupTransportControl ← 0; body.pupType ← gatewayRequest; body.pupID ← [0, i]; body.dest.net ← [0]; body.dest.host ← PupTypes.allHosts; body.dest.socket ← PupTypes.gatewaySoc; body.source.net ← [0]; body.source.host ← [context.pupHostNumber]; body.source.socket ← me; SetPupContentsWords[b, 0]; PupRouterDefs.SetPupChecksum[b]; b.fo.context ← context; b.fo.network ← network; Protocol1.EncapsulateAndTransmit[LOOPHOLE[b], @allHosts]; ENDLOOP; UNTIL System.PulsesToMicroseconds[[System.GetClockPulses[] - time]] > 1000000 DO Process.Pause[1]; ENDLOOP; ENDLOOP; stop ← TRUE; JOIN checker; PupSocketDestroy[pupGateSoc]; PupDefs.DestroyPool[pool]; END; StartupGateway: PUBLIC PROCEDURE = BEGIN me: System.HostNumber = LOOPHOLE[SpecialSystem.GetProcessorID[]]; priority: Process.Priority; disableNSRouting: BOOLEAN; packed: Time.Packed; unpacked: Time.Unpacked; String.AppendString[version, "Pup Gateway "L]; Version.Append[version]; String.AppendString[version, " of "L]; packed ← Runtime.GetBcdTime[]; unpacked ← Time.Unpack[packed, [useThese[[west, 0, 0, 366, 366]]]]; Time.Append[version, unpacked, TRUE]; String.AppendString[version, " on "L]; BEGIN Append: PROCEDURE [s: LONG STRING, clientData: LONG POINTER] = BEGIN String.AppendString[version, s]; END; Format.HostNumber[Append, me, productSoftware]; END; GateDefs.SetupWindow[]; Message["starting"L]; -- PupGateway.typescript [] ← StatsOpsExtras.GetDoStats[]; -- Be sure it has been started StatsOpsExtras.CaptureErrors[Trouble.PupGlitchTrap]; Trouble.SetUncaughtSignalTrap[]; [priority, disableNSRouting] ← GateDefs.ScanParameterFile[]; Process.SetPriority[priority]; ForwarderDefs.SetupForwarderThings[]; [] ← PupDefs.PupPackageMake[]; EchoServer.DeleteServer[]; EchoServer.CreateServer[buffers: 20]; IF ~disableNSRouting THEN Inr.ActivateINR[]; PupRouterDefs.SetPupForwarder[ForwarderDefs.PeekAtRoutingPup]; CheckNetworks[]; ForwarderDefs.PupForwarderOn[]; PupRouterDefs.SetPupForwarder[PupRouterDefs.DoForwardPupBuffer]; Process.SetPriority[Process.priorityNormal]; Message["in operation"L]; END; Message: PROCEDURE [s: LONG STRING] = BEGIN text: STRING = [125]; Time.AppendCurrent[text]; String.AppendString[text, " "L]; String.AppendString[text, version]; String.AppendChar[text, ' ]; String.AppendString[text, s]; String.AppendChar[text, '.]; String.AppendChar[text, '\n]; LogString[text]; END; LogString: PROCEDURE [text: LONG STRING] = BEGIN Put.Text[NIL, text]; END; Broom: Supervisor.AgentProcedure = BEGIN SELECT event FROM EventTypes.aboutToBoot, EventTypes.aboutToBootPhysicalVolume => Message["finished"L]; ENDCASE => NULL; END; -- initialization Supervisor.AddDependency[client: broom, implementor: Event.aboutToSwap]; StartupGateway[]; END.