// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2026 Dany Thinnes #include "removable.h" #include #include #include #include #include namespace { QString readSys(const QString &path) { QFile f(path); if (!f.open(QIODevice::ReadOnly)) return QString(); return QString::fromUtf8(f.readAll()).trimmed(); } bool isSystemMount(const QString &mp) { static const QStringList sys = { "/", "/boot", "/home", "/usr", "/var", "/etc" }; for (const QString &s : sys) { if (mp == s) return true; } return false; } } // namespace // Heuristik: Als auswerfbar gilt ein Datentraeger, wenn // - das Kernel-Flag "removable" gesetzt ist, oder // - es eine SD-Karte am eingebauten Kartenleser ist (mmcblk, Typ "SD"), oder // - er ueber USB angeschlossen ist. // Systemverzeichnisse (/, /home, ...) werden nie angeboten. RemovableInfo detectRemovable(const QString &file) { RemovableInfo info; const QStorageInfo si(QFileInfo(file).absolutePath()); if (!si.isValid() || !si.isReady()) return info; const QString dev = QFileInfo(QString::fromUtf8(si.device())).canonicalFilePath(); const QString mp = si.rootPath(); if (!dev.startsWith(QLatin1String("/dev/")) || isSystemMount(mp)) return info; const QString name = QFileInfo(dev).fileName(); const QString sysPart = QFileInfo(QStringLiteral("/sys/class/block/") + name).canonicalFilePath(); if (sysPart.isEmpty()) return info; // Zugehoerige Platte bestimmen (bei Partitionen das Elternverzeichnis in /sys) QString disk = name; if (QFileInfo::exists(sysPart + QStringLiteral("/partition"))) disk = QFileInfo(sysPart).dir().dirName(); const QString diskSys = QFileInfo(QStringLiteral("/sys/class/block/") + disk).canonicalFilePath(); const bool rm = readSys(QStringLiteral("/sys/class/block/%1/removable").arg(disk)) == QLatin1String("1"); const bool sd = disk.startsWith(QLatin1String("mmcblk")) && readSys(QStringLiteral("/sys/class/block/%1/device/type").arg(disk)) == QLatin1String("SD"); const bool usb = diskSys.contains(QLatin1String("/usb")); info.removable = rm || sd || usb; info.partition = dev; info.disk = QStringLiteral("/dev/") + disk; info.mountPoint = mp; info.label = si.name(); return info; }