File indexing completed on 2024-05-05 05:48:47

0001 /*
0002     SPDX-FileCopyrightText: 2008-2010 Volker Lanz <vl@fidra.de>
0003     SPDX-FileCopyrightText: 2013-2018 Andrius Štikonas <andrius@stikonas.eu>
0004     SPDX-FileCopyrightText: 2019 Yuri Chornoivan <yurchor@ukr.net>
0005     SPDX-FileCopyrightText: 2020 Arnaud Ferraris <arnaud.ferraris@collabora.com>
0006     SPDX-FileCopyrightText: 2020 Gaël PORTAY <gael.portay@collabora.com>
0007 
0008     SPDX-License-Identifier: GPL-3.0-or-later
0009 */
0010 
0011 #include "fs/reiser4.h"
0012 
0013 #include "util/capacity.h"
0014 #include "util/externalcommand.h"
0015 
0016 #include <QRegularExpression>
0017 #include <QStringList>
0018 
0019 namespace FS
0020 {
0021 FileSystem::CommandSupportType reiser4::m_GetUsed = FileSystem::cmdSupportNone;
0022 FileSystem::CommandSupportType reiser4::m_GetLabel = FileSystem::cmdSupportNone;
0023 FileSystem::CommandSupportType reiser4::m_Create = FileSystem::cmdSupportNone;
0024 FileSystem::CommandSupportType reiser4::m_Move = FileSystem::cmdSupportNone;
0025 FileSystem::CommandSupportType reiser4::m_Check = FileSystem::cmdSupportNone;
0026 FileSystem::CommandSupportType reiser4::m_Copy = FileSystem::cmdSupportNone;
0027 FileSystem::CommandSupportType reiser4::m_Backup = FileSystem::cmdSupportNone;
0028 
0029 reiser4::reiser4(qint64 firstsector, qint64 lastsector, qint64 sectorsused, const QString& label, const QVariantMap& features) :
0030     FileSystem(firstsector, lastsector, sectorsused, label, features, FileSystem::Type::Reiser4)
0031 {
0032 }
0033 
0034 void reiser4::init()
0035 {
0036     m_GetLabel = cmdSupportCore;
0037     m_GetUsed = findExternal(QStringLiteral("debugfs.reiser4"), {}, 16) ? cmdSupportFileSystem : cmdSupportNone;
0038     m_Create = findExternal(QStringLiteral("mkfs.reiser4"), {}, 16) ? cmdSupportFileSystem : cmdSupportNone;
0039     m_Check = findExternal(QStringLiteral("fsck.reiser4"), {}, 16) ? cmdSupportFileSystem : cmdSupportNone;
0040     m_Move = m_Copy = (m_Check != cmdSupportNone) ? cmdSupportCore : cmdSupportNone;
0041     m_Backup = cmdSupportCore;
0042 }
0043 
0044 bool reiser4::supportToolFound() const
0045 {
0046     return
0047         m_GetUsed != cmdSupportNone &&
0048         m_GetLabel != cmdSupportNone &&
0049 //          m_SetLabel != cmdSupportNone &&
0050         m_Create != cmdSupportNone &&
0051         m_Check != cmdSupportNone &&
0052 //          m_UpdateUUID != cmdSupportNone &&
0053 //          m_Grow != cmdSupportNone &&
0054 //          m_Shrink != cmdSupportNone &&
0055         m_Copy != cmdSupportNone &&
0056         m_Move != cmdSupportNone &&
0057         m_Backup != cmdSupportNone;
0058 //          m_GetUUID != cmdSupportNone;
0059 }
0060 
0061 FileSystem::SupportTool reiser4::supportToolName() const
0062 {
0063     return SupportTool(QStringLiteral("reiser4progs"), QUrl(QStringLiteral("https://github.com/edward6/reiser4progs")));
0064 }
0065 
0066 qint64 reiser4::maxCapacity() const
0067 {
0068     // looks like it's actually unknown. see
0069     // https://en.wikipedia.org/wiki/Comparison_of_file_systems
0070     return Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::EiB);
0071 }
0072 
0073 int reiser4::maxLabelLength() const
0074 {
0075     return 16;
0076 }
0077 
0078 qint64 reiser4::readUsedCapacity(const QString& deviceNode) const
0079 {
0080     ExternalCommand cmd(QStringLiteral("debugfs.reiser4"), { deviceNode });
0081 
0082     if (cmd.run(-1) && cmd.exitCode() == 16) {
0083         qint64 blocks = -1;
0084         QRegularExpression re(QStringLiteral("blocks:\\s+(\\d+)"));
0085         QRegularExpressionMatch reBlocks = re.match(cmd.output());
0086 
0087         if (reBlocks.hasMatch())
0088             blocks = reBlocks.captured(1).toLongLong();
0089 
0090         qint64 blockSize = -1;
0091         re.setPattern(QStringLiteral("blksize:\\s+(\\d+)"));
0092         QRegularExpressionMatch reBlockSize = re.match(cmd.output());
0093 
0094         if (reBlockSize.hasMatch())
0095             blockSize = reBlockSize.captured(1).toLongLong();
0096 
0097         qint64 freeBlocks = -1;
0098         re.setPattern(QStringLiteral("free blocks:\\s+(\\d+)"));
0099         QRegularExpressionMatch reFreeBlocks = re.match(cmd.output());
0100 
0101         if (reFreeBlocks.hasMatch())
0102             freeBlocks = reFreeBlocks.captured(1).toLongLong();
0103 
0104         if (blocks > - 1 && blockSize > -1 && freeBlocks > -1)
0105             return (blocks - freeBlocks) * blockSize;
0106     }
0107 
0108     return -1;
0109 }
0110 
0111 bool reiser4::check(Report& report, const QString& deviceNode) const
0112 {
0113     ExternalCommand cmd(report, QStringLiteral("fsck.reiser4"), { QStringLiteral("--yes"), QStringLiteral("--fix"), deviceNode });
0114     return cmd.run(-1) && cmd.exitCode() == 0;
0115 }
0116 
0117 bool reiser4::create(Report& report, const QString& deviceNode)
0118 {
0119     ExternalCommand cmd(report, QStringLiteral("mkfs.reiser4"), { QStringLiteral("--yes"), QStringLiteral("--force"), deviceNode });
0120     return cmd.run(-1) && cmd.exitCode() == 0;
0121 }
0122 }