DIRECTORY Arpa USING [Address], ArpaConfig, ArpaName USING [SetArpanetRootServers], Ascii USING [Digit], FS USING [Error, StreamOpen], IO USING [Close, EndOf, EndOfStream, Error, GetChar, GetLineRope, GetTokenRope, IDProc, PeekChar, STREAM], MessageWindow USING [Append], Rope USING [Cat, Equal, ROPE], RopeList USING [Append]; ArpaConfigImpl: CEDAR MONITOR IMPORTS ArpaName, Ascii, FS, IO, MessageWindow, Rope, RopeList EXPORTS ArpaConfig = BEGIN OPEN ArpaConfig; ROPE: TYPE = Rope.ROPE; gvMSName: PUBLIC ROPE _ "ArpaGateway.ms"; ourLocalAddress: PUBLIC Arpa.Address _ [13, 0, 12, 232]; ourLocalName: PUBLIC Rope.ROPE _ "Xerox.COM"; xeroxDomain: PUBLIC ROPE _ "Xerox.COM"; rootServerAddresses: PUBLIC LIST OF Arpa.Address _NIL; -- list of ARPA domain server addresses resolv: PUBLIC REF BOOL _ NEW[BOOL _ TRUE]; -- whether to do full recursive name resolution specialDomains: PUBLIC LIST OF Rope.ROPE; topLevelDomains: PUBLIC LIST OF Rope.ROPE; validDomains: PUBLIC LIST OF Rope.ROPE; uucpGateway: PUBLIC Rope.ROPE _ "seismo.css.gov"; csnetGateway: PUBLIC Rope.ROPE _ "relay.cs.net"; bitnetGateway: PUBLIC Rope.ROPE _ "WISCVM.WISC.EDU"; configFileName: ROPE _ "ArpaConfig.data"; ParseAddress: PROC [s: IO.STREAM] RETURNS [a: Arpa.Address] = { AToI: PROC [s: IO.STREAM] RETURNS [i: INT _ 0] = { WHILE ~IO.EndOf[s] AND Ascii.Digit[IO.PeekChar[s]] DO i _ i*10 + (s.GetChar[]-'0); ENDLOOP; }; WHILE IO.PeekChar[s] = ' DO [] _ IO.GetChar[s]; ENDLOOP; IF IO.PeekChar[s] = '[ THEN [] _ IO.GetChar[s]; FOR i: INT IN [0..3] DO SELECT i FROM 0 => a.a _ AToI[s]; 1 => a.b _ AToI[s]; 2 => a.c _ AToI[s]; 3 => a.d _ AToI[s]; ENDCASE; IF ~IO.EndOf[s] AND IO.PeekChar[s] = '. THEN [] _ IO.GetChar[s]; ENDLOOP; IF ~IO.EndOf[s] AND IO.PeekChar[s] = '] THEN [] _ IO.GetChar[s]; }; ReadConfigurationFile: PUBLIC PROC ~ { ENABLE { IO.EndOfStream => GO TO GiveUp; IO.Error => { MessageWindow.Append[message: Rope.Cat["Syntax error in ", configFileName], clearFirst: TRUE]; GO TO GiveUp; }; }; f: IO.STREAM; t: Rope.ROPE; SkipWhite: PROC [s: IO.STREAM] ~ { WHILE s.PeekChar[] = ' OR s.PeekChar[] = '\t DO [] _ s.GetChar[]; ENDLOOP; }; ParseRopeList: PROC [s: IO.STREAM] RETURNS [list: LIST OF Rope.ROPE] = { DO SkipWhite[s]; IF s.PeekChar = '\n THEN EXIT; list _ RopeList.Append[list, LIST[s.GetTokenRope[IO.IDProc].token]]; ENDLOOP; }; f _ FS.StreamOpen[configFileName ! FS.Error => { MessageWindow.Append[message: error.explanation, clearFirst: TRUE]; GO TO GiveUp}]; WHILE NOT f.EndOf[] DO [token: t] _ f.GetTokenRope[IO.IDProc]; SkipWhite[f]; IF f.PeekChar[] = ': THEN [] _ f.GetChar[]; SELECT TRUE FROM t.Equal["ArpaAddress"] => ourLocalAddress _ ParseAddress[f]; t.Equal["RootServerAddresses"] => { rootServerAddresses _ NIL; DO addr: LIST OF Arpa.Address; SkipWhite[f]; IF f.PeekChar = '\n THEN EXIT; addr _ CONS[ParseAddress[f], NIL]; IF rootServerAddresses = NIL THEN rootServerAddresses _ addr ELSE FOR list: LIST OF Arpa.Address _ rootServerAddresses, list.rest UNTIL list = NIL DO IF list.rest = NIL THEN {list.rest _ addr; EXIT; }; ENDLOOP; ENDLOOP; }; t.Equal["GVMSName"] => [token: gvMSName] _ f.GetTokenRope[IO.IDProc]; t.Equal["ArpaName"] => [token: ourLocalName] _ f.GetTokenRope[IO.IDProc]; t.Equal["DomainName"] => [token: xeroxDomain] _ f.GetTokenRope[IO.IDProc]; t.Equal["UUCPGateway"] => [token: uucpGateway] _ f.GetTokenRope[IO.IDProc]; t.Equal["CSNETGateway"] => [token: csnetGateway] _ f.GetTokenRope[IO.IDProc]; t.Equal["BitnetGateway"] => [token: bitnetGateway] _ f.GetTokenRope[IO.IDProc]; t.Equal["SpecialDomains"] => {specialDomains _ ParseRopeList[f]}; t.Equal["TopLevelDomains"] => {topLevelDomains _ ParseRopeList[f]}; ENDCASE => NULL; [] _ f.GetLineRope[]; -- toss text to end of line ENDLOOP; IO.Close[f]; EXITS GiveUp => NULL; }; ReadConfigurationFile[]; validDomains _ RopeList.Append[topLevelDomains, specialDomains]; IF rootServerAddresses # NIL THEN ArpaName.SetArpanetRootServers[rootServerAddresses]; END. ΰCopyright (C) 1987 by Xerox Corporation. All rights reserved. The following program was created in 1983 but has not been published within the meaning of the copyright law, is furnished under license, and may not be used, copied and/or disclosed except in accordance with the terms of said license. ArpaConfigImpl.mesa John Larson, March 13, 1988 6:18:39 pm PST Read Configuration File Look for a configuration file and use it for some parameter values. Initialization code ΚΦ– "cedar" style˜Icode2šœ©™©headšœ™Icode™*šΟk ˜ Kšœœ ˜Kšœ ˜ Kšœ œ˜'Kšœœ ˜Kšœœ˜KšœœZœ˜jKšœœ ˜Kšœœœ˜Kšœ œ ˜——šΟnœœ˜Kšœœœ˜>Kšœ ˜Kšœœ ˜Kšœœœ˜Kšœ  œ˜)Kšœœ!˜8Kšœœœ˜-Kšœ œœ˜'Kš œœœœœΟc'˜_KšœœœœœœœŸ/˜\Kš œœœœœ˜)Kš œœœœœ˜*Kš œœœœœ˜'Kšœ œœ˜1Kšœœœ˜0Kšœœœ˜4Kšœœ˜)—™š ž œœœœœ˜?š žœœœœœœ ˜2š œœ œ œ˜5K˜Kšœ˜ ——Kš œœœœ œ˜9Kšœœœœ ˜/šœœœ˜šœ˜ K˜K˜K˜K˜Kšœ˜—Kš œœ œœœœ ˜@Kšœ˜—Kš œœ œœœœ˜CK˜—šžœ œ˜&K™Cšœ˜Kšœœœ˜šœ ˜ KšΟrXΠkr ˜^Kšœœ˜ K˜—K˜—Kšœœœ˜ Kšœœ˜ K˜šž œœœœ˜"šœœ˜0K˜Kšœ˜—K˜K˜—šž œœœœœœœœ˜Hš˜K˜ Kšœ œ˜Kšœœœ˜DKšœ˜—Kšœ˜K˜K˜K˜—K˜šœœœ ˜0Kš œœ˜CKšœœ ˜—šœœ ˜Kšœœ ˜'K˜ šœ˜K˜—šœœ˜K˜<˜#Kšœœ˜š˜Kšœœœ˜K˜ šœ˜Kšœ˜—Kšœœœ˜"Kšœœœ˜<š˜š œœœ/œœ˜SKšœ œœœ˜3Kšœ˜——Kšœ˜—K˜—Kšœ:œ ˜EKšœ>œ ˜IKšœ?œ ˜JKšœ@œ ˜KKšœBœ ˜MKšœDœ ˜OKšœA˜AKšœC˜CKšœœ˜—KšœŸ˜1Kšœ˜K˜ —š˜Kšœ œ˜—K˜——™K˜K˜@Kšœœœ6˜WKšœ˜——…—f