// RemoteVMemInit.bcpl - handles pulling in remote sysout // Last change November 30, 1981 9:59 PM by Bill van Melle // Last change September 6, 1981 3:34 PM by Bill van Melle get "LispBcpl.decl" get "VMem.decl" get "Pup.decl" get "FtpProt.decl" get "AltoDefs.d" external [ // procedure defined here RemoteInitVmem // from RemoteVmemInit1.bcpl Retrieve; Wss; FixPassword // O.S. procedures CallSwat; Allocate; Free; InitializeZone; Zero; Puts CreateDisplayStream; ShowDisplayStream; Wc; Ws OpenFileFromFp; Closes // from Raid ReadStrng // misc procedures used IndexedPageIO; LoadIPage Enqueue; InitializeContext; CallContextList ExtractSubstring // pup procs GetPartner; OpenLevel1Socket; InitPupLevel1; DestroyPupLevel1 InitFtpUtil; InitFtpPList; OpenRTPSocket; CreateBSPStream UserOpen; InitPList; UserRetrieve; FreePList; UserClose // statics used dsp UserName; UserPassword; CtxRunning // statics defined SysinName; sysZone; VMStream; sysoutHost ] static [ SysinName; done; sysZone; VMStream; sysoutHost ] manifest [ myBufferSize = WordsPerPage*6 myZoneSize = 7000 + myBufferSize lenDSPBlock = lDCB*2 + (380*3)/2 firstMouseX = 260 firstMouseY = 50 lastMouseY = 800 ] structure String: [ length byte; char^1,255 byte ] let RemoteInitVmem (filename, VMemID) be [ SysinName = filename let zone = vec myZoneSize // make local sysZone that goes away when we finish let oldSysZone = sysZone sysZone = InitializeZone(zone, myZoneSize) let ctxQ = vec 1 ctxQ!0 = 0 // make a context queue InitFtpUtil() InitFtpPList() InitPupLevel1 (sysZone, ctxQ, 10) Enqueue(ctxQ, InitializeContext (Allocate(sysZone, 1000), 1000, FTPGuy, lenExtraCtx)) VMStream = OpenFileFromFp (VMemID) done = false CallContextList (ctxQ!0) repeatuntil done DestroyPupLevel1() Closes (VMStream) sysZone = oldSysZone ] and FTPGuy (ctx) be [ Zero(lv ctx>>FtpCtx.bspSoc, lenFTPI) // clear out extra ctx stuff @mouseX, @mouseY = firstMouseX, firstMouseY let oldCursorBitMap = vec 15 for i = 0 to 15 do oldCursorBitMap!i = cursorBitMap!i // save cursor for i = 0 to 7 do cursorBitMap!i = #177400 for i = 8 to 15 do cursorBitMap!i = #377 // show ftp cursor dsp = CreateDisplayStream (2, Allocate(sysZone, lenDSPBlock), lenDSPBlock) ShowDisplayStream (dsp, DSalone) let fport = vec lenPort let host = vec 20 let i = 2 let ch = SysinName>>String.char^1 let namelen = SysinName>>String.length // first parse SysinName. Extract hostname if ch ne ${ & ch ne $[ then [ CallSwat ("Illegal SYSIN name", SysinName); return ] [ ch = SysinName>>String.char^i if ch eq $} % ch eq $] then break host>>String.char^(i-1) = SysinName>>String.char^i i = i+1 if i ge namelen then [ CallSwat ("Illegal SYSIN name", SysinName); return ] ] repeat host>>String.length = i-2 unless GetPartner (host, dsp, fport, 0, socketFTP) do CallSwat ("No such host", host) sysoutHost = host // So Retrieve can get it let soc = Allocate(sysZone, lenBSPSoc) OpenLevel1Socket (soc, 0 , fport) // open socket to partner unless OpenRTPSocket (soc) // establish connection with ftp server do CallSwat ("Can't open FTP connection") ctx>>FtpCtx.bspStream = CreateBSPStream (soc) ctx>>FtpCtx.bspSoc = soc ctx>>FtpCtx.dspStream = dsp ctx>>FtpCtx.buffer = Allocate(sysZone, myBufferSize) ctx>>FtpCtx.bufferLength = myBufferSize ctx>>FtpCtx.debugFlag = false unless UserOpen (Version) do CallSwat ("UserOpen failed") let localPL = InitPList() localPL>>PL.SFIL = ExtractSubstring(SysinName, i+1) localPL>>PL.UNAM = UserName localPL>>PL.UPSW = UserPassword [ let mark = UserRetrieve (localPL, Retrieve) if mark eq markEndOfCommand then break let code = mark<>FtpCtx.getCmdString) ] repeat UserClose() for i = 0 to 15 do cursorBitMap!i = oldCursorBitMap!i // restore cursor ShowDisplayStream (dsp, DSdelete) dsp = 0 done = true ] and Version (stream, nil) be Wss(stream, "Lisp FTP User")