-- Copyright (C) 1981, 1984, 1985 by Xerox Corporation. All rights reserved.
-- GateInit.mesa, HGM, 5-Oct-85 19:44:27
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 [AccessHandle, DestroyPool, GetBuffer, MakePool, Network, ReturnBuffer],
Driver USING [GetDeviceChain, Network],
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 [
CaptureErrors, GetDoStats, PupBuffer,
PupPackageMake, PupSocket, PupSocketDestroy, PupSocketMake,
SecondsToTocks, SetPupContentsWords,
UniqueLocalPupSocketID],
PupTypes USING [gatewaySoc, fillInPupAddress, allHosts, PupHostID, PupSocketID],
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,
Inr, Protocol1, PupRouterDefs, PupDefs,
ForwarderDefs, Indirect, GateDefs, Trouble
EXPORTS Buffer, IRSNetMgtInternal, GateDefs
SHARES Driver, Buffer =
BEGIN OPEN GateDefs;
Network: PUBLIC TYPE = Driver.Network;
version: STRING = [75]; -- "Pup Gateway 8.0c of 13-Oct-81 20:57:07 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: Buffer.AccessHandle ← Buffer.MakePool[send: 1, receive: 0];
b: PupBuffer;
me: PupTypes.PupSocketID ← UniqueLocalPupSocketID[];
firstNetwork: Driver.Network ← 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 Buffer.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: Driver.Network ← firstNetwork, network.next UNTIL network = NIL DO
allHosts: PupTypes.PupHostID ← PupTypes.allHosts;
context: PupRouterDefs.NetworkContext ← Protocol1.GetContext[network, pup];
b ← Buffer.GetBuffer[pup, pool, send];
b.pup.pupTransportControl ← 0;
b.pup.pupType ← gatewayRequest;
b.pup.pupID ← [0, i];
b.pup.dest.net ← [0];
b.pup.dest.host ← PupTypes.allHosts;
b.pup.dest.socket ← PupTypes.gatewaySoc;
b.pup.source.net ← [0];
b.pup.source.host ← [context.pupHostNumber];
b.pup.source.socket ← me;
SetPupContentsWords[b, 0];
PupRouterDefs.SetPupChecksum[b];
b.context ← context;
b.network ← network;
Protocol1.EncapsulateAndTransmit[b, @allHosts];
ENDLOOP;
UNTIL System.PulsesToMicroseconds[[System.GetClockPulses[] - time]] >
1000000 DO Process.Pause[1]; ENDLOOP;
ENDLOOP;
stop ← TRUE;
JOIN checker;
PupSocketDestroy[pupGateSoc];
Buffer.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
[] ← PupDefs.GetDoStats[]; -- Be sure it has been started
PupDefs.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.