// FtpRunInit.bcpl - initialization procedures for run file versions of Ftp // Copyright Xerox Corporation 1979, 1980, 1981 // Last modified October 2, 1982 12:27 AM by Boggs get "AltoFileSys.d" get "BcplFiles.d" get "Streams.d" get "SysDefs.d" external [ // outgoing procedures BeforeJuntaInit; Overlay InitSysFont; InitComCm; InitLog // incoming procedures Junta; AfterJunta; Ws CallSwat; MoveBlock; Allocate; Free OpenFile; Resets; Closes; Gets; Puts ReadBlock; FileLength; PositionPage; JumpToFa PutTemplate; WRITEUDT; CliGetString // outgoing statics hostName; logStream; overlayStream; tfsUnit // incoming statics fpSysFont; fpComCm; sysZone; sysFont; OsVersion; lvAbortFlag cli; cliStream; otherPupQ; userDsp protectedServer; overwriteServer; killServer debugFlag; tfsFlag; ramFlag userFlag; serverFlag; telnetFlag logFlag; errorFlag; cliFlag ] static [ hostName; logStream; overlayStream; tfsUnit = 0 ftpCFA; currentSegNum = 0 ] //----------------------------------------------------------------------------------------- let BeforeJuntaInit(blv, upe, cfa) be //----------------------------------------------------------------------------------------- [ @lvAbortFlag = @lvAbortFlag +1 if OsVersion ls 17 then [ Ws("*NYour OS is too old. Ftp requires OS 17 or greater") finish ] // overlay cfa compileif lCFA gr 9 then [ foo = nil ] ftpCFA = table [ 0; 0; 0; 0; 0; 0; 0; 0; 0 ] MoveBlock(ftpCFA, cfa, lCFA) // global switches let userMentioned, serverMentioned = false, false while upe!0 ne 0 do [ let length = upe>>UPE.length if upe>>UPE.type eq globalSwitches then [ let notFlag = false for i = 1 to length-1 do [ switchon upe!i into [ case $-: [ notFlag = not notFlag; loop ] case $A: case $a: [ logFlag = 1; endcase ] //append case $C: case $c: [ telnetFlag = not notFlag; endcase ] case $D: case $d: [ debugFlag = not notFlag; endcase ] case $E: case $e: [ errorFlag = not notFlag; endcase ] case $K: case $k: [ killServer = not notFlag; endcase ] case $L: case $l: [ logFlag = not notFlag; endcase ] //overwrite case $O: case $o: [ overwriteServer = not notFlag; endcase ] case $P: case $p: [ protectedServer = not notFlag; endcase ] case $R: case $r: [ ramFlag = not notFlag; endcase ] case $S: case $s: [ serverFlag = not notFlag serverMentioned = true endcase ] case $T: case $t: [ tfsFlag = not notFlag while i ne length-1 do [ let digit = upe!(i+1)-$0 if digit ls 0 % digit gr 7 break tfsUnit = tfsUnit lshift 3 + digit i = i+1 ] endcase ] case $U: case $u: [ userFlag = not notFlag userMentioned = true endcase ] ] notFlag = false ] ] upe = upe + length ] if tfsFlag then if userFlag & serverFlag then test serverMentioned ifso userFlag = false ifnot serverFlag = false Junta(levDisplay, AfterJunta) ] //----------------------------------------------------------------------------------------- and InitSysFont() be //----------------------------------------------------------------------------------------- [ let font = OpenFile("sysfont.al", ksTypeReadOnly, wordItem, 0, fpSysFont, 0, sysZone) if font eq 0 then CallSwat("Can't open sysfont.al") let lenFont = (FileLength(font)+1) rshift 1 sysFont = Allocate(sysZone, lenFont) Resets(font); ReadBlock(font, sysFont, lenFont); Closes(font) sysFont = sysFont +2 ] //----------------------------------------------------------------------------------------- and InitComCm() be //----------------------------------------------------------------------------------------- [ cliStream = OpenFile("Com.cm", ksTypeReadOnly, charItem, 0, fpComCm, 0, sysZone) if cliStream eq 0 then CallSwat("Can't open Com.cm") Free(sysZone, CliGetString(false)) //subsystem name hostName = CliGetString(false) //host name handled as a special case cli = CliGetString(false) //are there any more tokens? test cli ne 0 ifso cliFlag = true ifnot [ Closes(cliStream); cliStream = 0 ] ] //----------------------------------------------------------------------------------------- and InitLog() be //----------------------------------------------------------------------------------------- // open a typescript file on DP0 [ if cliFlag then unless logFlag do logFlag = true if logFlag then [ // if logFlag eq -1 then overwrite; if logFlag eq 1 then append logStream = OpenFile("Ftp.log", ksTypeWriteOnly, charItem) test logStream eq 0 ifso logFlag = false ifnot [ if logFlag eq 1 then FileLength(logStream) //position to end PutTemplate(logStream, "FTP log started $P*N*N", WRITEUDT, 0) ] ] ] //--------------------------------------------------------------------------- and Overlay(segNum) = valof //--------------------------------------------------------------------------- [ if overlayStream eq 0 then [ overlayStream = OpenFile(0, ksTypeReadOnly, wordItem, 0, ftpCFA) JumpToFa(overlayStream, lv ftpCFA>>CFA.fa) ] let codeArea = nil [ if segNum ls currentSegNum then CallSwat("Overlays out of order") let header = vec 15 PositionPage(overlayStream, ftpCFA>>CFA.fa.pageNumber) currentSegNum = currentSegNum +1 ReadBlock(overlayStream, header, 16) if currentSegNum eq segNum then [ //read in the segment codeArea = Allocate(sysZone, header>>BBHeader.codeLength) ReadBlock(overlayStream, codeArea, header>>BBHeader.codeLength) //fixup static pointers for i = 1 to Gets(overlayStream) do [ let addr = Gets(overlayStream) @addr = codeArea+Gets(overlayStream) ] ] ftpCFA>>CFA.fa.pageNumber = ftpCFA>>CFA.fa.pageNumber + (header>>BBHeader.fileLength + 255) rshift 8 ] repeatuntil currentSegNum eq segNum resultis codeArea ]