--LTScavengeImpl.mesa --Created by -- JFung.PASA 29-Sep-83 16:16:16 -- Modified version from VolumeInitImplA.mesa --last edited by JFung.PASA 4-Sep-84 15:34:24 DIRECTORY Cursor, Environment, File, Format, LispToolOps, OthelloDefs, PhysicalVolume, Process, Put, Scavenger, Space, Volume; LTScavengeImpl: PROGRAM IMPORTS Cursor, File, LispToolOps, OthelloDefs, Process, Put, Scavenger, Space, Volume EXPORTS LispToolOps SHARES File = --BEGIN OPEN ILT: LispToolOps, OthelloDefs, OthelloOps; BEGIN OPEN ILT: LispToolOps; debug: BOOLEAN ← FALSE; ScavengeProc: PUBLIC PROCEDURE [vName: LONG STRING] = BEGIN buffer: LONG POINTER TO ARRAY [0..Environment.wordsPerPage) OF UNSPECIFIED ← NIL; convert: BOOLEAN ← FALSE; logFile: File.File; logPage: File.PageNumber ← 0; logWd: CARDINAL ← Environment.wordsPerPage; volumeID: Volume.ID ← Volume.nullID; volumeOpen: BOOLEAN ← FALSE; GetWds: PROC [p: POINTER, c: CARDINAL] = BEGIN IF debug THEN { Put.Line[ILT.toolData.fileSW, "Enter GetWds..."L]; --Process.Pause[Process.SecondsToTicks[5]]; }; WHILE c # 0 DO IF logWd = Environment.wordsPerPage THEN BEGIN [] ← Space.CopyIn[buffer, [logFile, logPage, 1]]; logPage ← logPage + 1; logWd ← 0; END; p↑ ← buffer[logWd]; p ← p + 1; c ← c - 1; logWd ← logWd + 1; ENDLOOP END; -- GetWds DisplayScavLog: PROC = BEGIN fileCount: LONG CARDINAL; problems: BOOLEAN ← FALSE; hd: Scavenger.Header; GetWds[@hd, SIZE[Scavenger.Header]]; Put.Text[ILT.toolData.fileSW, " volume"L]; IF ~hd.repaired THEN Put.Text[ILT.toolData.fileSW, " not"L]; Put.Text[ILT.toolData.fileSW, " repaired, log file"L]; IF hd.incomplete THEN Put.Text[ILT.toolData.fileSW, " not"L]; Put.Line[ILT.toolData.fileSW, " complete "L]; fileCount ← hd.numberOfFiles; Put.Text[ILT.toolData.fileSW, " "L]; Put.LongNumber[ ILT.toolData.fileSW, fileCount, Format.DecimalFormat]; Put.Line[ILT.toolData.fileSW, " files on volume"L]; WHILE fileCount # 0 DO OpenID: TYPE = ARRAY [0..SIZE[File.ID]) OF CARDINAL; fe: Scavenger.FileEntry; GetWds[@fe, SIZE[Scavenger.FileEntry]]; THROUGH [0..fe.numberOfProblems) DO fp: Scavenger.Problem; GetWds[@fp, SIZE[Scavenger.Problem]]; Put.Char[ILT.toolData.fileSW, '[]; Process.Pause[Process.SecondsToTicks[5]]; FOR i: CARDINAL IN [0..SIZE[File.ID] - 1) DO Put.Octal[ ILT.toolData.fileSW, LOOPHOLE[fe.file, OpenID][ i]]; Put.Text[ILT.toolData.fileSW, ", "L]; ENDLOOP; Put.Octal[ ILT.toolData.fileSW, LOOPHOLE[fe.file, OpenID][ SIZE[File.ID] - 1]]; Put.Text[ILT.toolData.fileSW, "] type = "L]; BEGIN ENABLE File.Unknown => GOTO noType; f: File.Type = File.GetAttributes[ [fe.file, volumeID]].type; Put.LongDecimal[ ILT.toolData.fileSW, LONG[LOOPHOLE[f, CARDINAL]]]; EXITS noType => Put.Text[ILT.toolData.fileSW, "unknown"L]; END; Put.Text[ILT.toolData.fileSW, "; "L]; WITH fp SELECT FROM unreadable => BEGIN Put.Text[ ILT.toolData.fileSW, "unreadable pages ["L]; Put.LongDecimal[ILT.toolData.fileSW, first]; Put.Text[ILT.toolData.fileSW, ".."L]; Put.LongDecimal[ ILT.toolData.fileSW, first + count]; Put.Line[ILT.toolData.fileSW, ")"L]; END; missing => BEGIN Put.Text[ ILT.toolData.fileSW, "missing pages ["L]; Put.LongDecimal[ILT.toolData.fileSW, first]; Put.Text[ILT.toolData.fileSW, ".."L]; Put.LongDecimal[ ILT.toolData.fileSW, first + count]; Put.Line[ILT.toolData.fileSW, ")"L]; END; duplicate => Put.Line[ ILT.toolData.fileSW, "duplicate page found"L]; orphan => Put.Line[ ILT.toolData.fileSW, "orphan page found"L]; ENDCASE => Put.Line[ ILT.toolData.fileSW, "unknown problem"L]; IF debug THEN Process.Pause[Process.SecondsToTicks[5]]; problems ← TRUE; ENDLOOP; fileCount ← fileCount - 1; ENDLOOP; IF ~problems THEN Put.Line[ILT.toolData.fileSW, " No problems found"L]; IF debug THEN Process.Pause[Process.SecondsToTicks[5]]; END; --DisplayScavLog IF debug THEN { Put.Line[ILT.toolData.fileSW, "Enter ScavengeProc..."L]; Process.Pause[Process.SecondsToTicks[5]]; Put.LongString[ILT.toolData.fileSW, vName]; Put.CR[ILT.toolData.fileSW]; }; [volumeID, volumeOpen] ← ILT.GetVolumeID[vName]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "volumeOpened..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; IF ~volumeOpen THEN RETURN; --MyNameIs[myNameIs: "Scavenge"L, myHelpIs: "Scavenge Logical Volume"L]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Volume.Close..."L]; --Process.Pause[Process.SecondsToTicks[5]]; }; Volume.Close[volumeID ! ANY => CONTINUE]; Put.Text[ILT.toolData.fileSW, " Scavenging..."L]; Cursor.Set[hourGlass]; BEGIN ENABLE Scavenger.Error => IF error = needsConversion AND ~convert THEN IF (convert ← OthelloDefs.Yes[ "That volume is not in the current format. Do you want to convert it? "L]) THEN {OthelloDefs.Confirm[twice]; RETRY} ELSE OthelloDefs.AbortingCommand["Volume cannot be scavenged"L]; logFile ← Scavenger.Scavenge[volumeID, volumeID, safeRepair, convert]; Put.Line[ILT.toolData.fileSW, "Done"L]; END; Cursor.Set[textPointer]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Volume.Open..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; Volume.Open[volumeID]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "DisplayScavLog..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; buffer ← Space.ScratchMap[1]; DisplayScavLog[ ! UNWIND => {[] ← Space.Unmap[buffer]; Volume.Close[volumeID]}]; -- DisplayScavLog[]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Unmap..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; [] ← Space.Unmap[buffer]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Volume.Close..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; Volume.Close[volumeID]; END; --ScavengeProc END.....