From fd0de2b581ab3f3bab7bc540d8348f994464723f Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Wed, 30 Sep 2015 13:33:19 -0500 Subject: [PATCH] Fix hardware class file matching algorithm Fix overly broad floppy device matching rules This resolves Bug 2534 --- .../classrules/floppydisk-platform.hwclass | 1 + .../classrules/floppydisk-udev.hwclass | 1 + tdecore/tdehw/tdehardwaredevices.cpp | 64 ++++++++++++++----- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/tdecore/tdehw/hwlibdata/classrules/floppydisk-platform.hwclass b/tdecore/tdehw/hwlibdata/classrules/floppydisk-platform.hwclass index b3ccab66c..54368d4ea 100644 --- a/tdecore/tdehw/hwlibdata/classrules/floppydisk-platform.hwclass +++ b/tdecore/tdehw/hwlibdata/classrules/floppydisk-platform.hwclass @@ -1,6 +1,7 @@ [Conditions] SUBSYSTEM=block DRIVER=floppy +MatchType=All [DeviceType] GENTYPE=Disk diff --git a/tdecore/tdehw/hwlibdata/classrules/floppydisk-udev.hwclass b/tdecore/tdehw/hwlibdata/classrules/floppydisk-udev.hwclass index 6c76d3c85..07b2e43da 100644 --- a/tdecore/tdehw/hwlibdata/classrules/floppydisk-udev.hwclass +++ b/tdecore/tdehw/hwlibdata/classrules/floppydisk-udev.hwclass @@ -1,5 +1,6 @@ [Conditions] ID_TYPE=floppy +MatchType=All [DeviceType] GENTYPE=Disk diff --git a/tdecore/tdehw/tdehardwaredevices.cpp b/tdecore/tdehw/tdehardwaredevices.cpp index 3c08cfcda..bb1318a39 100644 --- a/tdecore/tdehw/tdehardwaredevices.cpp +++ b/tdecore/tdehw/tdehardwaredevices.cpp @@ -1656,27 +1656,61 @@ TDEGenericDevice* TDEHardwareDevices::classifyUnknownDeviceByExternalRules(udev_ for (cndit = conditionmap.begin(); cndit != conditionmap.end(); ++cndit) { TQStringList conditionList = TQStringList::split(',', cndit.data(), false); bool atleastonematch = false; - for ( TQStringList::Iterator paramit = conditionList.begin(); paramit != conditionList.end(); ++paramit ) { - if (cndit.key() == "VENDOR_ID") { - if (device->vendorID() == (*paramit)) { - atleastonematch = true; + bool allmatch = true; + TQString matchtype = rulesFile.readEntry("MATCH_TYPE", "All"); + if (conditionList.count() < 1) { + allmatch = false; + } + else { + for ( TQStringList::Iterator paramit = conditionList.begin(); paramit != conditionList.end(); ++paramit ) { + if ((*paramit) == "MatchType") { + continue; } - } - else if (cndit.key() == "MODEL_ID") { - if (device->modelID() == (*paramit)) { - atleastonematch = true; + if (cndit.key() == "VENDOR_ID") { + if (device->vendorID() == (*paramit)) { + atleastonematch = true; + } + else { + allmatch = false; + } } - } - else if (cndit.key() == "DRIVER") { - if (device->deviceDriver() == (*paramit)) { - atleastonematch = true; + else if (cndit.key() == "MODEL_ID") { + if (device->modelID() == (*paramit)) { + atleastonematch = true; + } + else { + allmatch = false; + } + } + else if (cndit.key() == "DRIVER") { + if (device->deviceDriver() == (*paramit)) { + atleastonematch = true; + } + else { + allmatch = false; + } } + else { + if (readUdevAttribute(dev, cndit.key()) == (*paramit)) { + atleastonematch = true; + } + else { + allmatch = false; + } + } + } + } + if (matchtype == "All") { + if (!allmatch) { + match = false; } - else if (readUdevAttribute(dev, cndit.key()) == (*paramit)) { - atleastonematch = true; + } + else if (matchtype == "Any") { + if (!atleastonematch) { + match = false; } } - if (!atleastonematch) { + else { match = false; } }