-- Copyright (C) 1981, 1984, 1985 by Xerox Corporation. All rights reserved. -- ServerInfo.mesa, Transport Mechanism Filestore - information about other servers -- -- HGM, 15-Sep-85 5:21:52 -- Andrew Birrell 24-Jul-81 16:00:25 -- -- Randy Gobbel 19-May-81 12:44:13 -- DIRECTORY BodyDefs USING [maxRNameLength, RName], Heap USING [systemZone], LocalNameDefs USING [ReadMSName], LogDefs USING [ShowLine], NameInfoDefs USING [GetConnect, NameType], ProtocolDefs USING [IsLocal, mailServerServerSocket], PupDefs USING [AppendPupAddress, GetPupAddress, PupAddress, PupNameTrouble], ServerDefs USING [ServerHandle, ServerName], SiteCacheDefs USING [SelectiveFlush], String USING [AppendString, EquivalentStrings]; ServerInfo: MONITOR LOCKS handle USING handle: ServerDefs.ServerHandle IMPORTS Heap, LocalNameDefs, LogDefs, NameInfoDefs, ProtocolDefs, PupDefs, SiteCacheDefs, String EXPORTS ServerDefs SHARES ServerDefs = BEGIN OPEN ServerDefs; LogUpDown: INTERNAL PROCEDURE [handle: ServerHandle, upDown: {up, down}] = BEGIN log: LONG STRING ← Heap.systemZone.NEW[StringBody[128]]; String.AppendString[log, IF upDown = up THEN "Up"L ELSE "Down"L]; String.AppendString[log, " server, "L]; WITH handle.name SELECT FROM rName => BEGIN String.AppendString[log, "R-Name: "L]; String.AppendString[log, value]; END; connect => BEGIN String.AppendString[log, "Connect: "L]; String.AppendString[log, value]; END; netAddr => BEGIN String.AppendString[log, "Net-addr: "L]; PupDefs.AppendPupAddress[log, value]; END; ENDCASE => ERROR; LogDefs.ShowLine[log]; Heap.systemZone.FREE[@log]; END; ServerUp: PUBLIC ENTRY PROCEDURE [handle: ServerHandle] RETURNS [BOOLEAN] = BEGIN RETURN[handle.up] END; InnerUpServer: ENTRY PROCEDURE [handle: ServerHandle] = INLINE BEGIN handle.up ← TRUE; LogUpDown[handle, up]; END; UpServer: PUBLIC PROCEDURE [handle: ServerHandle] = BEGIN InnerUpServer[handle]; SiteCacheDefs.SelectiveFlush[handle]; END; InnerDownServer: INTERNAL PROCEDURE [handle: ServerHandle] = BEGIN handle.up ← FALSE; WITH handle.name SELECT FROM rName, connect => handle.addrKnown ← FALSE; netAddr => NULL; ENDCASE => ERROR; LogUpDown[handle, down]; END; DownServer: PUBLIC ENTRY PROCEDURE [handle: ServerHandle] = BEGIN InnerDownServer[handle]; END; ServerAddr: PUBLIC ENTRY PROCEDURE [handle: ServerHandle] RETURNS [addr: PupDefs.PupAddress] = BEGIN ENABLE UNWIND => IF handle.up THEN InnerDownServer[handle]; buffer: LONG STRING ← [BodyDefs.maxRNameLength]; IF handle.addrKnown THEN RETURN[handle.addr]; WITH handle.name SELECT FROM connect => buffer ← value; rName => BEGIN info: NameInfoDefs.NameType = NameInfoDefs.GetConnect[value, buffer]; SELECT info FROM individual => NULL; allDown => ERROR ServerNotUp[]; notFound, group => ERROR NoSuchServer; ENDCASE => ERROR; END; ENDCASE => ERROR; PupDefs.GetPupAddress[ @addr, buffer ! PupDefs.PupNameTrouble => IF code = errorFromServer THEN ERROR NoSuchServer ELSE ERROR ServerNotUp]; addr.socket ← ProtocolDefs.mailServerServerSocket; handle.addr ← addr; IF handle.up THEN handle.addrKnown ← TRUE; END; myMSName: BodyDefs.RName = LocalNameDefs.ReadMSName[].name; ServerIsLocal: PUBLIC PROCEDURE [handle: ServerHandle] RETURNS [BOOLEAN] = BEGIN ENABLE NoSuchServer, ServerNotUp => GOTO no; -- If server isn't up, return FALSE early, to avoid re-calculating -- its net address -- RETURN[ WITH handle.name SELECT FROM rName => String.EquivalentStrings[value, myMSName], ENDCASE => ServerUp[handle] AND ProtocolDefs.IsLocal[ServerAddr[handle]]] EXITS no => RETURN[FALSE] END; NoSuchServer: PUBLIC ERROR = CODE; ServerNotUp: PUBLIC ERROR = CODE; END.