// FtpMiscb.bcpl - miscellaneous subsystem-specific routines // Copyright Xerox Corporation 1979, 1980, 1981, 1982 // Last modifed February 14, 1982 5:16 PM by Boggs get "Pup0.decl" get "Pup1.decl" get "PupRTP.decl" get "FtpProt.decl" get "Disks.d" get "Streams.d" get "AltoDefs.d" get "AltoFileSys.d" external [ // outgoing procedures Title; OtherPup; PrintPort MakeNAMB; CloseLocalFile; FreePointer SysErr; Wss; SwappedOut // incoming procedures CallSwat; OsFinish Dequeue; Enqueue; Unqueue Zero; MoveBlock; ReadCalendar Resets; Puts; Closes; Dismiss; Block CharWidth; GetBitPos; SetBitPos; SetFont PutTemplate; WRITEUDT DoubleDifference; ExtendStackCall ExtractSubstring; Free; ReleasePBI // incoming statics userDsp; userSoc; userCtx; userFlag serverDsp; serverSoc; serverCtx; serverFlag telnetDsp; telnetSoc ctxQ; CtxRunning; pupRT; ndbQ; ftpDisk sysFont; sysZone; debugFlag // outgoing statics otherPupQ ] static otherPupQ manifest [ fcOK = 0 fcAbort = 1 ] //----------------------------------------------------------------------------------------- let Title(ctx) be //----------------------------------------------------------------------------------------- [ let boldFont = vec 1; boldFont = boldFont +2 boldFont!-2 = -1; boldFont!-1 = sysFont let lastTime, now = vec 1, vec 1 let show, noshow, prevDCB = ctx!3, ctx!4, (ctx!5)>>DS.ldcb [ ReadCalendar(now) if DoubleDifference(now, lastTime) ne 0 then [ Resets(noshow) PutTemplate(noshow, "- $PFTP$P of 11 Oct 82", SetFont, boldFont, SetFont, sysFont) FillWithDash(180, noshow) WRITEUDT(noshow, 0) FillWithDash(360, noshow) let ndb = ndbQ!0 PutTemplate(noshow, "[$O#$O#]", ndb>>NDB.localNet, ndb>>NDB.localHost) FillWithDash(490, noshow) PutTemplate(noshow, "$UD pages", ftpDisk>>DSK.diskKd>>KDH.freePages) FillWithDash(605, noshow) noshow>>DS.ldcb>>DCB.next = show>>DS.ldcb>>DCB.next prevDCB>>DCB.next = noshow>>DS.fdcb let temp = noshow; noshow = show; show = temp MoveBlock(lastTime, now, 2) ] Dismiss(20) if otherPupQ!0 ne 0 then [ let pbi = Dequeue(otherPupQ) let dsp, soc, df = 0, pbi>>PBI.socket, debugFlag if soc eq serverSoc then [ dsp = serverDsp; df = serverCtx>>FtpCtx.debugFlag ] if soc eq userSoc then [ dsp = userDsp; df = userCtx>>FtpCtx.debugFlag ] if soc eq telnetSoc then dsp = telnetDsp let startByte, type = 0, 0 switchon pbi>>PBI.pup.type into [ case typeAbort: [ type = "Abort" startByte = 3 endcase ] case typeError: [ if (soc>>RTPSoc.state eq stateAbort) % df then [ type = "Error" startByte = 25 ] endcase ] ] if dsp ne 0 & startByte ne 0 then [ PutTemplate(dsp, "*N$S Pup from $P: ", type, PrintPort, lv pbi>>PBI.pup.sPort) for i = startByte to pbi>>PBI.pup.length - pupOvBytes do Puts(dsp, pbi>>PBI.pup.bytes↑i) ] ReleasePBI(pbi) ] // Title (cont'd) if kbdAd!2 eq 177677b & (kbdAd!3 % 200b) eq 177773b then [ if userFlag then [ Unqueue(ctxQ, userCtx) FreePointer(lv userCtx>>FtpCtx.buffer) ] if serverFlag then [ Unqueue(ctxQ, serverCtx) FreePointer(lv serverCtx>>FtpCtx.buffer) ] Dismiss(25) ExtendStackCall(1000, OsFinish, fcAbort) ] ] repeat ] //----------------------------------------------------------------------------------------- and FillWithDash(end, stream) be //----------------------------------------------------------------------------------------- [ if (end-GetBitPos(stream)) gr CharWidth(stream, $*S) then Puts(stream, $*S) for i = 1 to (end-CharWidth(stream, $*S)-GetBitPos(stream))/ CharWidth(stream, $-) do Puts(stream, $-) SetBitPos(stream, end) ] //----------------------------------------------------------------------------------------- and OtherPup(pbi) be Enqueue(otherPupQ, pbi) //----------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------- and FreePointer(lvPointer, p2, p3, p4, p5; numargs na) be //----------------------------------------------------------------------------------------- [ for i = 0 to na-1 do [ let pointer = @(lv lvPointer + i) if @pointer ne 0 then [ Free(sysZone, @pointer) @pointer = 0 ] ] ] //----------------------------------------------------------------------------------------- and MakeNAMB(string) = valof //----------------------------------------------------------------------------------------- // Strips "<directory>" from front, and "!version" from end. // Returns a new string. [ let nbBegin = 1 for i = 1 to string>>String.length do if string>>String.char↑i eq $> then nbBegin = i+1 let nbEnd = string>>String.length for i = string>>String.length to 1 by -1 do [ let char = string>>String.char↑i if char ls $0 % char gr $9 then [ if char eq $! then nbEnd = i-1; break ] ] resultis ExtractSubstring(string, nbBegin, nbEnd) ] //----------------------------------------------------------------------------------------- and CloseLocalFile() be //----------------------------------------------------------------------------------------- [ if CtxRunning>>FtpCtx.diskStream ne 0 then Closes(CtxRunning>>FtpCtx.diskStream) CtxRunning>>FtpCtx.diskStream = 0 ] //----------------------------------------------------------------------------------------- and SysErr(p1, errNo, p2, p3, p4, p5) be //----------------------------------------------------------------------------------------- [ let t = p1; p1 = errNo; errNo = t (table [ 77403b; 1401b ])("Sys.Errors", lv p1) ] //----------------------------------------------------------------------------------------- and Wss(stream, string) be //OS copy JUNTAed away //----------------------------------------------------------------------------------------- for i = 1 to string>>String.length do Puts(stream, string>>String.char↑i) //----------------------------------------------------------------------------------------- and PrintPort(stream, port) be //----------------------------------------------------------------------------------------- PutTemplate(stream, "[$UO#$UO#$EUO]", port>>Port.net, port>>Port.host, lv port>>Port.socket) //----------------------------------------------------------------------------------------- and SwappedOut() be CallSwat("Non resident procedure called") //-----------------------------------------------------------------------------------------