summaryrefslogtreecommitdiffstats
path: root/tdecore/tdehw/tdehardwaredevices.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdecore/tdehw/tdehardwaredevices.cpp')
-rw-r--r--tdecore/tdehw/tdehardwaredevices.cpp101
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) {