-- Copyright (C) 1981, 1984 by Xerox Corporation. All rights reserved.
-- GateInit.mesa, HGM, 7-Jan-85 19:45:22
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, ReturnBuffer],
Driver USING [GetDeviceChain, Network],
ForwarderDefs USING [PupForwarderOn, PeekAtRoutingPup, SetupForwarderThings],
Indirect USING [GetParmFileName],
GateDefs USING [ScanParameterFile, SetupWindow],
EchoServer USING [CreateServer, DeleteServer],
PupRouterDefs USING [DoForwardPupBuffer, SetPupForwarder, SetPupChecksum],
PupDefs USING [
CaptureErrors, GetDoStats, PupBuffer,
PupPackageMake, PupSocket, PupSocketDestroy, PupSocketMake,
SecondsToTocks, SetPupContentsWords,
UniqueLocalPupSocketID],
PupTypes USING [gatewaySoc, fillInPupAddress, allHosts, 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, PupRouterDefs, PupDefs,
ForwarderDefs, Indirect, GateDefs, Trouble
EXPORTS IRSNetMgtInternal, GateDefs
SHARES Driver, Buffer =
BEGIN OPEN GateDefs;
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[];
network, firstNetwork: Driver.Network;
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;
firstNetwork ← Driver.GetDeviceChain[];
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 ← firstNetwork, network.next UNTIL network = NIL DO
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 ← [network.pupHostNumber];
b.pup.source.socket ← me;
SetPupContentsWords[b, 0];
PupRouterDefs.SetPupChecksum[b];
network.encapsulateAndSendPup[b, PupTypes.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.