// IfsTelnetList.bcpl -- IFS server telnet List command // Copyright Xerox Corporation 1979, 1981, 1982 // Last modified May 15, 1982 11:04 AM by Taft get "Ifs.decl" get "IfsFiles.decl" get "IfsDirs.decl" get "IfsRs.decl" get "IfsTelnet.decl" external [ // outgoing procedures ExecList; ListProtection; ListOneProt // incoming procedures CollectListSubcommands; ListHeaders CollectFilenames; NextFile; DestroyFGD; Subcommands WhatChanged; PrintSubFilename; GetGroupName TelnetAborting; LockTransferLeaderPage; GetBufferForFD; DestroyFD UNPACKDT; MONTHNAME; ExtractSubstring; Mul; Div32x16 SysAllocateZero; SysFree; FreePointer; Zero; MoveBlock; DoubleAdd Puts; Ws; Wss; Wns; PutTemplate; GetBit // incoming statics dsp ] //--------------------------------------------------------------------------- let ExecList(cs, fs) be //--------------------------------------------------------------------------- // List <file-designators> [, <subcommands> ] // Note: fs = 0 when called as top-level List command (by virtue of the // top-level TelnetCommandLoop being called with arg = 0). // fs = an auxiliary file system when called as Backup List command. [ Wss(cs, " (files) ") let fgd = CollectFilenames(cs, lcVAll+lcMultiple, 0, true, fs) let options = (Subcommands(fgd)? CollectListSubcommands(), 0) if options ne 0 then ListHeaders(options) let lastFD = SysAllocateZero(lenFD) let buf = 0 let files = 0 let pages = vec 1 Zero(pages, 2) until TelnetAborting() do [ let fd = NextFile(fgd) if fd eq 0 break if options ne 0 then [ buf = GetBufferForFD(fd) unless LockTransferLeaderPage(fd, buf) eq 0 do [ SysFree(buf); loop ] ] files = files+1 // ExecList (cont'd) switchon WhatChanged(fd, lastFD) into [ case 0: //directory changed Puts(dsp, $*n); PrintSubFilename(dsp, fd, 1, fd>>FD.lenSubDirString) case 1: //name body changed [ Ws("*n ") let length = fd>>FD.dr>>DR.pathName.length PrintSubFilename(dsp, fd, fd>>FD.lenSubDirString+1) if options ne 0 then [ for i = length-fd>>FD.lenSubDirString to 20 do Puts(dsp, $*s) if (options&listType) ne 0 then PutTemplate(dsp, selecton buf>>ILD.type into [ case ftText: " Text " case ftBinary: " B($2D)" default: " ?? " ], buf>>ILD.byteSize) if (options&listLength) ne 0 then [ let fileLength = vec 1 test buf>>ILD.hintLastPageFa.pageNumber eq 0 ifso Zero(fileLength, 2) ifnot [ Mul(buf>>ILD.hintLastPageFa.charPos, buf>>ILD.hintLastPageFa.pageNumber-1, 2*fd>>FD.fs>>IFS.pageLength, fileLength) if buf>>ILD.byteSize gr 0 then Div32x16(fileLength, (buf>>ILD.byteSize+7) rshift 3) ] PutTemplate(dsp, " $7ED", fileLength) ] let p = vec 1 p!0, p!1 = 0, buf>>ILD.hintLastPageFa.pageNumber+1 DoubleAdd(pages, p) if (options&listSize) ne 0 then PutTemplate(dsp, " $3ED", p) if (options&listCreation) ne 0 then ListDate(lv buf>>ILD.created, options) if (options&listWrite) ne 0 then ListDate(lv buf>>ILD.written, options) if (options&listRead) ne 0 then ListDate(lv buf>>ILD.read, options) if (options&listBackup) ne 0 then test buf>>ILD.noBackup ifso Ws((options&listTimes) eq 0? " No Backup", " No Backup ") ifnot ListDate(lv buf>>ILD.backedUp, options) if (options&listAuthor) ne 0 then PutTemplate(dsp, " $S", lv buf>>ILD.author) if (options&listProtection) ne 0 then ListProtection(lv buf>>ILD.fileProt) if buf>>ILD.damaged then Ws(" ****** Damaged ******") ] endcase ] case 2: //version changed if options ne 0 then docase 1 PutTemplate(dsp, ", $UD", fd>>FD.version) endcase ] FreePointer(lv buf) ] // ExecList (cont'd) DestroyFD(lastFD) DestroyFGD(fgd) test options eq 0 ifso if files ge 10 then PutTemplate(dsp, "*nTotal of $D files.", files) ifnot if files ge 2 then PutTemplate(dsp, "*nTotal of $ED pages in $D files.", pages, files) ] //--------------------------------------------------------------------------- and ListDate(date, options) be //--------------------------------------------------------------------------- [ test date!0 eq 0 & date!1 eq 0 ifnot [ let uv = vec 6 UNPACKDT(date, uv) let month = vec 1 MoveBlock(month, MONTHNAME(uv!1), 2) month>>String.length = 3 PutTemplate(dsp, " $2D-$S-$2F0D", uv!2, month, uv!0 rem 100) if (options&listTimes) ne 0 then PutTemplate(dsp, " $2F0D:$2F0D", uv!3, uv!4) ] ifso [ Ws(" --- ") if (options&listTimes) ne 0 then Ws(" ") ] ] //--------------------------------------------------------------------------- and ListProtection(fileProt) be //--------------------------------------------------------------------------- [ Ws(" R:") ListOneProt(lv fileProt>>FileProt.readProt) Ws("; W:") ListOneProt(lv fileProt>>FileProt.writeProt) Ws("; A:") ListOneProt(lv fileProt>>FileProt.appendProt) ] //--------------------------------------------------------------------------- and ListOneProt(prot) be //--------------------------------------------------------------------------- [ for i = 0 to lenProtection-1 do if prot!i ne 0 then [ for group = 0 to size Protection-1 do if GetBit(prot, group) then [ Puts(dsp, $*s) let name = GetGroupName(group) test name eq 0 ifso Wns(dsp, group) ifnot [ Ws(name); SysFree(name) ] ] return ] Ws(" None") ]