-- Transport Mechanism Filestore - information about other servers -- -- [Juniper]<Grapevine>MS>ServerInfo.mesa -- Andrew Birrell 24-Jul-81 16:00:25 -- -- Randy Gobbel 19-May-81 12:44:13 -- DIRECTORY BodyDefs USING[ maxRNameLength, RName ], LocalNameDefs USING[ ReadMSName ], LogDefs USING[ WriteChar, WriteLogEntry ], 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 LocalNameDefs, LogDefs, NameInfoDefs, ProtocolDefs, PupDefs, SiteCacheDefs, String EXPORTS ServerDefs SHARES ServerDefs = BEGIN OPEN ServerDefs; LogUpDown: INTERNAL PROCEDURE[handle: ServerHandle, upDown: {up,down} ] = BEGIN log: STRING = [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.WriteLogEntry[log]; LogDefs.WriteChar[IF upDown = up THEN 'U ELSE 'D]; 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: 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 ]; SELECT handle.type FROM mail => addr.socket ← ProtocolDefs.mailServerServerSocket; foreign => NULL -- NLS should provide socket number --; ENDCASE => ERROR; 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.