WhoIs.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Hal Murray May 16, 1985 3:20:40 am PDT
DIRECTORY
Commander USING [CommandProc, Register],
CommandTool USING [ArgumentVector, Failed, Parse],
IO USING [Close, EndOf, EndOfStream, Error, Flush, GetChar, PutF, PutChar, PutRope, rope, STREAM],
Rope USING [ROPE],
IP USING [Address],
IPName USING [NameToAddress],
TCP USING [AbortTCPStream, CreateTCPStream, Error, neverTimeout, Timeout, WaitForListenerOpen];
WhoIs: CEDAR PROGRAM
IMPORTS Commander, CommandTool, IO, IPName, TCP =
BEGIN
whoIsSocket: INT = 43;
serverName: Rope.ROPE = "SRI-NIC.ARPA";
DoIt: Commander.CommandProc = {
out: IO.STREAM ← cmd.out;
argv: CommandTool.ArgumentVector = CommandTool.Parse[cmd !
CommandTool.Failed => {out.PutRope[errorMsg]; GOTO CantParse}];
server: IO.STREAM;
where: LIST OF IP.Address;
name: Rope.ROPE;
IF argv.argc > 1 THEN name ← argv[1] ELSE name ← "Xerox";
where ← IPName.NameToAddress[serverName];
IF where = NIL THEN {
out.PutF["Can't lookup IP Address for %G.\n", IO.rope[serverName]];
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: whoIsSocket,
active: TRUE,
timeout: 120000]];
TCP.WaitForListenerOpen[server, TCP.neverTimeout];
server.PutRope[name];
server.PutRope["\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;
EXITS CantParse => NULL; };
Commander.Register[key: "WhoIs", proc: DoIt, doc: "Poke WhoIs server at NIC"];
END.