Move FS detection code back to backends.
This commit is contained in:
parent
befdf9d799
commit
dc421db5c3
|
@ -20,7 +20,8 @@
|
||||||
|
|
||||||
#define COREBACKEND__H
|
#define COREBACKEND__H
|
||||||
|
|
||||||
#include "../util/libpartitionmanagerexport.h"
|
#include "util/libpartitionmanagerexport.h"
|
||||||
|
#include "fs/filesystem.h"
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
@ -91,6 +92,13 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual QList<Device*> scanDevices(bool excludeReadOnly = false) = 0;
|
virtual QList<Device*> scanDevices(bool excludeReadOnly = false) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scan a single device in the system.
|
||||||
|
* @param deviceNode The path to the device that is to be scanned (e.g. /dev/sda)
|
||||||
|
* @return FileSystem type of the device on deviceNode
|
||||||
|
*/
|
||||||
|
virtual FileSystem::Type detectFileSystem(const QString& deviceNode) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan a single device in the system.
|
* Scan a single device in the system.
|
||||||
* @param device_node The path to the device that is to be scanned (e.g. /dev/sda)
|
* @param device_node The path to the device that is to be scanned (e.g. /dev/sda)
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
|
|
||||||
#include "fs/filesystem.h"
|
#include "fs/filesystem.h"
|
||||||
|
|
||||||
|
#include "backend/corebackend.h"
|
||||||
|
#include "backend/corebackendmanager.h"
|
||||||
|
|
||||||
#include "util/externalcommand.h"
|
#include "util/externalcommand.h"
|
||||||
#include "util/capacity.h"
|
#include "util/capacity.h"
|
||||||
|
|
||||||
|
@ -110,57 +113,7 @@ static QString readBlkIdValue(const QString& deviceNode, const QString& tag)
|
||||||
|
|
||||||
FileSystem::Type FileSystem::detectFileSystem(const QString& partitionPath)
|
FileSystem::Type FileSystem::detectFileSystem(const QString& partitionPath)
|
||||||
{
|
{
|
||||||
FileSystem::Type rval = FileSystem::Unknown;
|
return CoreBackendManager::self()->backend()->detectFileSystem(partitionPath);
|
||||||
|
|
||||||
blkid_cache cache;
|
|
||||||
if (blkid_get_cache(&cache, nullptr) == 0) {
|
|
||||||
blkid_dev dev;
|
|
||||||
|
|
||||||
if ((dev = blkid_get_dev(cache,
|
|
||||||
partitionPath.toLocal8Bit().constData(),
|
|
||||||
BLKID_DEV_NORMAL)) != nullptr) {
|
|
||||||
QString s = QString::fromUtf8(blkid_get_tag_value(cache,
|
|
||||||
"TYPE",
|
|
||||||
partitionPath.toLocal8Bit().constData()));
|
|
||||||
|
|
||||||
if (s == QStringLiteral("ext2")) rval = FileSystem::Ext2;
|
|
||||||
else if (s == QStringLiteral("ext3")) rval = FileSystem::Ext3;
|
|
||||||
else if (s.startsWith(QStringLiteral("ext4"))) rval = FileSystem::Ext4;
|
|
||||||
else if (s == QStringLiteral("swap")) rval = FileSystem::LinuxSwap;
|
|
||||||
else if (s == QStringLiteral("ntfs")) rval = FileSystem::Ntfs;
|
|
||||||
else if (s == QStringLiteral("reiserfs")) rval = FileSystem::ReiserFS;
|
|
||||||
else if (s == QStringLiteral("reiser4")) rval = FileSystem::Reiser4;
|
|
||||||
else if (s == QStringLiteral("xfs")) rval = FileSystem::Xfs;
|
|
||||||
else if (s == QStringLiteral("jfs")) rval = FileSystem::Jfs;
|
|
||||||
else if (s == QStringLiteral("hfs")) rval = FileSystem::Hfs;
|
|
||||||
else if (s == QStringLiteral("hfsplus")) rval = FileSystem::HfsPlus;
|
|
||||||
else if (s == QStringLiteral("ufs")) rval = FileSystem::Ufs;
|
|
||||||
else if (s == QStringLiteral("vfat")) {
|
|
||||||
// libblkid uses SEC_TYPE to distinguish between FAT16 and FAT32
|
|
||||||
QString st = QString::fromUtf8(blkid_get_tag_value(cache,
|
|
||||||
"SEC_TYPE",
|
|
||||||
partitionPath.toLocal8Bit().constData()));
|
|
||||||
if (st == QStringLiteral("msdos"))
|
|
||||||
rval = FileSystem::Fat16;
|
|
||||||
else
|
|
||||||
rval = FileSystem::Fat32;
|
|
||||||
} else if (s == QStringLiteral("btrfs")) rval = FileSystem::Btrfs;
|
|
||||||
else if (s == QStringLiteral("ocfs2")) rval = FileSystem::Ocfs2;
|
|
||||||
else if (s == QStringLiteral("zfs_member")) rval = FileSystem::Zfs;
|
|
||||||
else if (s == QStringLiteral("hpfs")) rval = FileSystem::Hpfs;
|
|
||||||
else if (s == QStringLiteral("crypto_LUKS")) rval = FileSystem::Luks;
|
|
||||||
else if (s == QStringLiteral("exfat")) rval = FileSystem::Exfat;
|
|
||||||
else if (s == QStringLiteral("nilfs2")) rval = FileSystem::Nilfs2;
|
|
||||||
else if (s == QStringLiteral("LVM2_member")) rval = FileSystem::Lvm2_PV;
|
|
||||||
else if (s == QStringLiteral("f2fs")) rval = FileSystem::F2fs;
|
|
||||||
else
|
|
||||||
qWarning() << "blkid: unknown file system type " << s << " on " << partitionPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
blkid_put_cache(cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
return rval;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reads the label for this FileSystem
|
/** Reads the label for this FileSystem
|
||||||
|
|
|
@ -49,6 +49,7 @@ public:
|
||||||
virtual CoreBackendDevice* openDeviceExclusive(const QString& device_node) override;
|
virtual CoreBackendDevice* openDeviceExclusive(const QString& device_node) override;
|
||||||
virtual bool closeDevice(CoreBackendDevice* core_device) override;
|
virtual bool closeDevice(CoreBackendDevice* core_device) override;
|
||||||
virtual Device* scanDevice(const QString& device_node) override;
|
virtual Device* scanDevice(const QString& device_node) override;
|
||||||
|
virtual FileSystem::Type detectFileSystem(const QString& deviceNode) override {return FileSystem::Unknown;}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,6 +39,8 @@
|
||||||
#include "util/globallog.h"
|
#include "util/globallog.h"
|
||||||
#include "util/helpers.h"
|
#include "util/helpers.h"
|
||||||
|
|
||||||
|
#include <blkid/blkid.h>
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
@ -318,7 +320,12 @@ void LibPartedBackend::scanDevicePartitions(Device& d, PedDisk* pedDisk)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
PartitionRole::Roles r = PartitionRole::None;
|
PartitionRole::Roles r = PartitionRole::None;
|
||||||
FileSystem::Type type = detectFileSystem(pedPartition);
|
|
||||||
|
char* pedPath = ped_partition_get_path(pedPartition);
|
||||||
|
FileSystem::Type type = FileSystem::Unknown;
|
||||||
|
if (pedPath)
|
||||||
|
type = detectFileSystem(QString::fromUtf8(pedPath));
|
||||||
|
free(pedPath);
|
||||||
|
|
||||||
switch (pedPartition->type) {
|
switch (pedPartition->type) {
|
||||||
case PED_PARTITION_NORMAL:
|
case PED_PARTITION_NORMAL:
|
||||||
|
@ -470,6 +477,65 @@ QList<Device*> LibPartedBackend::scanDevices(bool excludeReadOnly)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Detects the type of a FileSystem given a PedDevice and a PedPartition
|
||||||
|
@param pedPartition pointer to the pedPartition. Must not be nullptr
|
||||||
|
@return the detected FileSystem type (FileSystem::Unknown if not detected)
|
||||||
|
*/
|
||||||
|
FileSystem::Type LibPartedBackend::detectFileSystem(const QString& partitionPath)
|
||||||
|
{
|
||||||
|
FileSystem::Type rval = FileSystem::Unknown;
|
||||||
|
|
||||||
|
blkid_cache cache;
|
||||||
|
if (blkid_get_cache(&cache, nullptr) == 0) {
|
||||||
|
blkid_dev dev;
|
||||||
|
|
||||||
|
if ((dev = blkid_get_dev(cache,
|
||||||
|
partitionPath.toLocal8Bit().constData(),
|
||||||
|
BLKID_DEV_NORMAL)) != nullptr) {
|
||||||
|
QString s = QString::fromUtf8(blkid_get_tag_value(cache,
|
||||||
|
"TYPE",
|
||||||
|
partitionPath.toLocal8Bit().constData()));
|
||||||
|
|
||||||
|
if (s == QStringLiteral("ext2")) rval = FileSystem::Ext2;
|
||||||
|
else if (s == QStringLiteral("ext3")) rval = FileSystem::Ext3;
|
||||||
|
else if (s.startsWith(QStringLiteral("ext4"))) rval = FileSystem::Ext4;
|
||||||
|
else if (s == QStringLiteral("swap")) rval = FileSystem::LinuxSwap;
|
||||||
|
else if (s == QStringLiteral("ntfs")) rval = FileSystem::Ntfs;
|
||||||
|
else if (s == QStringLiteral("reiserfs")) rval = FileSystem::ReiserFS;
|
||||||
|
else if (s == QStringLiteral("reiser4")) rval = FileSystem::Reiser4;
|
||||||
|
else if (s == QStringLiteral("xfs")) rval = FileSystem::Xfs;
|
||||||
|
else if (s == QStringLiteral("jfs")) rval = FileSystem::Jfs;
|
||||||
|
else if (s == QStringLiteral("hfs")) rval = FileSystem::Hfs;
|
||||||
|
else if (s == QStringLiteral("hfsplus")) rval = FileSystem::HfsPlus;
|
||||||
|
else if (s == QStringLiteral("ufs")) rval = FileSystem::Ufs;
|
||||||
|
else if (s == QStringLiteral("vfat")) {
|
||||||
|
// libblkid uses SEC_TYPE to distinguish between FAT16 and FAT32
|
||||||
|
QString st = QString::fromUtf8(blkid_get_tag_value(cache,
|
||||||
|
"SEC_TYPE",
|
||||||
|
partitionPath.toLocal8Bit().constData()));
|
||||||
|
if (st == QStringLiteral("msdos"))
|
||||||
|
rval = FileSystem::Fat16;
|
||||||
|
else
|
||||||
|
rval = FileSystem::Fat32;
|
||||||
|
} else if (s == QStringLiteral("btrfs")) rval = FileSystem::Btrfs;
|
||||||
|
else if (s == QStringLiteral("ocfs2")) rval = FileSystem::Ocfs2;
|
||||||
|
else if (s == QStringLiteral("zfs_member")) rval = FileSystem::Zfs;
|
||||||
|
else if (s == QStringLiteral("hpfs")) rval = FileSystem::Hpfs;
|
||||||
|
else if (s == QStringLiteral("crypto_LUKS")) rval = FileSystem::Luks;
|
||||||
|
else if (s == QStringLiteral("exfat")) rval = FileSystem::Exfat;
|
||||||
|
else if (s == QStringLiteral("nilfs2")) rval = FileSystem::Nilfs2;
|
||||||
|
else if (s == QStringLiteral("LVM2_member")) rval = FileSystem::Lvm2_PV;
|
||||||
|
else if (s == QStringLiteral("f2fs")) rval = FileSystem::F2fs;
|
||||||
|
else
|
||||||
|
qWarning() << "blkid: unknown file system type " << s << " on " << partitionPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
blkid_put_cache(cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
CoreBackendDevice* LibPartedBackend::openDevice(const QString& device_node)
|
CoreBackendDevice* LibPartedBackend::openDevice(const QString& device_node)
|
||||||
{
|
{
|
||||||
LibPartedDevice* device = new LibPartedDevice(device_node);
|
LibPartedDevice* device = new LibPartedDevice(device_node);
|
||||||
|
@ -499,24 +565,6 @@ bool LibPartedBackend::closeDevice(CoreBackendDevice* core_device)
|
||||||
return core_device->close();
|
return core_device->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Detects the type of a FileSystem given a PedDevice and a PedPartition
|
|
||||||
@param pedPartition pointer to the pedPartition. Must not be nullptr
|
|
||||||
@return the detected FileSystem type (FileSystem::Unknown if not detected)
|
|
||||||
*/
|
|
||||||
FileSystem::Type LibPartedBackend::detectFileSystem(PedPartition* pedPartition)
|
|
||||||
{
|
|
||||||
FileSystem::Type rval = FileSystem::Unknown;
|
|
||||||
|
|
||||||
char* pedPath = ped_partition_get_path(pedPartition);
|
|
||||||
|
|
||||||
if (pedPath)
|
|
||||||
rval = FileSystem::detectFileSystem(QString::fromUtf8(pedPath));
|
|
||||||
|
|
||||||
free(pedPath);
|
|
||||||
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
||||||
PedPartitionFlag LibPartedBackend::getPedFlag(PartitionTable::Flag flag)
|
PedPartitionFlag LibPartedBackend::getPedFlag(PartitionTable::Flag flag)
|
||||||
{
|
{
|
||||||
for (quint32 i = 0; i < sizeof(flagmap) / sizeof(flagmap[0]); i++)
|
for (quint32 i = 0; i < sizeof(flagmap) / sizeof(flagmap[0]); i++)
|
||||||
|
|
|
@ -66,13 +66,13 @@ public:
|
||||||
virtual bool closeDevice(CoreBackendDevice* core_device) override;
|
virtual bool closeDevice(CoreBackendDevice* core_device) override;
|
||||||
virtual Device* scanDevice(const QString& device_node) override;
|
virtual Device* scanDevice(const QString& device_node) override;
|
||||||
virtual QList<Device*> scanDevices(bool excludeReadOnly = false) override;
|
virtual QList<Device*> scanDevices(bool excludeReadOnly = false) override;
|
||||||
|
virtual FileSystem::Type detectFileSystem(const QString& partitionPath) override;
|
||||||
|
|
||||||
static QString lastPartedExceptionMessage();
|
static QString lastPartedExceptionMessage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static FileSystem::Type detectFileSystem(PedPartition* pedPartition);
|
|
||||||
static PedPartitionFlag getPedFlag(PartitionTable::Flag flag);
|
static PedPartitionFlag getPedFlag(PartitionTable::Flag flag);
|
||||||
static void scanDevicePartitions(Device& d, PedDisk* pedDisk);
|
void scanDevicePartitions(Device& d, PedDisk* pedDisk);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -299,14 +299,15 @@ FileSystem::Type LibPartedPartitionTable::detectFileSystemBySector(Report& repor
|
||||||
{
|
{
|
||||||
PedPartition* pedPartition = ped_disk_get_partition_by_sector(pedDisk(), sector);
|
PedPartition* pedPartition = ped_disk_get_partition_by_sector(pedDisk(), sector);
|
||||||
|
|
||||||
FileSystem::Type rval = FileSystem::Unknown;
|
char* pedPath = ped_partition_get_path(pedPartition);
|
||||||
|
FileSystem::Type type = FileSystem::Unknown;
|
||||||
if (pedPartition)
|
if (pedPartition && pedPath)
|
||||||
rval = LibPartedBackend::detectFileSystem(pedPartition);
|
type = CoreBackendManager::self()->backend()->detectFileSystem(QString::fromUtf8(pedPath));
|
||||||
else
|
else
|
||||||
report.line() << xi18nc("@info/plain", "Could not determine file system of partition at sector %1 on device <filename>%2</filename>.", sector, device.deviceNode());
|
report.line() << xi18nc("@info/plain", "Could not determine file system of partition at sector %1 on device <filename>%2</filename>.", sector, device.deviceNode());
|
||||||
|
free(pedPath);
|
||||||
|
|
||||||
return rval;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LibPartedPartitionTable::setPartitionSystemType(Report& report, const Partition& partition)
|
bool LibPartedPartitionTable::setPartitionSystemType(Report& report, const Partition& partition)
|
||||||
|
|
Loading…
Reference in New Issue