DIRECTORY BasicTime USING [Now], Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, Failed, Parse], Convert USING [RopeFromTime], FS USING [Error, StreamOpen], IO USING [Close, EndOf, EndOfStream, Error, Flush, GetChar, PutF, PutChar, PutRope, rope, STREAM], Rope USING [ROPE], IPDefs USING [Address], IPName USING [NameToAddress], TCP USING [AbortTCPStream, CreateTCPStream, Error, neverTimeout, Timeout, WaitForListenerOpen]; BuildNameTable: CEDAR PROGRAM IMPORTS BasicTime, Commander, CommandTool, Convert, FS, IO, IPName, TCP = BEGIN nameServerSocket: INT = 145B; defaultNameServer: Rope.ROPE = "SRI-NIC.ARPA"; defaultFileName: Rope.ROPE = "Hosts.txt"; Version: Commander.CommandProc = { out: IO.STREAM _ cmd.out; server: IO.STREAM; nameServer: Rope.ROPE _ defaultNameServer; where: LIST OF IPDefs.Address; out.PutF["Poking ARPA Name Server for current version.\n"]; where _ IPName.NameToAddress[nameServer ! FS.Error => CONTINUE]; IF where = NIL THEN { out.PutF["Can't lookup IP Address for %G.\n", IO.rope[nameServer]]; RETURN; }; BEGIN ENABLE { TCP.Timeout => { out.PutRope["[TCP.Timeout.]\n"]; GO TO GiveUp; }; TCP.Error => { out.PutRope["[TCP.Error.]\n"]; GO TO GiveUp; }; IO.Error => { out.PutRope["[IO.Error.]\n"]; GOTO GiveUp; }; }; server _ TCP.CreateTCPStream[[ matchLocalPort: FALSE, localPort: 0, matchForeignAddr: TRUE, foreignAddress: where.first, matchForeignPort: TRUE, foreignPort: nameServerSocket, active: TRUE, timeout: 120000]]; TCP.WaitForListenerOpen[server, TCP.neverTimeout]; server.PutRope["VERSION\n\l"]; server.Flush[]; WHILE NOT server.EndOf[] DO c: CHAR _ server.GetChar[ ! IO.EndOfStream => EXIT]; IF c # '\l THEN out.PutChar[c]; ENDLOOP; server.Close[]; EXITS GiveUp => IF server # NIL THEN TCP.AbortTCPStream[server]; END; }; HostName: Commander.CommandProc = { out: IO.STREAM _ cmd.out; argv: CommandTool.ArgumentVector = CommandTool.Parse[cmd ! CommandTool.Failed => {out.PutRope[errorMsg]; GOTO CantParse}]; name: Rope.ROPE; server: IO.STREAM; nameServer: Rope.ROPE _ defaultNameServer; where: LIST OF IPDefs.Address; IF argv.argc > 1 THEN name _ argv[1] ELSE name _ "Xerox"; out.PutF["Poking ARPA Name Server for info on %G.\n", [rope[name]] ]; where _ IPName.NameToAddress[nameServer ! FS.Error => CONTINUE]; IF where = NIL THEN { out.PutF["Can't lookup IP Address for %G.\n", IO.rope[nameServer]]; RETURN; }; BEGIN ENABLE { TCP.Timeout => { out.PutRope["[TCP.Timeout.]\n"]; GO TO GiveUp; }; TCP.Error => { out.PutRope["[TCP.Error.]\n"]; GO TO GiveUp; }; IO.Error => { out.PutRope["[IO.Error.]\n"]; GOTO GiveUp; }; }; server _ TCP.CreateTCPStream[[ matchLocalPort: FALSE, localPort: 0, matchForeignAddr: TRUE, foreignAddress: where.first, matchForeignPort: TRUE, foreignPort: nameServerSocket, active: TRUE, timeout: 120000]]; TCP.WaitForListenerOpen[server, TCP.neverTimeout]; server.PutRope["HNAME "]; server.PutRope[name]; server.PutChar['\n]; server.PutChar['\l]; -- send the LF as well server.Flush[]; WHILE NOT server.EndOf[] DO c: CHAR _ server.GetChar[ ! IO.EndOfStream => EXIT]; IF c # '\l THEN out.PutChar[c]; ENDLOOP; server.Close[]; EXITS GiveUp => IF server # NIL THEN TCP.AbortTCPStream[server]; END; EXITS CantParse => NULL; }; FetchTable: Commander.CommandProc = { out: IO.STREAM _ cmd.out; argv: CommandTool.ArgumentVector = CommandTool.Parse[cmd ! CommandTool.Failed => {out.PutRope[errorMsg]; GOTO CantParse}]; fileName, nameServer: Rope.ROPE; file, server: IO.STREAM; where: LIST OF IPDefs.Address; IF argv.argc > 1 THEN fileName _ argv[1] ELSE fileName _ defaultFileName; IF argv.argc > 2 THEN nameServer _ argv[2] ELSE nameServer _ defaultNameServer; out.PutF["Fetching new %G from %G.\n", [rope[fileName]], [rope[nameServer]] ]; where _ IPName.NameToAddress[nameServer ! FS.Error => CONTINUE]; IF where = NIL THEN { out.PutF["Can't lookup IP Address for %G.\n", IO.rope[nameServer]]; RETURN; }; file _ FS.StreamOpen[fileName, create]; BEGIN ENABLE { TCP.Timeout => { out.PutRope["[TCP.Timeout.]\n"]; GO TO GiveUp; }; TCP.Error => { out.PutRope["[TCP.Error.]\n"]; GO TO GiveUp; }; IO.Error => { out.PutRope["[IO.Error.]\n"]; GOTO GiveUp; }; }; file.PutRope["FETCHED: "]; file.PutRope[Convert.RopeFromTime[BasicTime.Now[]]]; file.PutRope["\n"]; server _ TCP.CreateTCPStream[[ matchLocalPort: FALSE, localPort: 0, matchForeignAddr: TRUE, foreignAddress: where.first, matchForeignPort: TRUE, foreignPort: nameServerSocket, active: TRUE, timeout: 120000]]; TCP.WaitForListenerOpen[server, TCP.neverTimeout]; server.PutRope["VERSION\n\l"]; server.Flush[]; WHILE NOT server.EndOf[] DO c: CHAR _ server.GetChar[ ! IO.EndOfStream => EXIT]; IF c # '\l THEN file.PutChar[c]; ENDLOOP; server.Close[]; server _ TCP.CreateTCPStream[[ matchLocalPort: FALSE, localPort: 0, matchForeignAddr: TRUE, foreignAddress: where.first, matchForeignPort: TRUE, foreignPort: nameServerSocket, active: TRUE, timeout: 120000]]; TCP.WaitForListenerOpen[server, TCP.neverTimeout]; server.PutRope["ALL\n\l"]; server.Flush[]; WHILE NOT server.EndOf[] DO c: CHAR _ server.GetChar[ ! IO.EndOfStream => EXIT]; IF c # '\l THEN file.PutChar[c]; ENDLOOP; server.Close[]; EXITS GiveUp => BEGIN IF server # NIL THEN TCP.AbortTCPStream[server]; END; END; out.PutChar['\n]; file.Close[]; EXITS CantParse => NULL; }; Commander.Register[key: "HostName", proc: HostName, doc: "Look up Host Name at NIC's NameServer"]; Commander.Register[key: "NameTableVersion", proc: Version, doc: "Print out VERSION info from NIC's NameServer"]; Commander.Register[key: "FetchNameTable", proc: FetchTable, doc: "Fetch Source for IP name table from NIC"]; END. zCopyright (C) 1983, 1984 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. BuildNameTable.mesa Last Edited by: Nichols, August 31, 1983 4:07 pm Last Edited by: Taft, January 21, 1984 5:26:00 pm PST Last Edited by: HGM, May 22, 1984 5:09:58 pm PDT Hal Murray June 27, 1985 3:26:44 am PDT John Larson, April 14, 1986 11:38:06 pm PST Include version info in our copy of the file. Now, grab the data. Κ– "cedar" style˜Icode2šœ―™―headšœ™J™0J™5J™0Icode™'M™+J™šΟk ˜ Kšœ œ˜Kšœ œ˜(Kšœ œ!˜2Kšœœ˜Kšœœ˜KšœœRœ˜bKšœœœ˜Kšœœ ˜Kšœœ˜KšœœV˜_K˜——šΟnœœ˜Kšœ-œœ œ˜IKš˜Kšœœ˜Kšœœ˜.Kšœœ˜)šžœ˜"Kšœœœ ˜Kšœœœ˜Kšœœ˜*Kšœœœ˜K˜;Kšœ*œ œ˜@šœ œœ˜Kšœ.œ˜CKšœ˜ —š˜šœ˜šœ ˜Kšœ ˜ Kšœœ ˜—šœ ˜Kšœ˜Kšœœ ˜—šœ ˜ Kšœ˜Kšœ ˜—K˜——šœ œ˜Kšœœ˜Kšœ ˜ Kšœœ˜Kšœ˜Kšœœ˜Kšœ˜Kšœœ˜ Kšœ˜—Kšœœ˜2Kšœ˜K˜šœœ˜Kšœœœœ˜4Kšœ œ˜Kšœ˜—Kšœ˜š˜Kš œ œ œœœ˜:—Kšœ˜K˜—šžœ˜#Kšœœœ ˜˜:KšœΟr œ œ ˜?—Kšœ œ˜Kšœœœ˜Kšœœ˜*Kšœœœ˜Kšœœœ˜9K˜EKšœ*œ œ˜@šœ œœ˜Kšœ.œ˜CKšœ˜ —š˜šœ˜šœ ˜Kšœ ˜ Kšœœ ˜—šœ ˜Kšœ˜Kšœœ ˜—šœ ˜ Kšœ˜Kšœ ˜—K˜——šœ œ˜Kšœœ˜Kšœ ˜ Kšœœ˜Kšœ˜Kšœœ˜Kšœ˜Kšœœ˜ Kšœ˜—Kšœœ˜2Kšœ˜Kšœ˜Kšœ*Οc˜@K˜šœœ˜Kšœœœœ˜4Kšœ œ˜Kšœ˜—Kšœ˜š˜Kš œ œ œœœ˜:—Kšœ˜š˜Kšœ œ˜—K˜—šž œ˜%Kšœœœ ˜˜:KšœŸ œ œ ˜?—Kšœœ˜ Kšœœœ˜Kšœœœ˜Kšœœœ˜IKšœœœ ˜OKšœN˜NKšœ*œ œ˜@šœ œœ˜Kšœ.œ˜CKšœ˜ —Kšœœ˜'š˜šœ˜šœ ˜Kšœ ˜ Kšœœ ˜—šœ ˜Kšœ˜Kšœœ ˜—šœ ˜ Kšœ˜Kšœ ˜—K˜——Kšœ˜Kšœ4˜4Kšœ˜Kšœ-™-šœ œ˜Kšœœ˜Kšœ ˜ Kšœœ˜Kšœ˜Kšœœ˜Kšœ˜Kšœœ˜ Kšœ˜—Kšœœ˜2Kšœ˜K˜šœœ˜Kšœœœœ˜4Kšœ œ˜ Kšœ˜—Kšœ˜Kšœ™šœ œ˜Kšœœ˜Kšœ ˜ Kšœœ˜Kšœ˜Kšœœ˜Kšœ˜Kšœœ˜ Kšœ˜—Kšœœ˜2Kšœ˜K˜šœœ˜Kšœœœœ˜4Kšœ œ˜ Kšœ˜—Kšœ˜š˜šœ ˜ Kš˜Kšœ œœœ˜0Kšœ˜——Kšœ˜Kšœ˜Kšœ ˜ Kšœœ˜K˜—Kšœb˜bKšœp˜pKšœl˜lKšœ˜——…—Φ h