<> <> <> DIRECTORY Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, Failed, Parse], FSPseudoServers USING [GetPseudoServers, PseudoServerList, PseudoServerRep, SetPseudoServers], IO USING [PutFR, PutRope, STREAM], Rope USING [Equal, Fetch, Length, ROPE], UserProfile USING [Token]; PseudoServerCommandsImpl: CEDAR PROGRAM IMPORTS Commander, CommandTool, IO, FSPseudoServers, Rope, UserProfile = BEGIN LORA: TYPE = LIST OF REF ANY; ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; PseudoServerAddCommand: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL]>> <> argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd: cmd ! CommandTool.Failed => {msg _ errorMsg; GO TO failed}]; ProcessSwitches: PROC [arg: ROPE] = { sense: BOOL _ TRUE; direction: {up, down} _ down; FOR index: INT IN [0..Rope.Length[arg]) DO SELECT Rope.Fetch[arg, index] FROM '~ => {sense _ NOT sense; LOOP}; 'r, 'R => rec.avoidCheck _ sense; ENDCASE; sense _ TRUE; ENDLOOP; }; which: {server, writer, reader} _ server; rec: FSPseudoServers.PseudoServerRep _ [NIL, FALSE, NIL, NIL]; serverList: FSPseudoServers.PseudoServerList _ FSPseudoServers.GetPseudoServers[]; ProcessSwitches[UserProfile.Token["PseudoServerAddCommand.DefaultSwitches"]]; FOR i: NAT IN [1..argv.argc) DO arg: ROPE = argv[i]; IF Rope.Length[arg] = 0 THEN LOOP; IF Rope.Fetch[arg, 0] = '- THEN { <> ProcessSwitches[arg]; LOOP; }; <> SELECT which FROM server => { rec.server _ arg; which _ writer; }; writer => { rec.write _ arg; which _ reader; }; ENDCASE => { <> new: LIST OF ROPE _ LIST[arg]; old: LIST OF ROPE _ rec.read; IF old = NIL THEN rec.read _ new ELSE { DO IF old.rest = NIL THEN {old.rest _ new; EXIT}; old _ old.rest; ENDLOOP; }; }; ENDLOOP; IF rec.server = NIL THEN { <> msg _ "Usage: server writer readers ..."; GO TO failed; }; FOR each: FSPseudoServers.PseudoServerList _ serverList, each.rest WHILE each # NIL DO IF Rope.Equal[each.first.server, rec.server, FALSE] THEN { each.first _ rec; IF rec.write = NIL AND rec.read = NIL THEN { <> each.first.server _ NIL; msg _ IO.PutFR["'%g' deleted from pseudo server list.", [rope[rec.server]]]; RETURN; }; each.first _ rec; msg _ IO.PutFR["'%g' updated in pseudo server list.", [rope[rec.server]]]; RETURN; }; ENDLOOP; <> IF rec.write = NIL AND rec.read = NIL THEN { msg _ IO.PutFR["'%g' not in pseudo server list.", [rope[rec.server]]]; } ELSE { FSPseudoServers.SetPseudoServers[CONS[rec, serverList]]; msg _ IO.PutFR["'%g' added to pseudo server list.", [rope[rec.server]]]; }; EXITS failed => {result _ $Failure}; }; PseudoServerPrintCommand: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL]>> <> serverList: FSPseudoServers.PseudoServerList _ FSPseudoServers.GetPseudoServers[]; out: STREAM = cmd.out; PutName: PROC [name: ROPE] = { IO.PutRope[out, " "]; IF Rope.Length[name] = 0 THEN IO.PutRope[out, "$"] ELSE IO.PutRope[out, name]; }; FOR each: FSPseudoServers.PseudoServerList _ serverList, each.rest WHILE each # NIL DO IF each.first.server = NIL THEN LOOP; IO.PutRope[out, " "]; PutName[each.first.server]; IF each.first.avoidCheck THEN PutName[" -r"]; PutName[each.first.write]; FOR readers: LIST OF ROPE _ each.first.read, readers.rest WHILE readers # NIL DO PutName[readers.first]; ENDLOOP; IO.PutRope[out, "\n"]; ENDLOOP; }; docAdd: ROPE = "add pseudo-server translation\n\t-r: assume replicated files (avoid remote check)"; docPrint: ROPE = "print pseudo-server translations"; Commander.Register[key: "///Commands/PSAdd", proc: PseudoServerAddCommand, doc: docAdd]; Commander.Register[key: "///Commands/PseudoServerAdd", proc: PseudoServerAddCommand, doc: docAdd]; Commander.Register[key: "///Commands/PSPrint", proc: PseudoServerPrintCommand, doc: docPrint]; Commander.Register[key: "///Commands/PseudoServerPrint", proc: PseudoServerPrintCommand, doc: docPrint]; END. <<>>