// IfsScavPass2.bcpl // Copyright Xerox Corporation 1980 // Last modified November 16, 1980 2:38 PM by Boggs get "IfsScavenger.decl" get "CmdScan.decl" external [ // outgoing procedures Pass2 // incoming procedures Pass2Phase1; Pass2Phase2; Pass2Phase3; Scratch PutTemplate; Ws; Wss; ScavConfirm Gets; Errors; Closes; OpenFile; ReadBlock TFSInit; OpenDisk; CloseDisk OpenLPT; CloseLPT; GetLptFs; GetLptHome MultEq; IFSError; Free; Dequeue; UnsnarfBuffer // outgoing statics tree // incoming statics sysZone; keys; dsp; debugFlag; initLptFlag scratchDisk; scavDisk; pass; lpt; tfsDDMgr ] static tree //--------------------------------------------------------------------------- let Pass2(buffPtr, numBuffs) be //--------------------------------------------------------------------------- [ pass, scavDisk, lpt = 2, 0, 0 let ok, fsAndDrive = true, -1 if initLptFlag then [ Ws("*NI Haven't scanned any packs yet.") test ScavConfirm("*NDo you want to re-use an old lpt? ") ifso initLptFlag = false ifnot ok = false ] if ok & scratchDisk eq 0 then unless Scratch(nil) do ok = false if ok then [ lpt = OpenLPT("IfsScavenger.lpt", false) let fsAndDrive = GetLptFs(lpt)!0 ok = valof [ //repeat test fsAndDrive eq -1 ifso [ scavDisk = OpenDisk("*NWhere is logical unit 0? ") if scavDisk eq 0 resultis false ] ifnot [ scavDisk = TFSInit(sysZone, true, fsAndDrive, tfsDDMgr) if scavDisk eq 0 then [ fsAndDrive = -1; loop ] ] let ifsHome = OpenFile("Ifs.home", 0, 0, 0, 0, 0, 0, 0, scavDisk) if ifsHome eq 0 then [ scavDisk = CloseDisk(scavDisk, true) test fsAndDrive eq -1 ifso Ws("*NI Can't open Ifs.home on that pack.") ifnot fsAndDrive = -1 loop ] let home = vec lenHome ReadBlock(ifsHome, home, lenHome) Closes(ifsHome) let lptHome = GetLptHome(lpt) test home>>Home.thisUnit eq 0 & MultEq(lv home>>Home.created, lv lptHome>>Home.created) ifso resultis true ifnot [ scavDisk = CloseDisk(scavDisk, true) test fsAndDrive eq -1 ifso Ws("*NThat pack is not logical unit 0.") ifnot fsAndDrive = -1 ] ] repeat ] // Finally ready to get down to work if ok then ok = Pass2Phase1(buffPtr, numBuffs) for i = 0 to numBuffs-1 do UnsnarfBuffer(buffPtr+i*256) if ok then ok = Pass2Phase2() if ok then ok = Pass2Phase3() // clean up and go away if scavDisk ne 0 then scavDisk = CloseDisk(scavDisk, true) if lpt ne 0 then lpt = CloseLPT(lpt, ok) if ok then Ws("*NPass2 complete*N") ]