--LTInstallImpl.mesa --Created by -- JFung.PASA 22-Sep-83 10:21:23 -- This is a modified version taken from InstallMuImpl.mesa --last edited by -- JFung.PASA 10-Sep-84 10:43:52 DIRECTORY Ascii, Display, Environment USING [bytesPerPage, PageCount, PageOffset], File USING [ Create, Delete, File, GetAttributes, GetSize, MakePermanent, nullFile, PageCount, PageNumber, SetSize, Unknown], FileName: TYPE USING [AllocVFN, FreeVFN, NormalizeVFN, UnpackFilename, VFN], FileTransfer, FileTypes USING [tUntypedFile], FormSW, Heap, Inline USING [LowHalf], LispToolOps, NSName USING [maxFullNameLength], OthelloDefs, OthelloOps USING [ GetPhysicalVolumeBootFile, GetVolumeBootFile, MakeBootable, MakeUnbootable, SetPhysicalVolumeBootFile, SetVolumeBootFile, VoidPhysicalVolumeBootFile, VoidVolumeBootFile], PhysicalVolume USING [GetContainingPhysicalVolume, ID], Process USING [Pause, SecondsToTicks], PrincOps USING [Port], Put, Space USING [ Access, Allocate, CopyOut, Deallocate, InsufficientSpace, Interval, Map, nullInterval, PageCount, PageOffset, SwapUnitSize, Unmap, virtualMemory, Window], Stream, String, TemporaryBooting USING [InvalidParameters], Time, ToolWindow, UserInput, Volume, Window; LTInstallImpl: PROGRAM IMPORTS File, FileName, FileTransfer, FormSW, Heap, Inline, LispToolOps, OthelloOps, PhysicalVolume, Process, Put, Space, Stream, String, TemporaryBooting, Time, UserInput, Volume, Window EXPORTS LispToolOps = BEGIN OPEN FileName, ILT: LispToolOps; PortRep: TYPE = PrincOps.Port; buffer: LONG POINTER ← NIL; byteCount: LONG INTEGER ← 0; conn: FileTransfer.Connection; debug: BOOLEAN ← FALSE; defaultVMemSize: File.PageCount; file: File.File; fileName: LONG STRING ← NIL; firstPage: File.PageNumber; freePages: Volume.PageCount; indicatorBox: Window.Box = [[10, 10], [16, 16]]; readStream: Stream.Handle ← NIL; --spaceInterval: Space.Interval ← Space.nullInterval; vfn: VFN ← NIL; volumeID: Volume.ID ← Volume.nullID; volumeOpen: BOOLEAN ← FALSE; volSize: Volume.PageCount; CheckForAbort: FileTransfer.CheckAbortProc = BEGIN IF UserInput.UserAbort[ILT.windowHandle] THEN BEGIN ILT.toolData.busy ← FALSE; Put.Line[ILT.toolData.msgSW, "+++Aborted.. "L]; Cleanup[]; ILT.DisplayCommandSubwindow; --Process.Pause[Process.SecondsToTicks[10]]; DisplayOldVMemSize; RETURN[TRUE]; END ELSE RETURN[FALSE]; END; Cleanup: PROC = BEGIN IF debug THEN { Put.Line[ILT.toolData.fileSW, "Enter Cleanup....."L]; Process.Pause[Process.SecondsToTicks[5]]; }; IF readStream # NIL THEN {readStream.Delete[]; readStream ← NIL;}; IF buffer # NIL THEN buffer ← Space.Unmap[buffer]; IF vfn # NIL THEN {FreeVFN[vfn]; vfn ← NIL}; IF conn # NIL THEN {conn.Destroy[]; conn ← NIL}; END; CloseVolume: PROC = BEGIN IF volumeOpen THEN {Volume.Close[volumeID]; volumeOpen ← FALSE} END; DisplayOldVMemSize: PROC = BEGIN size: File.PageCount; size ← ILT.GetFileSize[]; ILT.DisplayFileSize[size]; END; ExpandVMemSize: PROC [] = BEGIN fileSize: File.PageCount; [volSize, freePages] ← Volume.GetAttributes[volumeID]; fileSize ← IF ILT.toolData.vMemSize = 0 THEN volSize ELSE ILT.toolData.vMemSize; File.SetSize[ file, fileSize ! Volume.InsufficientSpace => { IF debug THEN { Put.Text[ILT.toolData.fileSW, "Can not set VMem at "L]; Put.LongDecimal[ILT.toolData.fileSW, fileSize]; Put.Line[ILT.toolData.fileSW, " pages; retrying..."L];}; fileSize ← fileSize - 100; RETRY; }]; [volSize, freePages] ← Volume.GetAttributes[volumeID]; fileSize ← fileSize + freePages; File.SetSize[ file, fileSize ! Volume.InsufficientSpace => { fileSize ← fileSize - 10; RETRY; }]; [volSize, freePages] ← Volume.GetAttributes[volumeID]; ILT.toolData.vMemSize ← fileSize; ILT.toolData.currentVolFreeSize ← freePages; -- re-display vMem and free size FormSW.DisplayItem[ILT.toolData.paramSW, 2]; FormSW.DisplayItem[ILT.toolData.paramSW, 6]; END; -- ExpandVMemSize GetBootFile: PUBLIC PROCEDURE [vName: LONG STRING] RETURNS [volumeID: Volume.ID, file: File.File] = BEGIN OPEN OthelloOps; created: BOOLEAN ← FALSE; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Enter GetBootFile Proc "L]; Put.LongString[ILT.toolData.fileSW, vName]; Put.Line[ILT.toolData.fileSW, "ILT.GetVolumeID "L]; Process.Pause[Process.SecondsToTicks[5]]; }; [volumeID, volumeOpen] ← ILT.GetVolumeID[vName]; IF volumeID = Volume.nullID THEN RETURN[Volume.nullID, File.nullFile]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "GetVolumeBootFile....."L]; Process.Pause[Process.SecondsToTicks[10]]; }; [file, firstPage] ← GetVolumeBootFile[volumeID, hardMicrocode]; IF (created ← file = File.nullFile) THEN BEGIN --Put.Line[ILT.toolData.msgSW, "+++No Sysout file installed."L]; IF debug THEN Process.Pause[Process.SecondsToTicks[20]]; file ← File.Create[volumeID, 1, FileTypes.tUntypedFile]; END ELSE BEGIN IF debug THEN { Put.Line[ILT.toolData.fileSW, "MakeUnbootable.."L]; Process.Pause[Process.SecondsToTicks[10]]; }; MakeUnbootable[ file, hardMicrocode, OthelloDefs.leaderPages ! File.Unknown => BEGIN Put.Text[ ILT.toolData.msgSW, "Warning: trouble making unbootable"L]; Process.Pause[Process.SecondsToTicks[20]]; CONTINUE; END]; END; RETURN[volumeID, file]; END; -- GetBootFile GetFile: PORT [file: File.File ← File.nullFile, name: LONG STRING ← NIL] RETURNS [BOOLEAN]; InstallProc: PUBLIC PROCEDURE [volName: LONG STRING] = BEGIN byteCount ← 0; fileName ← ILT.toolData.filePathName; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Enter Install Proc "L]; Put.LongString[ILT.toolData.fileSW, volName]; Process.Pause[Process.SecondsToTicks[5]]; }; volumeID ← Volume.nullID; volumeOpen ← FALSE; <<IF ValidateString[fileName] THEN InstallFileOnVolume[volName ! UNWIND => CloseVolume[]];>> InstallFileOnVolume[volName ! UNWIND => CloseVolume[]]; ILT.DisplayFileSize[ILT.toolData.vMemSize]; END; --InstallProc InstallFileOnVolume: PROC [volName: LONG STRING] = BEGIN OPEN OthelloOps; created: BOOLEAN ← FALSE; --currentSize: File.PageCount; -- clean the PORT up from last time LOOPHOLE[GetFile, PortRep].in ← 0; -- CONNECT GetFile.out TO Retrieve; --Sierra code --LOOPHOLE[GetFile, PortRep].out ← Retrieve; LOOPHOLE[GetFile, PortRep].out ← LOOPHOLE[Retrieve, LONG UNSPECIFIED]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "GetVolumeID "L]; Process.Pause[Process.SecondsToTicks[5]]; }; [volumeID, file] ← GetBootFile[ILT.toolData.volName]; << [volumeID, volumeOpen] ← ILT.GetVolumeID[volName]; IF volumeID = Volume.nullID THEN RETURN; IF debug THEN { Put.Text[ILT.toolData.fileSW, "File name ="L]; Put.LongString[ILT.toolData.fileSW, fileName]; Put.Line[ILT.toolData.fileSW, " ...."L]; Process.Pause[Process.SecondsToTicks[5]]; }; conn ← FileTransfer.Create[]; FileTransfer.SetProcs[ conn: conn, clientData: NIL, messages: PostComment, login: NIL, checkAbort: CheckForAbort]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "GetVolumeBootFile....."L]; Process.Pause[Process.SecondsToTicks[5]]; }; [file, firstPage] ← GetVolumeBootFile[volumeID, hardMicrocode]; IF ~GetFile[name: fileName] THEN BEGIN CloseVolume[]; Put.Line[ILT.toolData.fileSW, " Install failed."L]; DisplayOldVMemSize; ILT.toolData.busy ← FALSE; RETURN; END; [volSize, freePages] ← Volume.GetAttributes[volumeID]; defaultVMemSize ← volSize; IF (created ← file = File.nullFile) THEN BEGIN IF debug THEN { Put.Line[ILT.toolData.fileSW, " = nullFile...."L]; Process.Pause[Process.SecondsToTicks[5]]; }; file ← File.Create[volumeID, 1, FileTypes.tUntypedFile]; --set default vMem size --dont overwrite user's selection IF ILT.toolData.vMemSize = 0 THEN ILT.toolData.vMemSize ← defaultVMemSize; END ELSE BEGIN IF debug THEN { Put.Line[ILT.toolData.fileSW, " MakeUnbootable.."L]; Process.Pause[Process.SecondsToTicks[5]]; }; MakeUnbootable[ file, hardMicrocode, firstPage ! File.Unknown => CONTINUE; TemporaryBooting.InvalidParameters => BEGIN Put.Text[ ILT.toolData.msgSW, "+++Warning: trouble making unbootable"L]; Put.Line[ ILT.toolData.msgSW, "+++InvalidParameters error in MakeUnbootable.."L]; Process.Pause[Process.SecondsToTicks[20]]; CONTINUE; END]; END; --ILT.DisplayFileSize[ILT.toolData.vMemSize]; [volSize, freePages] ← Volume.GetAttributes[volumeID]; >> conn ← FileTransfer.Create[]; FileTransfer.SetProcs[ conn: conn, clientData: NIL, messages: PostComment, login: NIL, checkAbort: CheckForAbort]; IF ~GetFile[name: fileName] THEN BEGIN CloseVolume[]; Put.Line[ILT.toolData.fileSW, " Install failed."L]; DisplayOldVMemSize; ILT.toolData.busy ← FALSE; RETURN; END; -- control goes to Retrieve procedure Put.Text[ILT.toolData.fileSW, " Fetching... "L]; IF ~GetFile[ file: file ! UNWIND => { IF created THEN File.Delete[file]; --Put.Line[ILT.toolData.fileSW, " UNWIND ~GetFile"L]; CloseVolume[]}] THEN BEGIN IF created THEN File.Delete[file]; CloseVolume[]; Put.Line[ILT.toolData.msgSW, "+++cannot fetch file "L]; DisplayOldVMemSize; RETURN; END; SetupBootFile[volumeID]; << ILT.SetVMemSize[]; 10-Sep-84 17:06:28 IF debug THEN { Put.Text[ILT.toolData.fileSW, "SetVolumeProc..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; [] ← ILT.SetVolumeProc[ILT.toolData.volName]; SetVolumeBootFile[ file, hardMicrocode, OthelloDefs.leaderPages ! File.Unknown => { Put.Text[ ILT.toolData.msgSW, "+++File.Unknown error in SetVolumeBootFile"L]; Process.Pause[Process.SecondsToTicks[10]]; CONTINUE; }]; IF debug THEN { Put.Text[ILT.toolData.fileSW, "MakePermanent..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; file.MakePermanent; IF debug THEN { Put.Text[ILT.toolData.fileSW, "MakeBootable..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; MakeBootable[ file, hardMicrocode, OthelloDefs.leaderPages ! File.Unknown => BEGIN Put.Text[ ILT.toolData.msgSW, "+++File.Unknown: trouble making bootable"L]; Process.Pause[Process.SecondsToTicks[10]]; CONTINUE; END]; Put.Line[ILT.toolData.fileSW, " installed."L]; IF debug THEN { Put.Text[ILT.toolData.fileSW, "SetPhysicalVolumeBootFile..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; SetPhysicalVolumeBootFile[ file, hardMicrocode, OthelloDefs.leaderPages ! File.Unknown => { Put.Text[ ILT.toolData.msgSW, "+++File.Unknown error in SetPhysicalVolumeBootFile"L]; Process.Pause[Process.SecondsToTicks[10]]; CONTINUE; }]; CloseVolume[]; >> END; --InstallFileOnVolume; PostComment: FileTransfer.MessageProc = BEGIN IF ~ILT.toolData.busy THEN RETURN; IF level > terse THEN Post[ILT.toolData.msgSW, s1, s2, s3, s4]; Post[ILT.toolData.fileSW, s1, s2, s3, s4]; IF debug THEN Process.Pause[Process.SecondsToTicks[5]]; END; Post: PROCEDURE [w: Window.Handle, s1, s2, s3, s4: LONG STRING] = BEGIN IF s1 # NIL THEN Put.LongString[w, s1]; IF s2 # NIL THEN Put.LongString[w, s2]; IF s3 # NIL THEN Put.LongString[w, s3]; IF s4 # NIL THEN Put.LongString[w, s4]; END; Retrieve: PROCEDURE [file: File.File, name: LONG STRING] RETURNS [gotIt: BOOLEAN ← TRUE] = BEGIN OPEN FileTransfer; ResumeSetup: PORT [BOOLEAN] RETURNS [file: File.File, name: LONG STRING]; z: UNCOUNTED ZONE = Heap.systemZone; --access: Space.Access ← readWrite; --spaceBase: File.PageNumber ← NULL; --bufferPages: Space.PageCount = 64; bufferPages: File.PageCount = 100; bufferBytes: CARDINAL = CARDINAL[bufferPages * Environment.bytesPerPage]; fileSize: File.PageCount ← ILT.toolData.vMemSize; i: CARDINAL ← 0; --spaceWindow: Space.Window; --swapUnitSize: Space.SwapUnitSize = 10; sysoutSize: File.PageCount; temp: LONG STRING; -- CONNECT ResumeSetup.out TO GetFile LOOPHOLE[ResumeSetup, PortRep].out ← @GetFile; -- CONNECT GetFile.out TO ResumeSetup LOOPHOLE[GetFile, PortRep].out ← @ResumeSetup; temp ← String.MakeString[z, 100]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Enter Retrieve"L]; Process.Pause[Process.SecondsToTicks[5]]; }; IF debug THEN { Put.Line[ILT.toolData.fileSW, "AllocVFN..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; vfn ← AllocVFN[name]; --patch vfn.host chop out leading "<" for DEI servers i ← 0; IF vfn.directory[i] = '< THEN BEGIN i ← 1; UNTIL i = vfn.directory.length DO String.AppendCharAndGrow[@temp, vfn.directory[i], z]; i ← i + 1; ENDLOOP; String.Replace[@vfn.directory, temp, z]; temp.length ← 0; END; --ELSE Put.Line[ILT.toolData.fileSW, "missing left angle bracket"L]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "ReadStream...."L]; Process.Pause[Process.SecondsToTicks[5]]; }; readStream ← conn.ReadStream[ files: vfn ! Error => {gotIt ← FALSE; CONTINUE}]; IF debug THEN { IF readStream = NIL THEN Put.Line[ILT.toolData.fileSW, "readStream NIL"L]; Process.Pause[Process.SecondsToTicks[5]]; }; IF ~gotIt THEN {Cleanup[]; GOTO noGood}; -- FileTransfer has ML bug! IF debug THEN { Put.Line[ILT.toolData.fileSW, "ResumeSetup...."L]; Process.Pause[Process.SecondsToTicks[5]]; }; file ← ResumeSetup[gotIt].file; IF debug THEN { Put.Line[ILT.toolData.fileSW, "sysoutSize...."L]; Process.Pause[Process.SecondsToTicks[5]]; }; sysoutSize ← (FileTransfer.GetStreamInfo[readStream].size + Environment.bytesPerPage - 1) / Environment.bytesPerPage; Put.Text[ILT.toolData.fileSW, "Sysout size = "]; Put.LongDecimal[ILT.toolData.fileSW, sysoutSize]; Put.Text[ILT.toolData.fileSW, " pages; "]; Put.LongDecimal[ILT.toolData.fileSW, sysoutSize * 512]; Put.Line[ILT.toolData.fileSW, " bytes."]; -- set up initial default size << IF LOOPHOLE[ILT.GetFileSize, CARDINAL] = 0 THEN ILT.toolData.vMemSize ← defaultVMemSize; >> IF (ILT.toolData.vMemSize < sysoutSize) AND (ILT.toolData.vMemSize > 0) THEN BEGIN Put.Line[ILT.toolData.msgSW, "+++Virtual memory smaller than Sysout size, please respecify."L]; --size ← ILT.GetFileSize[]; --ILT.DisplayFileSize[size]; --CloseVolume[]; RETURN[FALSE]; END; ExpandVMemSize[]; << fileSize ← ILT.toolData.vMemSize; File.SetSize[ file, fileSize ! Volume.InsufficientSpace => { IF debug THEN { Put.Text[ILT.toolData.fileSW, "Can not set VMem at "L]; Put.LongDecimal[ILT.toolData.fileSW, fileSize]; Put.Line[ILT.toolData.fileSW, " pages; retrying..."L];}; fileSize ← fileSize - 100; RETRY; }]; [volSize, freePages] ← Volume.GetAttributes[volumeID]; fileSize ← fileSize + freePages; File.SetSize[ file, fileSize ! Volume.InsufficientSpace => { fileSize ← fileSize - 10; RETRY; }]; [volSize, freePages] ← Volume.GetAttributes[volumeID]; ILT.toolData.vMemSize ← fileSize; ILT.toolData.currentVolFreeSize ← freePages; -- re-display vMem and free size FormSW.DisplayItem[ILT.toolData.paramSW, 2]; FormSW.DisplayItem[ILT.toolData.paramSW, 6]; >> IF debug THEN { Put.Line[ILT.toolData.fileSW, "Create...."L]; --Process.Pause[Process.SecondsToTicks[5]]; }; buffer ← Space.Map[ window: [file: File.nullFile, base: NULL, count: bufferPages], class: data, swapUnits: [uniform[4]]].pointer; SetLeaderPage[file, readStream, vfn]; FOR windowPage: Space.PageOffset ← OthelloDefs.leaderPages, windowPage + bufferPages WHILE windowPage < Inline.LowHalf[sysoutSize] DO bytesTransferred: LONG INTEGER; cc: Stream.CompletionCode; eos: BOOLEAN ← FALSE; --end of stream indicator sst: Stream.SubSequenceType; --used in debug mode [bytesTransferred, cc] ← readStream.GetBlock[ [buffer, 0, bufferBytes] ! Error => { Put.Line[ILT.toolData.fileSW, "GetBlock.Error"L]; Process.Pause[Process.SecondsToTicks[20]]; gotIt ← FALSE; CONTINUE; }; ]; SELECT cc FROM normal => { IF debug THEN Put.Text[ILT.toolData.fileSW, " normal "L]; }; endRecord => { Put.Line[ILT.toolData.fileSW, "endRecord detected"L]; }; sstChange => Put.Line[ILT.toolData.fileSW, "sstChange detected"L]; endOfStream => { IF debug THEN { Put.Line[ILT.toolData.fileSW, "end of stream detected"L]; }; eos ← TRUE; }; attention => { Put.Line[ILT.toolData.fileSW, "attention detected"L]; Process.Pause[Process.SecondsToTicks[30]]; }; ENDCASE => { IF debug THEN Put.Line[ILT.toolData.fileSW, "ENDCASE"L]; Process.Pause[Process.SecondsToTicks[30]]; }; --Put.Decimal[ILT.toolData.fileSW, sst]; --Put.CR[ILT.toolData.fileSW]; [] ← Space.CopyOut[buffer, [file, windowPage, bufferPages]]; byteCount ← byteCount + bytesTransferred; Put.Text[ILT.toolData.msgSW, "Bytes transferred: "]; Put.LongDecimal[ILT.toolData.msgSW, byteCount]; Put.CR[ILT.toolData.msgSW]; ILT.InvertIndicator[]; IF eos THEN { Put.LongDecimal[ILT.toolData.fileSW, byteCount]; Put.Line[ILT.toolData.fileSW, " bytes retrieved. "]; RETURN[TRUE]; }; ENDLOOP; Cleanup[]; RETURN[TRUE]; EXITS noGood => RETURN[FALSE]; END; --Retrieve SetLeaderPage: PROC [ file: File.File, stream: Stream.Handle, vfn: FileName.VFN] = BEGIN lp: LONG POINTER TO OthelloDefs.LeaderPage = Space.Map[ [file, 0, OthelloDefs.leaderPages]].pointer; note: LONG STRING ← Heap.systemZone.NEW[StringBody [60]]; -- STARTKLUDGE: work around the FileTransfer not giving the host name <<String.AppendStringAndGrow[ @note, FileTransfer.GetStreamName[stream], Heap.systemZone];>> vfn.NormalizeVFN; IF NOT String.Empty[vfn.host] THEN { String.AppendStringAndGrow[@note, "["L, Heap.systemZone]; String.AppendStringAndGrow[@note, vfn.host, Heap.systemZone]; String.AppendStringAndGrow[@note, "]"L, Heap.systemZone]}; IF NOT String.Empty[vfn.directory] THEN { String.AppendStringAndGrow[@note, vfn.directory, Heap.systemZone]; String.AppendStringAndGrow[@note, ">"L, Heap.systemZone]}; IF NOT String.Empty[vfn.name] THEN String.AppendStringAndGrow[@note, vfn.name, Heap.systemZone]; IF NOT String.Empty[vfn.version] THEN { String.AppendStringAndGrow[@note, "!"L, Heap.systemZone]; String.AppendStringAndGrow[@note, vfn.version, Heap.systemZone]}; -- ENDKLUDGE String.AppendStringAndGrow[@note, " ("L, Heap.systemZone]; -- STARTKLUDGE: Time.Append screws up on StringBoundsFault { oldLength: CARDINAL = note.length; Time.Append[ s: note, zone: TRUE, unpacked: Time.Unpack[FileTransfer.GetStreamInfo[stream].create] ! String.StringBoundsFault => { ns ← String.CopyToNewString[ s: note, z: Heap.systemZone, longer: s.maxlength - s.length + 20]; Heap.systemZone.FREE[@note]; note ← ns; note.length ← oldLength; RETRY}]; }; -- ENDKLUDGE String.AppendCharAndGrow[@note, '), Heap.systemZone]; lp.version ← OthelloDefs.lpVersion; lp.length ← MIN[note.length, OthelloDefs.lpNoteLength]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "vfn name "L]; Put.LongString[ILT.toolData.fileSW, note]; Process.Pause[Process.SecondsToTicks[5]]; }; FOR i: CARDINAL IN [0..lp.length) DO lp.note[i] ← note[i]; ENDLOOP; [] ← Space.Unmap[lp]; Heap.systemZone.FREE[@note] END; SetupBootFile: PUBLIC PROCEDURE [volumeID: Volume.ID] = BEGIN OPEN OthelloOps; IF debug THEN { Put.Text[ILT.toolData.fileSW, "SetupBootFile..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; [file, firstPage] ← GetVolumeBootFile[volumeID, hardMicrocode]; SetVolumeBootFile[file, hardMicrocode, OthelloDefs.leaderPages]; File.MakePermanent[file]; MakeBootable[ file, hardMicrocode, firstPage ! TemporaryBooting.InvalidParameters => BEGIN Put.Text[ ILT.toolData.msgSW, "+++Warning: trouble making bootable"L]; CONTINUE; END]; IF debug THEN { Put.Text[ILT.toolData.fileSW, "SetPhysicalVolumeBootFile..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; SetPhysicalVolumeBootFile[file, hardMicrocode, OthelloDefs.leaderPages]; CloseVolume[]; END; --SetupBootFile SetVolumeProc: PUBLIC PROCEDURE [vName: LONG STRING] RETURNS [BOOLEAN] = BEGIN OPEN OthelloOps; created: BOOLEAN ← FALSE; IF debug THEN { Put.Line[ILT.toolData.fileSW, "Enter SetVolume Proc "L]; Put.LongString[ILT.toolData.fileSW, vName]; Put.Line[ILT.toolData.fileSW, "ILT.GetVolumeID "L]; Process.Pause[Process.SecondsToTicks[5]]; }; [volumeID, volumeOpen] ← ILT.GetVolumeID[vName]; IF volumeID = Volume.nullID THEN RETURN[FALSE]; IF debug THEN { Put.Line[ILT.toolData.fileSW, "GetVolumeBootFile....."L]; Process.Pause[Process.SecondsToTicks[10]]; }; [file, firstPage] ← GetVolumeBootFile[volumeID, hardMicrocode]; << IF file # File.nullFile THEN BEGIN ENABLE File.Unknown => { file ← File.nullFile; Put.Line[ILT.toolData.fileSW, " File.Unknown...."L]; Process.Pause[Process.SecondsToTicks[5]]; CONTINUE}; IF debug THEN { Put.Line[ILT.toolData.fileSW, " not nullFile...."L]; Process.Pause[Process.SecondsToTicks[5]]; }; END; >> IF (created ← file = File.nullFile) THEN BEGIN --Put.Line[ILT.toolData.msgSW, "+++No Sysout file installed."L]; IF debug THEN Process.Pause[Process.SecondsToTicks[20]]; RETURN[FALSE]; --file ← File.Create[volumeID, 1, FileTypes.tUntypedFile]; END ELSE BEGIN IF debug THEN { Put.Line[ILT.toolData.fileSW, "MakeUnbootable.."L]; Process.Pause[Process.SecondsToTicks[10]]; }; MakeUnbootable[ file, hardMicrocode, OthelloDefs.leaderPages ! File.Unknown => BEGIN Put.Text[ ILT.toolData.msgSW, "Warning: trouble making unbootable"L]; Process.Pause[Process.SecondsToTicks[20]]; CONTINUE; END]; END; IF debug THEN { Put.Text[ILT.toolData.fileSW, "SetVolumeBootFile..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; SetVolumeBootFile[file, hardMicrocode, OthelloDefs.leaderPages]; File.MakePermanent[file]; MakeBootable[ file, hardMicrocode, firstPage ! TemporaryBooting.InvalidParameters => BEGIN Put.Text[ ILT.toolData.msgSW, "+++Warning: trouble making bootable"L]; CONTINUE; END]; IF debug THEN { Put.Text[ILT.toolData.fileSW, "SetPhysicalVolumeBootFile..."L]; Process.Pause[Process.SecondsToTicks[5]]; }; SetPhysicalVolumeBootFile[file, hardMicrocode, OthelloDefs.leaderPages]; CloseVolume[]; RETURN[TRUE]; END; --SetVolumeProc -- This procedure validates the syntax for the file name used by NS file server . -- Allowable string is an -- alpha-numeric string beginning with a capital or small letter ['A .. 'Z] -- followed by any number (up to maxStringSize) of letters or numbers. ValidateString: PROC [sName: LONG STRING] RETURNS [BOOLEAN] = BEGIN currentString: STRING = [maxStringSize]; currentChar: CARDINAL ← 0; c: CHARACTER; maxStringSize: CARDINAL = NSName.maxFullNameLength; -- bytes CheckChar: PROC [] RETURNS [BOOLEAN] = BEGIN IF currentString.length >= maxStringSize THEN BEGIN Put.Line[ ILT.toolData.msgSW, "+++Scan Error: string length too long"L]; Put.LongString[ILT.toolData.msgSW, sName]; Put.CR[ILT.toolData.msgSW]; RETURN[FALSE]; END; currentString.text[currentString.length] ← c; currentString.length ← currentString.length + 1; currentChar ← currentChar + 1; RETURN[TRUE]; END; --CheckChar IF debug THEN { Put.Line[ILT.toolData.fileSW, "ValidateString"L]; Put.Text[ILT.toolData.fileSW, sName]; Put.CR[ILT.toolData.fileSW]; Process.Pause[Process.SecondsToTicks[5]]; }; WHILE (currentChar < sName.length) DO c ← sName.text[currentChar]; --Put.Char[ILT.toolData.fileSW, c]; --Process.Pause[Process.SecondsToTicks[5]]; SELECT ILT.toolData.fileServer FROM FS => BEGIN IF (c = '- OR c = '* OR c = '@ OR c = ': OR c = Ascii.SP OR c = '[ OR c = '] OR c = '< OR c = '> OR c IN ['a..'z] OR c IN ['A..'Z] OR c IN ['0..'9]) THEN RETURN[CheckChar[]] ELSE BEGIN Put.Text[ILT.toolData.msgSW, "+++Scan Error on: "L]; Put.LongString[ILT.toolData.msgSW, sName]; Put.Text[ ILT.toolData.fileSW, " Bad character detected: "]; Put.Char[ILT.toolData.fileSW, c]; RETURN[FALSE]; END; END; IFS => BEGIN IF (c = '- OR c = '* OR c = '@ OR c = Ascii.SP OR c = '[ OR c = '] OR c = '< OR c = '> OR c IN ['a..'z] OR c IN ['A..'Z] OR c IN ['0..'9]) THEN RETURN[CheckChar[]] ELSE BEGIN Put.Line[ILT.toolData.fileSW, "Scan Error"L]; Put.LongString[ILT.toolData.fileSW, sName]; RETURN[FALSE]; END; END; ENDCASE; ENDLOOP; RETURN[TRUE]; END; --ValidateString END.