-- Grapevine: Lily: main control
-- [Indigo]<Grapevine>Lily>LilyControl.mesa
-- Andrew Birrell 17-Dec-82 9:13:26
-- Mike Schroeder, 21-Oct-82 9:19:28
DIRECTORY
Ascii USING[ ControlT, CR, DEL ],
DisplayDefs USING[ DisplayOff, StopCursor ],
DriverDefs USING[ freeQueue ],
HeapDefs USING[ Compactor, HeapRestart ],
ImageDefs USING[ BcdTime ],
IODefs USING[ GetInputStream, SetOutputStream ],
LilyCommandDefs USING[ LilyCommands ],
LogDefs USING[ DisplayNumber, SetTypescriptParameters, StatisticsOn,
TypescriptOn, WriteChar, WriteLine, WriteLogEntry,
WriteString ],
PolicyDefs USING[ SetOperationLimit ],
ProcessDefs USING[ Detach ],
ProtocolDefs USING[ SetTestingMode ],
PupDefs USING[ AdjustBufferParms, AppendMyName,
GetPupPackageUseCount, PupPackageMake ],
PupRouterDefs USING[ numberOfNetworks ],
RestartDefs USING[ Enquiry ],
StreamDefs USING[ DestroyKeyHandler, StreamHandle, StreamObject],
StringDefs USING[ AppendString ],
TimeDefs USING[ AppendFullDayTime, UnpackDT ],
VMDefs USING[ InitializeVM ];
LilyControl: PROGRAM
IMPORTS DisplayDefs, DriverDefs, HeapDefs,
ImageDefs, IODefs, LilyCommandDefs, LogDefs, PolicyDefs,
ProcessDefs, ProtocolDefs, PupDefs, PupRouterDefs,
RestartDefs, StreamDefs, StringDefs, TimeDefs, VMDefs =
BEGIN
inStream: StreamDefs.StreamHandle = IODefs.GetInputStream[];
myStream: StreamDefs.StreamObject ←
[ reset: NIL, get: NIL, putback: NIL, put: MyPut, endof: NIL,
destroy: NIL, link: NIL, body: Other[type:0, data:NIL] ];
MyPut: PROC[str: StreamDefs.StreamHandle, c: UNSPECIFIED] =
{ LogDefs.WriteChar[c] };
WriteVersion: PROCEDURE[where: {disk, screen}] =
BEGIN
s: STRING = [256];
StringDefs.AppendString[s, "Grapevine server starting. Version of "L];
TimeDefs.AppendFullDayTime[s, TimeDefs.UnpackDT[ImageDefs.BcdTime[]] ];
IF where = disk
THEN LogDefs.WriteLogEntry[s]
ELSE LogDefs.WriteLine[s];
END;
testMode: BOOLEAN ← FALSE;
SetTestingMode: PROCEDURE =
BEGIN
IF NOT inStream.endof[inStream]
AND inStream.get[inStream] = Ascii.ControlT
THEN BEGIN
LogDefs.WriteString["Set testing mode [confirm] "L];
UNTIL inStream.endof[inStream]
DO [] ← inStream.get[inStream] ENDLOOP;
DO c: CHARACTER = inStream.get[inStream];
SELECT c FROM
'y, 'Y, Ascii.CR =>
BEGIN
LogDefs.WriteLine["Yes"L];
ProtocolDefs.SetTestingMode[]; testMode ← TRUE;
EXIT
END;
'n, 'N, Ascii.DEL =>
{ LogDefs.WriteLine["No"L]; EXIT };
ENDCASE => LogDefs.WriteChar['?];
ENDLOOP;
END;
END;
StartStats: PROCEDURE =
BEGIN
OPEN StringDefs;
s: STRING = [256];
AppendString[s, IF testMode THEN "*** Testing: "L ELSE "Grapevine: "L];
AppendString[s, "Unintelligent Terminal Server """L];
PupDefs.AppendMyName[s];
AppendString[s, """"L];
LogDefs.StatisticsOn[s];
LogDefs.WriteLogEntry[s];
END;
StartCompactor: PROC =
{ START HeapDefs.Compactor };
StartHeap: PROC =
BEGIN
initHeap: BOOLEAN = START HeapDefs.HeapRestart[];
ProcessDefs.Detach[FORK StartCompactor[]];
END;
-- Main program --
DisplayDefs.DisplayOff[black]; DisplayDefs.StopCursor[];
LogDefs.SetTypescriptParameters[tsLines: 3];
LogDefs.TypescriptOn[];
WriteVersion[screen];
IODefs.SetOutputStream[@myStream];
[] ← PupDefs.GetPupPackageUseCount[]; -- to start PupRouterCold! --
PupRouterDefs.numberOfNetworks ← 255; -- exclude 0; in PupRouterCold --
PupDefs.AdjustBufferParms[54--buffers--, 64--words--];
-- Beware of OIS routing table packets and Alto I microcode bugs! --
PupDefs.PupPackageMake[];
LogDefs.DisplayNumber["Free PUPs"L, [short[@DriverDefs.freeQueue.length]]];
VMDefs.InitializeVM[min:15--pages--, max:45--pages--];
PolicyDefs.SetOperationLimit[op: lily, limit: 10]; --more Lily connections--
WriteVersion[disk];
SetTestingMode[];
StartHeap[];
StartStats[];
StreamDefs.DestroyKeyHandler[];
START RestartDefs.Enquiry;
START LilyCommandDefs.LilyCommands;
END.