// FtpCli2.bcpl // Copyright Xerox Corporation 1979, 1980, 1981, 1982 // Last modified July 20, 1982 5:35 PM by Boggs get "FtpProt.decl" get "FtpUser.decl" get "AltoFileSys.d" get "Streams.d" external [ // outgoing procedures CliDelete; CliRename; CliCompare; CliList // incoming procedures from FtpCliUtil CliSwitches; BadSwitch; IsCommand CliGetString; CliConfirm; CliError // incoming procedures from FtpUserProt UserDelete; UserRename; UserRetrieve; UserDirectory // incoming procedures from FtpUtil FileType; CompareNetWithDisk // incoming procedures from FtpPlist FreePList; InitPList; WritePTV // incoming procedures from FtpMisc ProcessNoCode; CloseLocalFile; FreePointer // incoming misc procedures ListPrint; ListPuts ExtractSubstring; PutTemplate; Wss; Puts Zero; SetBlock; Free; SysErr; OpenFile // incoming statics sysZone; ftpDisk; CtxRunning defaultPL; userDsp; cli; listST selective; verify; dates ] structure String [ length byte; char↑1,1 byte ] //----------------------------------------------------------------------------------------- let CliDelete() be //----------------------------------------------------------------------------------------- [ dates, verify = false, false CliSwitches() let firstTime = true [ cli = CliGetString(false); if IsCommand() return unless firstTime do Wss(userDsp, "*N**Delete ") firstTime = false PutTemplate(userDsp, "remote file $S", cli) let localPL = InitPList(defaultPL) localPL>>PL.SFIL = cli; cli = 0 localPL>>PL.DPRP.SFIL = true if dates then localPL>>PL.DPRP.CDAT = true let mark = nil [ mark = UserDelete(localPL, CliDeleteFile) if mark<<Mark.mark eq markEndOfCommand break test mark<<Mark.mark eq markNo ifso if ProcessNoCode(mark<<Mark.subCode, localPL) loop ifnot CliError(" - command failed") break ] repeat FreePList(localPL) if mark eq 0 return //catastrophic error ] repeat ] //----------------------------------------------------------------------------------------- and CliDeleteFile(remotePL, localPL) = valof //----------------------------------------------------------------------------------------- [ PutTemplate(userDsp, "*NDelete $S", (remotePL>>PL.SFIL? remotePL>>PL.SFIL, remotePL>>PL.NAMB)) if dates then PutTemplate(userDsp, " [$P]", WritePTV, lv remotePL>>PL.CDAT) let doit = verify? CliConfirm(), true unless doit do Wss(userDsp, " - Not deleted") resultis doit ] //----------------------------------------------------------------------------------------- and CliCompare() be //----------------------------------------------------------------------------------------- [ selective = false CliSwitches() let firstTime = true [ cli = CliGetString(false) if IsCommand() return unless firstTime do Wss(userDsp, "*N**Compare ") firstTime = false PutTemplate(userDsp, "remote file $S", cli) let localPL = InitPList(defaultPL) localPL>>PL.SFIL = cli; cli = 0 localPL>>PL.DPRP.SFIL = true localPL>>PL.DPRP.NAMB = true localPL>>PL.DPRP.TYPE = true localPL>>PL.DPRP.BYTE = true let mark = nil [ mark = UserRetrieve(localPL, CliCompareWantFile, CloseLocalFile) if mark<<Mark.mark eq markEndOfCommand break test mark<<Mark.mark eq markNo ifso if ProcessNoCode(mark<<Mark.subCode, localPL) loop ifnot CliError(" - command failed") break ] repeat CloseLocalFile() FreePList(localPL) if mark eq 0 % (selective & mark ne markEndOfCommand) break ] repeat ] //----------------------------------------------------------------------------------------- and CliCompareWantFile(remotePL, localPL) = valof //----------------------------------------------------------------------------------------- [ if remotePL>>PL.NAMB eq 0 resultis false cli = selective? CliGetString(), ExtractSubstring(remotePL>>PL.NAMB) PutTemplate(userDsp, "*N$S with local file $S", (remotePL>>PL.SFIL? remotePL>>PL.SFIL, remotePL>>PL.NAMB), cli) CtxRunning>>FtpCtx.diskStream = OpenFile(cli, ksTypeReadOnly, charItem, 0, 0, 0, 0, 0, ftpDisk) FreePointer(lv cli) test CtxRunning>>FtpCtx.diskStream eq 0 ifso [ CliError(" - No such file"); resultis false ] ifnot [ Puts(userDsp, $*N); resultis CompareNetWithDisk ] ] //---------------------------------------------------------------------------------------- and CliList() be //---------------------------------------------------------------------------------------- [ let options, length = 1b15 rshift offset DPRP.SFIL, cli>>String.length+1 for i = 1 to cli>>String.char↑length do options = options % selecton cli>>String.char↑(length+i) into [ case $A: case $a: lbAuthor case $C: case $c: case $-: 0 case $D: case $d: lbCreate case $E: case $e: lbEverything case $L: case $l: lbLength case $R: case $r: lbRead case $T: case $t: lbType case $V: case $v: lbVerbose case $W: case $w: lbWrite default: valof [ BadSwitch(i); resultis 0 ] ] FreePointer(lv cli) let v = vec lST; listST = v; SetBlock(listST, SysErr, lST) listST>>ST.puts = ListPuts listST>>ST.par1 = options listST>>ST.par3 = true let firstTime = true [ cli = CliGetString(false); if IsCommand() return unless firstTime do Wss(userDsp, "*N**List ") firstTime = false PutTemplate(userDsp, "remote files matching $S", cli) let localPL = InitPList(defaultPL) localPL>>PL.DPRP = options if localPL>>PL.DPRP.TYPE then localPL>>PL.DPRP.BYTE = true localPL>>PL.SFIL = cli; cli = 0 let mark = nil [ mark = UserDirectory(localPL, ListPrint) if mark<<Mark.mark eq markEndOfCommand break test mark<<Mark.mark eq markNo ifso if ProcessNoCode(mark<<Mark.subCode, localPL) loop ifnot CliError(" - command failed") break ] repeat FreePList(localPL) if mark eq 0 return //catastrophic error ] repeat ] //----------------------------------------------------------------------------------------- and CliRename() be //----------------------------------------------------------------------------------------- [ FreePointer(lv cli); cli = CliGetString() if IsCommand() return let oldName = cli; cli = CliGetString() if IsCommand() then [ Free(sysZone, oldName); return ] PutTemplate(userDsp, "remote file $S to be $S", oldName, cli) let oldPL = InitPList(defaultPL) oldPL>>PL.SFIL = oldName let newPL = InitPList(defaultPL) newPL>>PL.SFIL = cli; cli = 0 [ let mark = UserRename(oldPL, newPL) if mark<<Mark.mark eq markYes break test mark<<Mark.mark eq markNo ifso if ProcessNoCode(mark<<Mark.subCode, oldPL) loop ifnot CliError(" - command failed") break ] repeat FreePList(oldPL) FreePList(newPL) ]