Erste Version
This commit is contained in:
commit
e5944d9b97
74 files changed
+30486
No files matched your search
@@ -0,0 +1,74 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright (C) 2026 Dany Thinnes
|
||||
|
||||
#include "removable.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QStorageInfo>
|
||||
#include <QStringList>
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in new issue
Block a user