diff --git a/src/fs/CMakeLists.txt b/src/fs/CMakeLists.txt --- a/src/fs/CMakeLists.txt +++ b/src/fs/CMakeLists.txt @@ -23,6 +23,7 @@ fs/luks.cpp fs/luks2.cpp fs/lvm2_pv.cpp + fs/minix.cpp fs/nilfs2.cpp fs/ntfs.cpp fs/ocfs2.cpp @@ -61,6 +62,7 @@ fs/luks.h fs/luks2.h fs/lvm2_pv.h + fs/minix.h fs/nilfs2.h fs/ntfs.h fs/ocfs2.h diff --git a/src/fs/filesystem.h b/src/fs/filesystem.h --- a/src/fs/filesystem.h +++ b/src/fs/filesystem.h @@ -94,6 +94,7 @@ LinuxRaidMember, BitLocker, Apfs, + Minix, __lastType }; diff --git a/src/fs/filesystem.cpp b/src/fs/filesystem.cpp --- a/src/fs/filesystem.cpp +++ b/src/fs/filesystem.cpp @@ -72,6 +72,7 @@ QColor( 255,100,100 ), // linux_raid_member QColor( 110,20,50 ), // bitlocker QColor( 255,155,174 ), // apfs + QColor( 0,170,255 ), // minix } }; @@ -452,6 +453,7 @@ kxi18nc("@item filesystem name", "linux_raid_member"), kxi18nc("@item filesystem name", "BitLocker"), kxi18nc("@item filesystem name", "apfs"), + kxi18nc("@item filesystem name", "minix"), }; return s; diff --git a/src/fs/filesystemfactory.cpp b/src/fs/filesystemfactory.cpp --- a/src/fs/filesystemfactory.cpp +++ b/src/fs/filesystemfactory.cpp @@ -41,6 +41,7 @@ #include "fs/luks.h" #include "fs/luks2.h" #include "fs/lvm2_pv.h" +#include "fs/minix.h" #include "fs/nilfs2.h" #include "fs/ntfs.h" #include "fs/ocfs2.h" @@ -86,6 +87,7 @@ m_FileSystems.insert(FileSystem::Type::Luks, new FS::luks(-1, -1, -1, QString())); m_FileSystems.insert(FileSystem::Type::Luks2, new FS::luks2(-1, -1, -1, QString())); m_FileSystems.insert(FileSystem::Type::Lvm2_PV, new FS::lvm2_pv(-1, -1, -1, QString())); + m_FileSystems.insert(FileSystem::Type::Minix, new FS::minix(-1, -1, -1, QString())); m_FileSystems.insert(FileSystem::Type::Nilfs2, new FS::nilfs2(-1, -1, -1, QString())); m_FileSystems.insert(FileSystem::Type::Ntfs, new FS::ntfs(-1, -1, -1, QString())); m_FileSystems.insert(FileSystem::Type::Ocfs2, new FS::ocfs2(-1, -1, -1, QString())); @@ -139,6 +141,7 @@ case FileSystem::Type::Luks: fs = new FS::luks (firstsector, lastsector, sectorsused, label); break; case FileSystem::Type::Luks2: fs = new FS::luks2 (firstsector, lastsector, sectorsused, label); break; case FileSystem::Type::Lvm2_PV: fs = new FS::lvm2_pv (firstsector, lastsector, sectorsused, label); break; + case FileSystem::Type::Minix: fs = new FS::minix (firstsector, lastsector, sectorsused, label); break; case FileSystem::Type::Nilfs2: fs = new FS::nilfs2 (firstsector, lastsector, sectorsused, label); break; case FileSystem::Type::Ntfs: fs = new FS::ntfs (firstsector, lastsector, sectorsused, label); break; case FileSystem::Type::Ocfs2: fs = new FS::ocfs2 (firstsector, lastsector, sectorsused, label); break; diff --git a/src/fs/minix.h b/src/fs/minix.h new file mode 100644 --- /dev/null +++ b/src/fs/minix.h @@ -0,0 +1,91 @@ + /************************************************************************* + * Copyright (C) 2019 by Shubham * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 3 of * + * the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see .* + *************************************************************************/ + +#ifndef KPMCORE_MINIX_H +#define KPMCORE_MINIX_H + +#include "fs/filesystem.h" + +#include "util/libpartitionmanagerexport.h" + +class Report; + +namespace FS +{ +/** A minix(Mini Unix) file system. + @author Shubham + */ +class LIBKPMCORE_EXPORT minix : public FileSystem +{ +public: + minix(qint64 firstsector, qint64 lastsector, qint64 sectorsused, const QString& label); + + void init() override; + + bool check(Report& report, const QString&deviceNode) const override; + bool create(Report& report, const QString&deviceNode) override; + + CommandSupportType supportGetLabel() const override { + return m_GetLabel; + } + + CommandSupportType supportGetUsed() const override { + return m_GetUsed; + } + + CommandSupportType supportShrink() const override { + return m_Shrink; + } + + CommandSupportType supportMove() const override { + return m_Move; + } + + CommandSupportType supportCheck() const override { + return m_Check; + } + + CommandSupportType supportCreate() const override { + return m_Create; + } + + CommandSupportType supportCopy() const override { + return m_Copy; + } + + CommandSupportType supportBackup() const override { + return m_Backup; + } + + qint64 maxCapacity() const override; + int maxLabelLength() const override; + SupportTool supportToolName() const override; + bool supportToolFound() const override; + +public: + static CommandSupportType m_GetLabel; + static CommandSupportType m_GetUsed; + static CommandSupportType m_Shrink; + static CommandSupportType m_Move; + static CommandSupportType m_Create; + static CommandSupportType m_Check; + static CommandSupportType m_Copy; + static CommandSupportType m_Backup; +}; +} + +#endif diff --git a/src/fs/minix.cpp b/src/fs/minix.cpp new file mode 100644 --- /dev/null +++ b/src/fs/minix.cpp @@ -0,0 +1,86 @@ + /************************************************************************* + * Copyright (C) 2019 by Shubham * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 3 of * + * the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see .* + *************************************************************************/ + +#include "fs/minix.h" + +#include "util/capacity.h" +#include "util/externalcommand.h" + +namespace FS +{ +FileSystem::CommandSupportType minix::m_GetLabel = FileSystem::cmdSupportNone; +FileSystem::CommandSupportType minix::m_GetUsed = FileSystem::cmdSupportNone; +FileSystem::CommandSupportType minix::m_Shrink = FileSystem::cmdSupportNone; +FileSystem::CommandSupportType minix::m_Move = FileSystem::cmdSupportNone; +FileSystem::CommandSupportType minix::m_Check = FileSystem::cmdSupportNone; +FileSystem::CommandSupportType minix::m_Create = FileSystem::cmdSupportNone; +FileSystem::CommandSupportType minix::m_Copy = FileSystem::cmdSupportNone; +FileSystem::CommandSupportType minix::m_Backup = FileSystem::cmdSupportNone; + +minix::minix(qint64 firstsector, qint64 lastsector, qint64 sectorsused, const QString& label) : + FileSystem(firstsector, lastsector, sectorsused, label, FileSystem::Type::Minix) +{ +} + +void minix::init() +{ + m_Check = findExternal(QStringLiteral("fsck.minix"), {}, 16) ? cmdSupportFileSystem : cmdSupportNone; + m_Create = findExternal(QStringLiteral("mkfs.minix"), {}, 16) ? cmdSupportFileSystem : cmdSupportNone; + m_Copy = (m_Check != cmdSupportNone) ? cmdSupportCore : cmdSupportNone; + m_Move = (m_Check != cmdSupportNone) ? cmdSupportCore : cmdSupportNone; + m_Backup = cmdSupportCore; + m_GetLabel = cmdSupportCore; +} + +bool minix::supportToolFound() const +{ + return m_GetLabel != cmdSupportNone && + m_Create != cmdSupportNone && + m_Check != cmdSupportNone && + m_Copy != cmdSupportNone && + m_Move != cmdSupportNone && + m_Backup != cmdSupportNone; +} + +FileSystem::SupportTool minix::supportToolName() const +{ + return SupportTool(QStringLiteral("util-linux"), QUrl(QStringLiteral("https://www.kernel.org/pub/linux/utils/util-linux/"))); +} + +qint64 minix::maxCapacity() const +{ + return 4 * Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::GiB); +} + +int minix::maxLabelLength() const +{ + return 63; +} + +bool minix::check(Report& report, const QString& deviceNode) const +{ + ExternalCommand cmd(report, QStringLiteral("fsck.minix"), { deviceNode }); + return cmd.run(-1) && cmd.exitCode() == 0; +} + +bool minix::create(Report& report, const QString& deviceNode) +{ + ExternalCommand cmd(report, QStringLiteral("mkfs.minix"), { QStringLiteral("-3"), deviceNode }); + return cmd.run(-1) && cmd.exitCode() == 0; +} + +} diff --git a/src/plugins/sfdisk/sfdiskbackend.cpp b/src/plugins/sfdisk/sfdiskbackend.cpp --- a/src/plugins/sfdisk/sfdiskbackend.cpp +++ b/src/plugins/sfdisk/sfdiskbackend.cpp @@ -461,6 +461,7 @@ else if (s == QStringLiteral("linux_raid_member")) rval = FileSystem::Type::LinuxRaidMember; else if (s == QStringLiteral("BitLocker")) rval = FileSystem::Type::BitLocker; else if (s == QStringLiteral("apfs")) rval = FileSystem::Type::Apfs; + else if (s == QStringLiteral("minix")) rval = FileSystem::Type::Minix; else qWarning() << "unknown file system type " << s << " on " << partitionPath; } diff --git a/src/util/externalcommand_whitelist.h b/src/util/externalcommand_whitelist.h --- a/src/util/externalcommand_whitelist.h +++ b/src/util/externalcommand_whitelist.h @@ -69,6 +69,8 @@ QStringLiteral("swapoff"), QStringLiteral("cryptsetup"), QStringLiteral("dmsetup"), +QStringLiteral("fsck.minix"), +QStringLiteral("mkfs.minix"), QStringLiteral("fsck.nilfs2"), QStringLiteral("mkfs.nilfs2"), QStringLiteral("nilfs-tune"),