<> <> DIRECTORY BigDisk, ConvertUnsafe USING [ToRope], Device USING [nullType, Type], IO, PhysicalVolume, Rope USING [Equal, ROPE], Volume; BigDiskImpl: PROGRAM IMPORTS ConvertUnsafe, IO, PhysicalVolume, Rope, Volume EXPORTS BigDisk = BEGIN BringVolumesOnline: PUBLIC PROC [out: IO.STREAM] = { deviceType: Device.Type _ Device.nullType; deviceIndex: CARDINAL _ PhysicalVolume.nullDeviceIndex; DO [nextType: deviceType, nextIndex: deviceIndex] _ PhysicalVolume.GetNextDrive[ deviceType, deviceIndex]; IF deviceIndex = PhysicalVolume.nullDeviceIndex THEN EXIT ELSE { physicalVolumeHandle: PhysicalVolume.Handle _ PhysicalVolume.GetHandle[deviceType, deviceIndex]; IF PhysicalVolume.IsReady[physicalVolumeHandle] THEN { physicalVolumeID: PhysicalVolume.ID; logicalVolumeID: Volume.ID; asserted: BOOL; volumeSize, freePageCount: Volume.PageCount; volumeType: Volume.Type; label: STRING _ [100]; label.length _ 0; asserted _ FALSE; [] _ PhysicalVolume.GetHints[instance: physicalVolumeHandle, label: label]; out.PutF["Physical Volume: %g", IO.string[label]]; physicalVolumeID _ PhysicalVolume.AssertPilotVolume[ physicalVolumeHandle ! PhysicalVolume.Error => IF error = alreadyAsserted THEN { out.PutRope[" alreadyAsserted"]; asserted _ TRUE; CONTINUE; }]; out.PutRope["\n"]; IF asserted THEN { pvType: PhysicalVolume.VolumeType; label.length _ 0; [pvID: physicalVolumeID, volumeType: pvType] _ PhysicalVolume.GetHints[instance: physicalVolumeHandle, label: label]; IF pvType # isPilot THEN { out.PutRope[" ... not a pilot volume\n"]; LOOP; }; }; logicalVolumeID _ Volume.nullID; DO logicalVolumeStatus: Volume.Status; logicalVolumeID _ PhysicalVolume.GetNextLogicalVolume[ physicalVolumeID, logicalVolumeID ! PhysicalVolume.Error => { IF error = physicalVolumeUnknown THEN { logicalVolumeID _ Volume.nullID; CONTINUE; }; }]; IF logicalVolumeID = Volume.nullID THEN EXIT; logicalVolumeStatus _ Volume.GetStatus[logicalVolumeID]; label.length _ 0; [volumeSize: volumeSize, freePageCount: freePageCount] _ Volume.GetAttributes[volume: logicalVolumeID]; volumeType _ Volume.GetType[volume: logicalVolumeID]; Volume.GetLabelString[volume: logicalVolumeID, s: label]; out.PutF[" Logical volume %g, size: %d, free: %d ", IO.string[label], IO.card[volumeSize], IO.card[freePageCount]]; out.PutF["type: %g, status: %g\n", IO.refAny[NEW[Volume.Type _ volumeType]], IO.refAny[NEW[Volume.Status _ logicalVolumeStatus]]]; IF NOT asserted AND logicalVolumeStatus = closedAndConsistent THEN { Volume.Open[logicalVolumeID]; out.PutRope[" ...opened\n"]; }; ENDLOOP; }; }; ENDLOOP; }; END. <>