diff options
-rw-r--r-- | tdecore/tdehardwaredevices.cpp | 95 | ||||
-rw-r--r-- | tdecore/tdehardwaredevices.h | 26 |
2 files changed, 115 insertions, 6 deletions
diff --git a/tdecore/tdehardwaredevices.cpp b/tdecore/tdehardwaredevices.cpp index 1874c65d7..6124f0173 100644 --- a/tdecore/tdehardwaredevices.cpp +++ b/tdecore/tdehardwaredevices.cpp @@ -19,6 +19,7 @@ #include <tdehardwaredevices.h> #include <tqfile.h> +#include <tqdir.h> #include <tqstringlist.h> #include <libudev.h> @@ -152,6 +153,22 @@ void TDEStorageDevice::setDiskUUID(TQString id) { m_diskUUID = id; } +TQStringList &TDEStorageDevice::holdingDevices() { + return m_holdingDevices; +} + +void TDEStorageDevice::setHoldingDevices(TQStringList hd) { + m_slaveDevices = hd; +} + +TQStringList &TDEStorageDevice::slaveDevices() { + return m_slaveDevices; +} + +void TDEStorageDevice::setSlaveDevices(TQStringList sd) { + m_slaveDevices = sd; +} + TQString TDEStorageDevice::mountPath() { // See if this device node is mounted // This requires parsing /proc/mounts, looking for deviceNode() @@ -305,6 +322,47 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev) { } fclose(fp); } + + // See if any other devices are exclusively using this device, such as the Device Mapper| + TQStringList holdingDeviceNodes; + TQString holdersnodename = udev_device_get_syspath(dev); + holdersnodename.append("/holders/"); + TQDir holdersdir(holdersnodename); + holdersdir.setFilter(TQDir::All); + const TQFileInfoList *dirlist = holdersdir.entryInfoList(); + if (dirlist) { + TQFileInfoListIterator holdersdirit(*dirlist); + TQFileInfo *dirfi; + while ( (dirfi = holdersdirit.current()) != 0 ) { + if (dirfi->isSymLink()) { + char* collapsedPath = realpath((holdersnodename + dirfi->readLink()).ascii(), NULL); + holdingDeviceNodes.append(TQString(collapsedPath)); + free(collapsedPath); + } + ++holdersdirit; + } + } + + // See if any other physical devices underlie this device, for example when the Device Mapper is in use + TQStringList slaveDeviceNodes; + TQString slavesnodename = udev_device_get_syspath(dev); + slavesnodename.append("/slaves/"); + TQDir slavedir(slavesnodename); + slavedir.setFilter(TQDir::All); + dirlist = slavedir.entryInfoList(); + if (dirlist) { + TQFileInfoListIterator slavedirit(*dirlist); + TQFileInfo *dirfi; + while ( (dirfi = slavedirit.current()) != 0 ) { + if (dirfi->isSymLink()) { + char* collapsedPath = realpath((slavesnodename + dirfi->readLink()).ascii(), NULL); + slaveDeviceNodes.append(TQString(collapsedPath)); + free(collapsedPath); + } + ++slavedirit; + } + } + device = new TDEStorageDevice(TDEGenericDeviceType::Disk); // Determine generic disk information @@ -432,10 +490,10 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev) { diskstatus = diskstatus | TDEDiskDeviceStatus::Removable; } - if (disktypestring.upper() == "CRYPTO_LUKS") { + if (filesystemtype.upper() == "CRYPTO_LUKS") { disktype = disktype | TDEDiskDeviceType::LUKS; } - else if (disktypestring.upper() == "CRYPTO") { + else if (filesystemtype.upper() == "CRYPTO") { disktype = disktype | TDEDiskDeviceType::OtherCrypted; } @@ -452,11 +510,32 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev) { if ((!disktypestring.upper().isNull()) && (disktype & TDEDiskDeviceType::HDD)) { diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable; } - if (sdevice->mediaInserted()) { - diskstatus = diskstatus | TDEDiskDeviceStatus::Inserted; + if (removable) { + if (sdevice->mediaInserted()) { + diskstatus = diskstatus | TDEDiskDeviceStatus::Inserted; + } + else { + diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable; + } } - else { - diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable; + + if (holdingDeviceNodes.count() > 0) { + diskstatus = diskstatus | TDEDiskDeviceStatus::UsedByDevice; + } + + if (slaveDeviceNodes.count() > 0) { + diskstatus = diskstatus | TDEDiskDeviceStatus::UsesDevice; + } + + // See if any slaves were crypted + for ( TQStringList::Iterator slaveit = slaveDeviceNodes.begin(); slaveit != slaveDeviceNodes.end(); ++slaveit ) { + struct udev_device *slavedev; + slavedev = udev_device_new_from_syspath(m_udevStruct, (*slaveit).ascii()); + TQString slavediskfstype(udev_device_get_property_value(slavedev, "ID_FS_TYPE")); + if ((slavediskfstype.upper() == "CRYPTO_LUKS") || (slavediskfstype.upper() == "CRYPTO")) { + disktype = disktype | TDEDiskDeviceType::UnlockedCrypt; + } + udev_device_unref(slavedev); } sdevice->setDiskType(disktype); @@ -465,6 +544,8 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev) { sdevice->setDiskStatus(diskstatus); sdevice->setFileSystemName(filesystemtype); sdevice->setFileSystemUsage(filesystemusage); + sdevice->setSlaveDevices(slaveDeviceNodes); + sdevice->setHoldingDevices(holdingDeviceNodes); printf("DISK DEVICE name: %s type: %s subsystem: %s vendor: %s model: %s bus: %s label: %s filesystem: %s disk type: %s disk type flags: 0x%08x media inserted: %d [Node Path: %s] [Syspath: %s]\n\r\n\r", devicename.ascii(), devicetype.ascii(), devicesubsystem.ascii(), devicevendor.ascii(), devicemodel.ascii(), devicebus.ascii(), disklabel.ascii(), filesystemtype.ascii(), disktypestring.ascii(), disktype, sdevice->mediaInserted(), devicenode.ascii(), udev_device_get_syspath(dev)); fflush(stdout); } @@ -564,6 +645,8 @@ bool TDEHardwareDevices::queryHardwareInformation() { if (device) { m_deviceList.append(device); } + + udev_device_unref(dev); } // Free the enumerator object diff --git a/tdecore/tdehardwaredevices.h b/tdecore/tdehardwaredevices.h index e56217cbe..531106c36 100644 --- a/tdecore/tdehardwaredevices.h +++ b/tdecore/tdehardwaredevices.h @@ -21,6 +21,7 @@ // TDE includes #include <tqstring.h> #include <tqptrlist.h> +#include <tqstringlist.h> #include <tqtimer.h> #include "tdelibs_export.h" @@ -98,6 +99,7 @@ enum TDEDiskDeviceType { MemoryStick = 0x04000000, SmartMedia = 0x08000000, SDMMC = 0x10000000, + UnlockedCrypt = 0x20000000, Other = 0x80000000 }; @@ -123,6 +125,8 @@ enum TDEDiskDeviceStatus { Removable = 0x00000002, Inserted = 0x00000004, Blank = 0x00000008, + UsedByDevice = 0x00000010, + UsesDevice = 0x00000020, Other = 0x80000000 }; @@ -324,6 +328,26 @@ class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice void setFileSystemUsage(TQString fu); /** + * @return a TQStringList containing system paths to all devices with a lock on this device, if any + */ + TQStringList &holdingDevices(); + + /** + * @param a TQStringList containing system paths to all devices with a lock on this device, if any + */ + void setHoldingDevices(TQStringList hd); + + /** + * @return a TQStringList containing system paths to all devices locked by this device, if any + */ + TQStringList &slaveDevices(); + + /** + * @param a TQStringList containing system paths to all devices locked by this device, if any + */ + void setSlaveDevices(TQStringList sd); + + /** * @return a TQString with the mount path, if mounted */ TQString mountPath(); @@ -337,6 +361,8 @@ class TDECORE_EXPORT TDEStorageDevice : public TDEGenericDevice TQString m_fileSystemUsage; bool m_mediaInserted; TQString m_mountPath; + TQStringList m_holdingDevices; + TQStringList m_slaveDevices; }; typedef TQPtrList<TDEGenericDevice> TDEGenericHardwareList; |