diff options
Diffstat (limited to 'tdecore/tdehw/tdehardwaredevices.cpp')
| -rw-r--r-- | tdecore/tdehw/tdehardwaredevices.cpp | 101 |
1 files changed, 38 insertions, 63 deletions
diff --git a/tdecore/tdehw/tdehardwaredevices.cpp b/tdecore/tdehw/tdehardwaredevices.cpp index 0da216a87..2471c8341 100644 --- a/tdecore/tdehw/tdehardwaredevices.cpp +++ b/tdecore/tdehw/tdehardwaredevices.cpp @@ -25,7 +25,7 @@ #include <tqstringlist.h> #include <tdeconfig.h> -#include <kstandarddirs.h> +#include <tdestandarddirs.h> #include <tdeglobal.h> #include <tdelocale.h> @@ -89,22 +89,13 @@ timespec diff(timespec start, timespec end) return temp; } -// BEGIN BLOCK -// Copied from include/linux/genhd.h -#define GENHD_FL_REMOVABLE 1 -#define GENHD_FL_MEDIA_CHANGE_NOTIFY 4 -#define GENHD_FL_CD 8 -#define GENHD_FL_UP 16 -#define GENHD_FL_SUPPRESS_PARTITION_INFO 32 -#define GENHD_FL_EXT_DEVT 64 -#define GENHD_FL_NATIVE_CAPACITY 128 -#define GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE 256 -// END BLOCK - // NOTE TO DEVELOPERS // This command will greatly help when attempting to find properties to distinguish one device from another // udevadm info --query=all --path=/sys/.... +// Some local utility functions and constants +namespace { + // This routine is courtsey of an answer on "Stack Overflow" // It takes an LSB-first int and makes it an MSB-first int (or vice versa) unsigned int reverse_bits(unsigned int x) @@ -116,11 +107,24 @@ unsigned int reverse_bits(unsigned int x) return((x >> 16) | (x << 16)); } +// Read the content of a file that supposed to contain a single line +TQString readLineFile(TQString fname) { + TQFile file( fname ); + if ( file.open( IO_ReadOnly ) ) { + TQTextStream stream( &file ); + return stream.readLine(); + } else { + return TQString::null; + } +} + +} // namespace + // Helper function implemented in tdestoragedevice.cpp TQString decodeHexEncoding(TQString str); extern "C" { - KDE_EXPORT TDEHardwareDevices* create_tdeHardwareDevices() + TDE_EXPORT TDEHardwareDevices* create_tdeHardwareDevices() { return new TDEHardwareDevices(); } @@ -132,6 +136,7 @@ TDEHardwareDevices::TDEHardwareDevices() { usb_id_map = 0; pnp_id_map = 0; dpy_id_map = 0; + m_unclassifiedDevices = TQStringList(); // Set up device list m_deviceList.setAutoDelete( true ); // the list owns the objects @@ -151,7 +156,7 @@ TDEHardwareDevices::TDEHardwareDevices() { int udevmonitorfd = udev_monitor_get_fd(m_udevMonitorStruct); if (udevmonitorfd >= 0) { m_devScanNotifier = new TQSocketNotifier(udevmonitorfd, TQSocketNotifier::Read, this); - connect( m_devScanNotifier, TQT_SIGNAL(activated(int)), this, TQT_SLOT(processHotPluggedHardware()) ); + connect( m_devScanNotifier, TQ_SIGNAL(activated(int)), this, TQ_SLOT(processHotPluggedHardware()) ); } // Read in the current mount table @@ -173,7 +178,7 @@ TDEHardwareDevices::TDEHardwareDevices() { m_procMountsFd = open("/proc/mounts", O_RDONLY, 0); if (m_procMountsFd >= 0) { m_mountScanNotifier = new TQSocketNotifier(m_procMountsFd, TQSocketNotifier::Exception, this); - connect( m_mountScanNotifier, TQT_SIGNAL(activated(int)), this, TQT_SLOT(processModifiedMounts()) ); + connect( m_mountScanNotifier, TQ_SIGNAL(activated(int)), this, TQ_SLOT(processModifiedMounts()) ); } // Read in the current cpu information @@ -195,20 +200,20 @@ TDEHardwareDevices::TDEHardwareDevices() { // Monitor for changed cpu information // Watched directories are set up during the initial CPU scan m_cpuWatch = new KSimpleDirWatch(this); - connect( m_cpuWatch, TQT_SIGNAL(dirty(const TQString &)), this, TQT_SLOT(processModifiedCPUs()) ); + connect( m_cpuWatch, TQ_SIGNAL(dirty(const TQString &)), this, TQ_SLOT(processModifiedCPUs()) ); #else m_cpuWatchTimer = new TQTimer(this); - connect( m_cpuWatchTimer, SIGNAL(timeout()), this, SLOT(processModifiedCPUs()) ); + connect( m_cpuWatchTimer, TQ_SIGNAL(timeout()), this, TQ_SLOT(processModifiedCPUs()) ); #endif // Some devices do not receive update signals from udev // These devices must be polled, and a good polling interval is 1 second m_deviceWatchTimer = new TQTimer(this); - connect( m_deviceWatchTimer, SIGNAL(timeout()), this, SLOT(processStatelessDevices()) ); + connect( m_deviceWatchTimer, TQ_SIGNAL(timeout()), this, TQ_SLOT(processStatelessDevices()) ); // Special case for battery and power supply polling (longer delay, 5 seconds) m_batteryWatchTimer = new TQTimer(this); - connect( m_batteryWatchTimer, SIGNAL(timeout()), this, SLOT(processBatteryDevices()) ); + connect( m_batteryWatchTimer, TQ_SIGNAL(timeout()), this, TQ_SLOT(processBatteryDevices()) ); // Update internal device information. queryHardwareInformation(); @@ -2415,7 +2420,12 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDevice(udev_device* dev, TD if (device == 0) { // Unhandled if (!device) device = new TDEGenericDevice(TDEGenericDeviceType::Other); - printf("[FIXME] UNCLASSIFIED DEVICE name: %s type: %s subsystem: %s driver: %s [Node Path: %s] [Syspath: %s] [%s:%s]\n", devicename.ascii(), devicetype.ascii(), devicesubsystem.ascii(), devicedriver.ascii(), devicenode.ascii(), udev_device_get_syspath(dev), devicevendorid.ascii(), devicemodelid.ascii()); fflush(stdout); + if (!m_unclassifiedDevices.contains(devicename)) + { + m_unclassifiedDevices.append(devicename); + printf("[FIXME] UNCLASSIFIED DEVICE name: %s type: %s subsystem: %s driver: %s [Node Path: %s] [Syspath: %s] [%s:%s]\n", + devicename.ascii(), devicetype.ascii(), devicesubsystem.ascii(), devicedriver.ascii(), devicenode.ascii(), udev_device_get_syspath(dev), devicevendorid.ascii(), devicemodelid.ascii()); fflush(stdout); + } } // Root devices are special @@ -2511,36 +2521,6 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice *devic sdevice->internalSetFileSystemName("pictbridge"); } else { - bool removable = false; - bool hotpluggable = false; - - // We can get the removable flag, but we have no idea if the device has the ability to notify on media insertion/removal - // If there is no such notification possible, then we should not set the removable flag - // udev can be such an amazing pain at times - // It exports a /capabilities node with no info on what the bits actually mean - // This information is very poorly documented as a set of #defines in include/linux/genhd.h - // We are specifically interested in GENHD_FL_REMOVABLE and GENHD_FL_MEDIA_CHANGE_NOTIFY - // The "removable" flag should also really be renamed to "hotpluggable", as that is far more precise... - TQString capabilitynodename = systempath; - capabilitynodename.append("/capability"); - TQFile capabilityfile( capabilitynodename ); - unsigned int capabilities = 0; - if ( capabilityfile.open( IO_ReadOnly ) ) { - TQTextStream stream( &capabilityfile ); - TQString capabilitystring; - capabilitystring = stream.readLine(); - capabilities = capabilitystring.toUInt(); - capabilityfile.close(); - } - if (capabilities & GENHD_FL_REMOVABLE) { - // FIXME - // For added fun this is not always true; i.e. GENHD_FL_REMOVABLE can be set when the device cannot be hotplugged (floppy drives). - hotpluggable = true; - } - if (capabilities & GENHD_FL_MEDIA_CHANGE_NOTIFY) { - removable = true; - } - // See if any other devices are exclusively using this device, such as the Device Mapper TQStringList holdingDeviceNodes; TQString holdersnodename = udev_device_get_syspath(dev); @@ -2733,21 +2713,16 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice *devic } } - if (removable) { + if (readLineFile( systempath + "/removable" ).toUInt()) { diskstatus = diskstatus | TDEDiskDeviceStatus::Removable; } - if (hotpluggable) { - diskstatus = diskstatus | TDEDiskDeviceStatus::Hotpluggable; - } // Force removable flag for flash disks // udev reports disks as non-removable for card readers on PCI controllers - if (((disktype & TDEDiskDeviceType::CompactFlash) + else if ((disktype & TDEDiskDeviceType::CompactFlash) || (disktype & TDEDiskDeviceType::MemoryStick) || (disktype & TDEDiskDeviceType::SmartMedia) - || (disktype & TDEDiskDeviceType::SDMMC)) - && !(diskstatus & TDEDiskDeviceStatus::Removable) - && !(diskstatus & TDEDiskDeviceStatus::Hotpluggable)) { - diskstatus = diskstatus | TDEDiskDeviceStatus::Hotpluggable; + || (disktype & TDEDiskDeviceType::SDMMC)) { + diskstatus = diskstatus | TDEDiskDeviceStatus::Removable; } if ((!filesystemtype.isEmpty()) && (filesystemtype.upper() != "CRYPTO_LUKS") && @@ -2765,7 +2740,7 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice *devic // type string too. For example for LUKS disk, ID_TYPE is null and DEVTYPE is "disk" diskstatus = diskstatus & ~TDEDiskDeviceStatus::Mountable; } - if (removable) { + if ( diskstatus & TDEDiskDeviceStatus::Removable ) { if (sdevice->mediaInserted()) { diskstatus = diskstatus | TDEDiskDeviceStatus::Inserted; } @@ -2955,7 +2930,7 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice *devic ndevice->internalSetIpV6Netmask(address); } } - s = getnameinfo(ifa->ifa_ifu.ifu_broadaddr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + s = ifa->ifa_ifu.ifu_broadaddr ? getnameinfo(ifa->ifa_ifu.ifu_broadaddr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) : EAI_NONAME; if (s == 0) { TQString address(host); if (family == AF_INET) { @@ -2966,7 +2941,7 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice *devic ndevice->internalSetIpV6Broadcast(address); } } - s = getnameinfo(ifa->ifa_ifu.ifu_dstaddr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + s = ifa->ifa_ifu.ifu_dstaddr ? getnameinfo(ifa->ifa_ifu.ifu_dstaddr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) : EAI_NONAME; if (s == 0) { TQString address(host); if (family == AF_INET) { |
