Erste Version

This commit is contained in:
diabolus committed 2026-11-01 15:38:43 +01:00
commit e5944d9b97
74 files changed
+30486

No files matched your search

+74
View File
@@ -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;
}