Solid/Mac : fleshing out the skeleton IOKit backend (WIP)
ClosedPublic

Authored by rjvbb on Aug 18 2017, 8:06 PM.

Details

Summary

Here's something I've been working on for the past week or so, inspired by the fact that it'd be nifty to have a functional audiocd-kio slave on Mac too. Digikam would also benefit from being able to distinguish removable drives on Mac.

I have thus focussed on implementing IOKit backend support for drives, discs and volumes. The audiocd kioslave doesn't work properly yet, but I feel the IOKit backend additions and changes are now at a point where I can present them to collect feedback while I undoubtedly continue tinkering (and cleaning up here and there).

There are evidently changes between how IOKit and (say) UDev and UDisk2 organise things. One notable difference is with optical devices: disc and the useful/interesting part of the drive show up in the same entry, with (audio) CD tracks appearing as additional "devices" (much like how the partitions of a harddisk are listed).

Test Plan

Tested on OS X 10.9.5 mostly using the solid-hardware5 utility (output from my system below).

Since tonight dragon --play-dvd finds my internal optical drive and plays audio.

udi = 'IOService:/'
  parent = ''  (string)
  vendor = 'Apple'  (string)
  product = 'MacBookPro8,1'  (string)
  description = 'MacBookPro8,1'  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

[snip]

udi = 'IOService:/AppleACPIPlatformExpert/cpus'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU0@0'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU0@0'  (string)
  vendor = 'GenuineIntel'  (string)
  product = 'Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz'  (string)
  description = 'Processor'  (string)
  Processor.number = 0  (0x0)  (int)
  Processor.maxSpeed = 2700  (0xa8c)  (qulonglong)
  Processor.canChangeFrequency = false  (bool)
  Processor.instructionSets = 'IntelMmx|IntelSse|IntelSse2|IntelSse3|IntelSsse3|IntelSse41|IntelSse42'  (0x19f)  (flag)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU/AppleACPICPUInterruptController'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU/ACPI_SMC_PlatformPlugin'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU/ACPI_SMC_PlatformPlugin/AGPMEnabler'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU/ACPI_SMC_PlatformPlugin'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU/ACPI_SMC_PlatformPlugin/AGPMEnabler/AGPMController'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU0@0/AppleACPICPU/ACPI_SMC_PlatformPlugin/AGPMEnabler'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU1@2'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU1@2/AppleACPICPU'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU1@2'  (string)
  vendor = 'GenuineIntel'  (string)
  product = 'Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz'  (string)
  description = 'Processor'  (string)
  Processor.number = 1  (0x1)  (int)
  Processor.maxSpeed = 2700  (0xa8c)  (qulonglong)
  Processor.canChangeFrequency = false  (bool)
  Processor.instructionSets = 'IntelMmx|IntelSse|IntelSse2|IntelSse3|IntelSsse3|IntelSse41|IntelSse42'  (0x19f)  (flag)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU2@1'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU2@1/AppleACPICPU'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU2@1'  (string)
  vendor = 'GenuineIntel'  (string)
  product = 'Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz'  (string)
  description = 'Processor'  (string)
  Processor.number = 2  (0x2)  (int)
  Processor.maxSpeed = 2700  (0xa8c)  (qulonglong)
  Processor.canChangeFrequency = false  (bool)
  Processor.instructionSets = 'IntelMmx|IntelSse|IntelSse2|IntelSse3|IntelSsse3|IntelSse41|IntelSse42'  (0x19f)  (flag)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU3@3'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU3@3/AppleACPICPU'
  parent = 'IOService:/AppleACPIPlatformExpert/CPU3@3'  (string)
  vendor = 'GenuineIntel'  (string)
  product = 'Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz'  (string)
  description = 'Processor'  (string)
  Processor.number = 3  (0x3)  (int)
  Processor.maxSpeed = 2700  (0xa8c)  (qulonglong)
  Processor.canChangeFrequency = false  (bool)
  Processor.instructionSets = 'IntelMmx|IntelSse|IntelSse2|IntelSse3|IntelSsse3|IntelSse41|IntelSse42'  (0x19f)  (flag)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU4'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU5'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU6'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/CPU7'
  parent = 'IOService:/AppleACPIPlatformExpert'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

[snip]

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver'  (string)
  vendor = 'Inateck'  (string)
  product = 'ASM1153E'  (string)
  description = 'Inateck TS64GMSA370 Media'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 7  (0x7)  (int)
  Block.device = '/dev/disk1'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = false  (bool)
  StorageDrive.bus = 'Usb'  (0x1)  (enum)
  StorageDrive.driveType = 'HardDisk'  (0x0)  (enum)
  StorageDrive.removable = true  (bool)
  StorageDrive.hotpluggable = true  (bool)
  StorageDrive.inUse = true  (bool)
  StorageDrive.size = 64023257088  (0xee8156000)  (qulonglong)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'PartitionTable'  (0x3)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 64023257088  (0xee8156000)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOGUIDPartitionScheme'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOGUIDPartitionScheme/EFI System Partition@1'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOGUIDPartitionScheme'  (string)
  vendor = 'Inateck'  (string)
  product = 'ASM1153E'  (string)
  description = 'EFI System Partition'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 8  (0x8)  (int)
  Block.device = '/dev/disk1s1'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'msdos'  (string)
  StorageVolume.label = 'EFI'  (string)
  StorageVolume.uuid = '69faf048-1981-41d5-8729-baf4f0788f24'  (string)
  StorageVolume.size = 209715200  (0xc800000)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOGUIDPartitionScheme/EFI System Partition@1/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOGUIDPartitionScheme/EFI System Partition@1'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOGUIDPartitionScheme/VMssd@2'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@4/IOPP/UPS2@0/IOPP/pci-bridge@0/IOPP/pci1b73,1100@0/AppleUSBXHCI/ASM1153E@81200000/IOUSBInterface@0/IOUSBAttachedSCSI/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/org_dungeon_driver_IOSATDriver/IOSATServices/IOBlockStorageDriver/Inateck TS64GMSA370 Media/IOGUIDPartitionScheme'  (string)
  vendor = 'Inateck'  (string)
  product = 'ASM1153E'  (string)
  description = 'VMs (VMssd)'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 9  (0x9)  (int)
  Block.device = '/dev/disk1s2'  (string)
  StorageAccess.accessible = true  (bool)
  StorageAccess.filePath = '/Volumes/VMs'  (string)
  StorageAccess.ignored = false  (bool)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'hfs'  (string)
  StorageVolume.label = 'VMs'  (string)
  StorageVolume.uuid = '4ff2589b-d129-4dfa-adbe-44e652b52ab5'  (string)
  StorageVolume.size = 63679283200  (0xed394c000)  (qulonglong)

[snip]

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver'  (string)
  vendor = ''  (string)
  product = 'HGST HTS721010A9E630                    '  (string)
  description = 'HGST HTS721010A9E630 Media'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/disk0'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = false  (bool)
  StorageDrive.bus = 'Sata'  (0x4)  (enum)
  StorageDrive.driveType = 'HardDisk'  (0x0)  (enum)
  StorageDrive.removable = false  (bool)
  StorageDrive.hotpluggable = false  (bool)
  StorageDrive.inUse = true  (bool)
  StorageDrive.size = 1000204886016  (0xe8e0db6000)  (qulonglong)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'PartitionTable'  (0x3)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 1000204886016  (0xe8e0db6000)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/EFI@1'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme'  (string)
  vendor = ''  (string)
  product = 'HGST HTS721010A9E630                    '  (string)
  description = 'EFI'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 1  (0x1)  (int)
  Block.device = '/dev/disk0s1'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'msdos'  (string)
  StorageVolume.label = 'EFI'  (string)
  StorageVolume.uuid = 'fb10e9ba-2469-4792-ae2c-1e7af6ca8ce8'  (string)
  StorageVolume.size = 209715200  (0xc800000)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/EFI@1/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/EFI@1'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/Mosx@2'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme'  (string)
  vendor = ''  (string)
  product = 'HGST HTS721010A9E630                    '  (string)
  description = 'Mosx'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 2  (0x2)  (int)
  Block.device = '/dev/disk0s2'  (string)
  StorageAccess.accessible = true  (bool)
  StorageAccess.filePath = '/'  (string)
  StorageAccess.ignored = false  (bool)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'hfs'  (string)
  StorageVolume.label = 'Mosx'  (string)
  StorageVolume.uuid = '70429cfe-d88d-47a4-9e62-035192a16a7b'  (string)
  StorageVolume.size = 128849018880  (0x1e00000000)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/Mosx@2/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/Mosx@2'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/DebianI@3'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme'  (string)
  vendor = ''  (string)
  product = 'HGST HTS721010A9E630                    '  (string)
  description = 'Debian (DebianI)'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 3  (0x3)  (int)
  Block.device = '/dev/disk0s3'  (string)
  StorageAccess.accessible = true  (bool)
  StorageAccess.filePath = '/Volumes/Debian'  (string)
  StorageAccess.ignored = false  (bool)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'hfs'  (string)
  StorageVolume.label = 'Debian'  (string)
  StorageVolume.uuid = '7d1b181c-a434-4041-8729-3d2520849e29'  (string)
  StorageVolume.size = 322122547200  (0x4b00000000)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/DebianI@3/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/DebianI@3'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/Win@4'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme'  (string)
  vendor = ''  (string)
  product = 'HGST HTS721010A9E630                    '  (string)
  description = 'Win (Win)'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 4  (0x4)  (int)
  Block.device = '/dev/disk0s4'  (string)
  StorageAccess.accessible = true  (bool)
  StorageAccess.filePath = '/Volumes/Win'  (string)
  StorageAccess.ignored = false  (bool)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'hfs'  (string)
  StorageVolume.label = 'Win'  (string)
  StorageVolume.uuid = '58156f29-6029-4dde-a2d2-8facfa989fd6'  (string)
  StorageVolume.size = 107374182400  (0x1900000000)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/Win@4/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/Win@4'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/VMs@5'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme'  (string)
  vendor = ''  (string)
  product = 'HGST HTS721010A9E630                    '  (string)
  description = 'VMshd (VMs)'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 5  (0x5)  (int)
  Block.device = '/dev/disk0s5'  (string)
  StorageAccess.accessible = true  (bool)
  StorageAccess.filePath = '/Volumes/VMshd'  (string)
  StorageAccess.ignored = false  (bool)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'hfs'  (string)
  StorageVolume.label = 'VMshd'  (string)
  StorageVolume.uuid = '12050429-db95-4993-aec5-0cc0376ce1c9'  (string)
  StorageVolume.size = 440407870976  (0x668a5ace00)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/VMs@5/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/VMs@5'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme/Apple_HFS_Untitled_2@6'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/HGST HTS721010A9E630 Media/IOGUIDPartitionScheme'  (string)
  vendor = ''  (string)
  product = 'HGST HTS721010A9E630                    '  (string)
  description = 'Apple_HFS_Untitled_2'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 6  (0x6)  (int)
  Block.device = '/dev/disk0s6'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'hfs'  (string)
  StorageVolume.label = 'Recovery HD'  (string)
  StorageVolume.uuid = '8eb41767-06e0-46bf-8dcd-8f7921cbcc54'  (string)
  StorageVolume.size = 704643072  (0x2a000000)  (qulonglong)

[snip]

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/SCSITaskUserClientIniter'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'MATSHITA DVD-R UJ-8A8 Media'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 12  (0xc)  (int)
  Block.device = '/dev/rdisk3'  (string)
  StorageAccess.accessible = true  (bool)
  StorageAccess.filePath = '/Volumes/Audio CD'  (string)
  StorageAccess.ignored = false  (bool)
  StorageDrive.bus = 'Sata'  (0x4)  (enum)
  StorageDrive.driveType = 'CdromDrive'  (0x1)  (enum)
  StorageDrive.removable = true  (bool)
  StorageDrive.hotpluggable = true  (bool)
  StorageDrive.inUse = true  (bool)
  StorageDrive.size = 750932448  (0x2cc251e0)  (qulonglong)
  OpticalDrive.supportedMedia = 'Cdr|Cdrw|Dvd|Dvdr|Dvdrw|Dvdplusr|Dvdplusrw'  (0xdf)  (flag)
  OpticalDrive.readSpeed = 0  (0x0)  (int)
  OpticalDrive.writeSpeed = 0  (0x0)  (int)
  OpticalDrive.writeSpeeds = {} (int list)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'PartitionTable'  (0x3)  (enum)
  StorageVolume.fsType = 'cddafs'  (string)
  StorageVolume.label = 'Audio CD'  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 750932448  (0x2cc251e0)  (qulonglong)
  OpticalDisc.availableContent = 'Audio'  (0x1)  (flag)
  OpticalDisc.discType = 'CdRom'  (0x0)  (enum)
  OpticalDisc.appendable = false  (bool)
  OpticalDisc.blank = false  (bool)
  OpticalDisc.rewritable = false  (bool)
  OpticalDisc.capacity = 750932448  (0x2cc251e0)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 1@1'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 1'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 17  (0x11)  (int)
  Block.device = '/dev/disk3s1'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 82044816  (0x4e3e790)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 1@1/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 1@1'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 2@2'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 2'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 14  (0xe)  (int)
  Block.device = '/dev/disk3s2'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 109558512  (0x687baf0)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 2@2/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 2@2'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 3@3'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 3'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 15  (0xf)  (int)
  Block.device = '/dev/disk3s3'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 54763968  (0x343a1c0)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 3@3/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 3@3'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 4@4'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 4'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 13  (0xd)  (int)
  Block.device = '/dev/disk3s4'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 46708368  (0x2c8b690)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 4@4/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 4@4'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 5@5'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 5'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 16  (0x10)  (int)
  Block.device = '/dev/disk3s5'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 48281856  (0x2e0b900)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 5@5/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 5@5'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 6@6'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 6'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 18  (0x12)  (int)
  Block.device = '/dev/disk3s6'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 15523200  (0xecdd80)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 6@6/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 6@6'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 7@7'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 7'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 19  (0x13)  (int)
  Block.device = '/dev/disk3s7'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 57732192  (0x370ec60)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 7@7/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 7@7'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 8@8'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 8'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 22  (0x16)  (int)
  Block.device = '/dev/disk3s8'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 64804656  (0x3dcd730)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 8@8/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 8@8'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 9@9'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 9'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 23  (0x17)  (int)
  Block.device = '/dev/disk3s9'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 77194992  (0x499e6f0)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 9@9/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 9@9'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 10@10'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 10'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 20  (0x14)  (int)
  Block.device = '/dev/disk3s10'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 23465904  (0x1660fb0)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 10@10/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 10@10'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 11@11'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 11'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 21  (0x15)  (int)
  Block.device = '/dev/disk3s11'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 129917424  (0x7be61f0)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 11@11/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 11@11'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 12@12'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme'  (string)
  vendor = 'MATSHITA'  (string)
  product = 'DVD-R   UJ-8A8'  (string)
  description = 'Untitled 12'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 24  (0x18)  (int)
  Block.device = '/dev/disk3s12'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = true  (bool)
  StorageVolume.ignored = true  (bool)
  StorageVolume.usage = 'Other'  (0x0)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 40936560  (0x270a470)  (qulonglong)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 12@12/IOMediaBSDClient'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODVDBlockStorageDriver/MATSHITA DVD-R UJ-8A8 Media/IOCDPartitionScheme/Untitled 12@12'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices/IODASPIService'
  parent = 'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

[snip]

udi = 'IOService:/AppleACPIPlatformExpert/SMB0/AppleECSMBusController/AppleSmartBatteryManager'
  parent = 'IOService:/AppleACPIPlatformExpert/SMB0/AppleECSMBusController'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/AppleACPIPlatformExpert/SMB0/AppleECSMBusController/AppleSmartBatteryManager/AppleSmartBattery'
  parent = 'IOService:/AppleACPIPlatformExpert/SMB0/AppleECSMBusController/AppleSmartBatteryManager'  (string)
  vendor = 'SMP'  (string)
  product = 'bq20z451'  (string)
  description = 'Apple Smart Battery'  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)
  Battery.present = true  (bool)
  Battery.type = 'PrimaryBattery'  (0x3)  (enum)
  Battery.chargePercent = 98  (0x62)  (int)
  Battery.capacity = 100  (0x64)  (int)
  Battery.rechargeable = true  (bool)
  Battery.powerSupply = true  (bool)
  Battery.chargeState = 'FullyCharged'  (0x3)  (enum)
  Battery.timeToEmpty = -1  (0xffffffffffffffff)  (qlonglong)
  Battery.timeToFull = -1  (0xffffffffffffffff)  (qlonglong)
  Battery.energy = 0 (double)
  Battery.energyFull = 0 (double)
  Battery.energyFullDesign = 0 (double)
  Battery.energyRate = 0 (double)
  Battery.voltage = 12.495 (double)
  Battery.temperature = 29.71 (double)
  Battery.recalled = false  (bool)
  Battery.recallVendor = ''  (string)
  Battery.recallUrl = ''  (string)
  Battery.serial = 'W01286PEED3BA'  (string)
  Battery.remainingTime = -1  (0xffffffffffffffff)  (qlonglong)

[snip]

udi = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver/Apple UDIF read-only compressed (zlib) Media'
  parent = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver'  (string)
  vendor = 'Apple'  (string)
  product = 'Disk Image'  (string)
  description = 'Apple UDIF read-only compressed (zlib) Media'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 10  (0xa)  (int)
  Block.device = '/dev/disk2'  (string)
  StorageAccess.accessible = false  (bool)
  StorageAccess.filePath = ''  (string)
  StorageAccess.ignored = false  (bool)
  StorageDrive.bus = 'Platform'  (0x5)  (enum)
  StorageDrive.driveType = 'HardDisk'  (0x0)  (enum)
  StorageDrive.removable = true  (bool)
  StorageDrive.hotpluggable = false  (bool)
  StorageDrive.inUse = true  (bool)
  StorageDrive.size = 199281152  (0xbe0ca00)  (qulonglong)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'PartitionTable'  (0x3)  (enum)
  StorageVolume.fsType = ''  (string)
  StorageVolume.label = ''  (string)
  StorageVolume.uuid = ''  (string)
  StorageVolume.size = 199281152  (0xbe0ca00)  (qulonglong)

udi = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver/Apple UDIF read-only compressed (zlib) Media/IOMediaBSDClient'
  parent = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver/Apple UDIF read-only compressed (zlib) Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver/Apple UDIF read-only compressed (zlib) Media/IOGUIDPartitionScheme'
  parent = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver/Apple UDIF read-only compressed (zlib) Media'  (string)
  vendor = ''  (string)
  product = ''  (string)
  description = ''  (string)
  Block.major = 0  (0x0)  (int)
  Block.minor = 0  (0x0)  (int)
  Block.device = '/dev/'  (string)

udi = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver/Apple UDIF read-only compressed (zlib) Media/IOGUIDPartitionScheme/disk image@1'
  parent = 'IOService:/IOResources/IOHDIXController/IOHDIXHDDriveOutKernel@2/IODiskImageBlockStorageDeviceOutKernel/IOBlockStorageDriver/Apple UDIF read-only compressed (zlib) Media/IOGUIDPartitionScheme'  (string)
  vendor = 'Apple'  (string)
  product = 'Disk Image'  (string)
  description = 'Opera-41 (disk image)'  (string)
  Block.major = 1  (0x1)  (int)
  Block.minor = 11  (0xb)  (int)
  Block.device = '/dev/disk2s1'  (string)
  StorageAccess.accessible = true  (bool)
  StorageAccess.filePath = '/Volumes/Opera-41'  (string)
  StorageAccess.ignored = false  (bool)
  StorageVolume.ignored = false  (bool)
  StorageVolume.usage = 'FileSystem'  (0x2)  (enum)
  StorageVolume.fsType = 'hfs'  (string)
  StorageVolume.label = 'Opera-41'  (string)
  StorageVolume.uuid = '0a67cb13-4686-41db-aaec-726df1623cdd'  (string)
  StorageVolume.size = 199241728  (0xbe03000)  (qulonglong)

[snip]

Diff Detail

Repository
R245 Solid
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.
There are a very large number of changes, so older changes are hidden. Show Older Changes
Restricted Application added a project: Frameworks. · View Herald TranscriptAug 18 2017, 8:06 PM
rjvbb edited the test plan for this revision. (Show Details)Aug 18 2017, 8:07 PM
rjvbb updated this revision to Diff 18366.Aug 18 2017, 8:19 PM

Don't add Block output where there shouldn't be.

rjvbb set the repository for this revision to R245 Solid.Aug 18 2017, 8:19 PM

Rene, this is a great improvement for MacOS support. Congratualtions.

When code will be add to KDE::Solid framework ?

Best

Gilles Caulier

rjvbb added a comment.Aug 27 2017, 1:16 PM

I can commit it anytime, as soon as I get a green light (within a reasonable amount of time). Have you tested it?

I expect that the only possible risk with these modifications is that they might break the build itself on newer OS versions than I have myself. Other than that I don't think there's any code currently that relies on the existing Mac support in Solid...

I don't yet tested, i'm currently busy to prepare digiKam 5.7.0, to review last code from GSoC 2017 students, and to prepare Randa event tasks.

Do you come to Randa ? If yes, we can take a look together while the event...

Gilles

Renee,

I tested your patch against Solid under MacOS Sierra 10.12.6, and now digiKam can see USB devices. Gre

rjvbb added a comment.Oct 22 2017, 8:41 AM

Perfect, good to know.

So, spoiler alert: I'll be pushing this (rebased and possibly polished where appropriate) somewhere this week unless anyone objects.

anthonyfieroni added inline comments.
src/solid/devices/backends/iokit/cfhelper.cpp
51–56

Remove verbose

src/solid/devices/backends/iokit/iokitdevice.cpp
148

QString has a default constructor.

149

nullptr even on C functions

293–294

break after return is useless

375–377

QStringLiteral

src/solid/devices/backends/iokit/iokitmanager.cpp
95–98

QStrinLiteral

src/solid/devices/backends/iokit/iokitopticaldrive.h
34

I see that all classes have a virtual inheritance but i don't see they are exported.

Indeed. I'm pretty sure that got there because it was already in code I cloned (for the simple reason this isn't a construct I'm familiar with =) ).

That said, there's inheritance inside the IOKit backend so this kind of inheritance could make sense even without exporting publicly.

rjvbb marked 7 inline comments as done.Oct 23 2017, 10:53 AM
rjvbb added inline comments.
src/solid/devices/backends/iokit/iokitdevice.cpp
293–294

I know, I do this as a matter of principle (and I'll leave it in since I'll undoubtedly be the principal maintainer of this code for the foreseeable future).

src/solid/devices/backends/iokit/iokitmanager.cpp
95–98

No, not here. Check the return type and what the returned strings are used for.

src/solid/devices/backends/iokit/iokitopticaldrive.h
34

Did you see that this is also the case in the other backends, at least the ones I used for reference (hal and udisk)?

As I said, I'm not familiar enough with the construct to know what difference this would make at runtime.
Shouldn't changing this be the focus of a different patch and review, tackling all backends at once?

kfunk requested changes to this revision.Oct 23 2017, 11:12 AM
kfunk added a subscriber: kfunk.

This definitely needs another revision. Please fix the outstanding issues.

src/solid/devices/backends/iokit/iokitblock.h
43

Here and below: Missing Q_DECL_OVERRIDE

src/solid/devices/backends/iokit/iokitdevice.cpp
151

Use nullptr everywhere

154

Style: Use qModel = ...

156

new/delete mismatch. Use delete[]

167

Initialize at class member decl

171

That's *very* odd style. Why does a private class delete its public counterpart? I've never seen this.

197

Don't leave commented code around. Either enable this code paths properly via categorized logging or remove it altogether.

src/solid/devices/backends/iokit/iokitopticaldrive.cpp
212

Create on ioDVDServices on the stack to begin with?

334

return {}

355

Coding style: Would turn around this two branches (and remove the else part) to make the intended meaning more clear:

Pseudo code:

if (errorCase) {
  return ...;
}

// normal case, code flow continues
return ...;

That's usually the common style

src/solid/devices/backends/iokit/iokitprocessor.cpp
84

Remove const

87

Way too much error prone new/delete logic on naked char arrays. Every invocation here is wrong (causing undefined behavior) due to the new[]/delete` mismatch mentioned above.

Factor that out reading into a QString into a separate function, cf. https://github.com/trueos/lumina/blob/master/src-qt5/core/libLumina/LuminaOS-DragonFly.cpp#L29 and use it everywhere instead.

99

Remove const

src/solid/devices/backends/iokit/iokitstorage.cpp
37

Here and one line below: Could be initialized at decl again.

37

nullptr

52

nullptr, etc. pp.

76

Please just remove the constructors taking a const IOKitDevice *device and adapt uses (just use IOKitDevice *device everywhere). It's unusual for pointer types to be const in such contexts. It just adds noise.

src/solid/devices/backends/iokit/iokitstorageaccess.cpp
42

Here and below: nullptr

92

Early-return would reduce the indentation level here [1].

if (errorCase)
  // return early
  return {};
}

// normal case
// ...

[1] https://softwareengineering.stackexchange.com/questions/18454/should-i-return-from-a-function-early-or-use-an-if-statement

133

Coding style: Eliminate else branch, just `return in function-level scope.

143

Dito

src/solid/devices/backends/iokit/iokitvolume.cpp
43

Here and below: nullptr

122

Remove commented code.

178

That's a lot of copy-pasted code amongst fsType, label, vendor, product, description`. I'm sure that can be done better.

src/solid/devices/backends/iokit/iokitvolume.h
46

Here and below: Missing Q_DECL_OVERRIDE again

54

Here and below: No const for return types on implicitly-shared types (just adds noise)

The functions can be made const though.

This revision now requires changes to proceed.Oct 23 2017, 11:12 AM
kfunk added inline comments.Oct 23 2017, 11:14 AM
src/solid/devices/backends/iokit/iokitopticaldrive.cpp
28

Where's that defined via the build system?

rjvbb marked 27 inline comments as done.Oct 23 2017, 3:46 PM
rjvbb added inline comments.
src/solid/devices/backends/iokit/iokitblock.h
43

I hope you meant everywhere, including in old code...

src/solid/devices/backends/iokit/iokitdevice.cpp
156

(This keeps biting me. Even C doesn't have separate de/allocators for pointers to scalars and pointers to arrays ...)

171

Heh, that's because there is (was) a confusion in parenthood here. The member var didn't point to the private class parent, but holds a reference to the parent of the current IOKit device. Currently it's used and thus allocated only when getting the device icon.

197

I'd love to, but Solid doesn't have any modern logging set up. Rather than introducing that through the back(end) door, wouldn't it be better if this were done for all of Solid? (Preferably by someone having a good overview of the entire framework...)

https://bugs.kde.org/show_bug.cgi?id=386107

src/solid/devices/backends/iokit/iokitopticaldrive.cpp
28

Nowhere currently. It's somewhat experimental code which uses the DiskArbitration SDK for ejection, instead of invoking an external (system) command.

It works (and it would thus be a pity to throw everything away) but as documented in the comment, there are a few issues that I haven't been able to iron out.

Making this a build option would certainly increase its visibility and thus (hopefully) incite some other Apple users to test it. Should I put one under the WITH_NEW_* options in the toplevel CMake file?

src/solid/devices/backends/iokit/iokitstorage.cpp
37

Did you check that these are indeed pointers? ;)

76

I don't get it, sorry, can you explain in more words how you'd want to see this changed? If I remove this extra ctor, I can no longer call IOKitStorage(this).vendor() in IOKitDevice::vendor() without extra code that's also going to add noise.

I get a warning when I remove the const attribute from IOKitDevice::vendor(), which suggests that I'd no longer be reimplementing a virtual method but adding a method instead.

All these "extra" ctors hand off the pointer to a "const this" to DeviceInterface which finally makes a deep copy. I find that cleaner than creating a deep copy of this everywhere needed and ensuring it gets deallocated (even via QPointers).
Unusual doesn't mean wrong (we're on Mac here, after all ^^)

src/solid/devices/backends/iokit/iokitstorageaccess.cpp
92

Compromise. Too many return points make functions hard to maintain (Apple code tends to be full of goto bail; instructions because of that; we're far here from the nesting you'd get without those in code using the QT SDK.)

src/solid/devices/backends/iokit/iokitvolume.cpp
178

Somewhat.

rjvbb updated this revision to Diff 21187.Oct 23 2017, 3:46 PM
rjvbb marked 7 inline comments as done.

Updated as requested/discussed.

rjvbb set the repository for this revision to R245 Solid.Oct 23 2017, 3:47 PM
kfunk requested changes to this revision.Oct 24 2017, 8:53 AM
kfunk added inline comments.
src/solid/devices/backends/iokit/iokitdevice.cpp
307

Why not return here as well? For consistency.

You can end the function with

Q_UNREACHABLE();
return {};

Very common pattern.

463–477

Returning inside the case statements would make this code clearer as well.

src/solid/devices/backends/iokit/iokitdeviceinterface.h
51

m_ prefix missing. Would call it m_deviceCopy.

src/solid/devices/backends/iokit/iokitstorage.cpp
37

Yes. And they are, no?

74

Inconsistent member naming. Some with m_ prefix, some without. Choose one style. Private classes' members usually live without the m_ prefix, but we don't mind them being around (in KDE land)

76

Okay, well, leave it like that.

I'm running out of time to properly explain how I'd envision this code to be like in a perfect world.

src/solid/devices/backends/iokit/iokitstorage.h
43

Remove const from return type, but make the method const.

src/solid/devices/backends/iokit/iokitstorageaccess.cpp
57

Dito, inconsistent member naming.

src/solid/devices/backends/iokit/iokitvolume.cpp
71

Dito, inconsistent member naming.

And given that I've noticed that three times now, this again leads to the conclusion this is very repetitive code amongst . {IOKitStorageAccess,IOKitVolume,IOKitStorage}::Private.

Maybe there should be helper class for accessing a CFDictionary instead which all these classes use?

I'm not trying to piss you off René, but this is slightly sloppy coding which easy for the initial writer to do, but will bite us any time in the future when someone unfamiliar with the code needs to do fixes to this code and potentially fixes only one copy of these snippets. Please think about your architecture more carefully.

src/solid/devices/backends/iokit/iokitvolume.h
46

No virtual needed if there's already a Q_DECL_OVERRIDE or override.

This revision now requires changes to proceed.Oct 24 2017, 8:53 AM

What's about this very important entry to improve Solid support under MacOS ? It will be integrated officially soon ?

Gilles Caulier

rjvbb added a comment.Dec 18 2017, 9:47 AM

I'd hope so. I thought I was waiting for additional information but it seems I may have missed a notification that there was new feedback. Apologies if that's the case.

I'll need to find some time to go over this again.

rjvbb marked 10 inline comments as done.Jan 23 2018, 9:10 PM
rjvbb added inline comments.
src/solid/devices/backends/iokit/iokitdevice.cpp
463–477

I don't share that opinion and think that multiple exit points do not make the code more efficient either (judging from stepping through the code in a debugger).

But whatever...

src/solid/devices/backends/iokit/iokitvolume.cpp
71

Not really certain why I didn't decide to this myself, I'm pretty certain it did cross my mind.

src/solid/devices/backends/iokit/iokitvolume.h
46

I guess that's safe here because IOKitOpticalDisc doesn't override any of these methods?

rjvbb updated this revision to Diff 25846.Jan 23 2018, 9:11 PM
rjvbb marked 3 inline comments as done.

updated as requested/discussed.

rjvbb set the repository for this revision to R245 Solid.Jan 23 2018, 9:12 PM

PING again to KF5 core developpers ...

We need to advance with this very important patch to support properly Apple device with Solid. This will permit to use Apple hardware as well, as under Linux.

Please review, fix, and validate this non negligible job, done by René.

Thanks in advance.

Gilles Caulier

rjvbb added a comment.Feb 11 2018, 5:12 PM

Thanks Gilles.

Please remember that perfect is the enemy of good and that further improvements can always be applied down the road.

This patch touches only Mac and concerns very specific functionality that is used by only very few applications (besides digiKam I can only think of Dolphin and the KDE file dialogs). Given that I am inclined to committing it say next Friday if I don't get revision requests I cannot address by then.

This revision was not accepted when it landed; it landed in state Needs Review.Feb 17 2018, 10:33 AM
This revision was automatically updated to reflect the committed changes.