diff --git a/src/core/partition.cpp b/src/core/partition.cpp index 5feaf85..5c8c200 100644 --- a/src/core/partition.cpp +++ b/src/core/partition.cpp @@ -1,5 +1,6 @@ /************************************************************************* * Copyright (C) 2008 by Volker Lanz * + * Copyright (C) 2015 by Teo Mrnjavac * * Copyright (C) 2016 by Andrius Štikonas * * * * This program is free software; you can redistribute it and/or * @@ -293,7 +294,7 @@ bool Partition::mount(Report& report) bool success = false; if (fileSystem().canMount(deviceNode())) - success = fileSystem().mount(deviceNode()); + success = fileSystem().mount(deviceNode(), mountPoint()); else { ExternalCommand mountCmd(report, QStringLiteral("mount"), QStringList() << QStringLiteral("-v") << deviceNode() << mountPoint()); if (mountCmd.run() && mountCmd.exitCode() == 0) @@ -322,7 +323,11 @@ bool Partition::unmount(Report& report) setMountPoint(QString()); } else { - ExternalCommand umountCmd(report, QStringLiteral("umount"), QStringList() << QStringLiteral("-v") << deviceNode()); + ExternalCommand umountCmd(report, + QStringLiteral("umount"), + { QStringLiteral("-v"), + QStringLiteral("-A"), + deviceNode() }); if (!umountCmd.run() || umountCmd.exitCode() != 0) success = false; } diff --git a/src/fs/filesystem.cpp b/src/fs/filesystem.cpp index f327ff7..b3e233c 100644 --- a/src/fs/filesystem.cpp +++ b/src/fs/filesystem.cpp @@ -1,5 +1,6 @@ /************************************************************************* * Copyright (C) 2012 by Volker Lanz * + * Copyright (C) 2015 by Teo Mrnjavac * * Copyright (C) 2016 by Andrius Štikonas * * * * This program is free software; you can redistribute it and/or * @@ -22,8 +23,10 @@ #include "util/capacity.h" #include + #include +#include const std::array< QColor, FileSystem::__lastType > FileSystem::defaultColorCode = { @@ -105,6 +108,61 @@ static QString readBlkIdValue(const QString& deviceNode, const QString& tag) return rval; } +FileSystem::Type FileSystem::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; +} + /** Reads the label for this FileSystem @param deviceNode the device node for the Partition the FileSystem is on @return the FileSystem label or an empty string in case of error @@ -387,8 +445,9 @@ void FileSystem::move(qint64 newStartSector) @param mountPoint the mount point to mount the FileSystem on @return true on success */ -bool FileSystem::mount(const QString& mountPoint) +bool FileSystem::mount(const QString &deviceNode, const QString &mountPoint) { + Q_UNUSED(deviceNode); Q_UNUSED(mountPoint); return false; diff --git a/src/fs/filesystem.h b/src/fs/filesystem.h index ecc093a..28a8324 100644 --- a/src/fs/filesystem.h +++ b/src/fs/filesystem.h @@ -1,5 +1,6 @@ /************************************************************************* * Copyright (C) 2012 by Volker Lanz * + * Copyright (C) 2015 by Teo Mrnjavac * * Copyright (C) 2016 by Andrius Štikonas * * * * This program is free software; you can redistribute it and/or * @@ -172,6 +173,7 @@ public: static QString nameForType(FileSystem::Type t); static QList types(); static FileSystem::Type typeForName(const QString& s); + static FileSystem::Type detectFileSystem(const QString& partitionPath); virtual bool canMount(const QString&) const { return false; /**< @return true if this FileSystem can be mounted */ @@ -183,8 +185,8 @@ public: virtual QString mountTitle() const; virtual QString unmountTitle() const; - virtual bool mount(const QString& mountPoint); - virtual bool unmount(const QString& mountPoint); + virtual bool mount(const QString& deviceNode, const QString& mountPoint); + virtual bool unmount(const QString& deviceNode); qint64 firstSector() const { return m_FirstSector; /**< @return the FileSystem's first sector */ diff --git a/src/fs/linuxswap.cpp b/src/fs/linuxswap.cpp index c1b0284..ddabaa9 100644 --- a/src/fs/linuxswap.cpp +++ b/src/fs/linuxswap.cpp @@ -131,8 +131,10 @@ QString linuxswap::unmountTitle() const return i18nc("@title:menu", "Deactivate swap"); } -bool linuxswap::mount(const QString& deviceNode) +bool linuxswap::mount(const QString& deviceNode, const QString& mountPoint) { + Q_UNUSED(mountPoint); + ExternalCommand cmd(QStringLiteral("swapon"), QStringList() << deviceNode); return cmd.run(-1) && cmd.exitCode() == 0; } diff --git a/src/fs/linuxswap.h b/src/fs/linuxswap.h index c4beef6..e7010df 100644 --- a/src/fs/linuxswap.h +++ b/src/fs/linuxswap.h @@ -55,11 +55,11 @@ public: return true; } - virtual bool mount(const QString& deviceNode); - virtual bool unmount(const QString& deviceNode); + virtual bool mount(const QString& deviceNode, const QString& mountPoint) override; + virtual bool unmount(const QString& deviceNode) override; - virtual QString mountTitle() const; - virtual QString unmountTitle() const; + virtual QString mountTitle() const override; + virtual QString unmountTitle() const override; virtual CommandSupportType supportCreate() const { return m_Create; diff --git a/src/fs/luks.cpp b/src/fs/luks.cpp index 7782e11..4daa45a 100644 --- a/src/fs/luks.cpp +++ b/src/fs/luks.cpp @@ -1,6 +1,7 @@ /************************************************************************* * Copyright (C) 2012 by Volker Lanz * * Copyright (C) 2013 by Andrius Štikonas * + * Copyright (C) 2015 by Teo Mrnjavac * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * @@ -18,11 +19,14 @@ #include "fs/luks.h" +#include "fs/filesystemfactory.h" + #include "gui/decryptluksdialog.h" #include "util/capacity.h" #include "util/externalcommand.h" +#include #include #include #include @@ -45,11 +49,22 @@ FileSystem::CommandSupportType luks::m_SetLabel = FileSystem::cmdSupportNone; FileSystem::CommandSupportType luks::m_UpdateUUID = FileSystem::cmdSupportNone; FileSystem::CommandSupportType luks::m_GetUUID = FileSystem::cmdSupportNone; -luks::luks(qint64 firstsector, qint64 lastsector, qint64 sectorsused, const QString& label) : - FileSystem(firstsector, lastsector, sectorsused, label, FileSystem::Luks) +luks::luks(qint64 firstsector, + qint64 lastsector, + qint64 sectorsused, + const QString& label) + : FileSystem(firstsector, lastsector, sectorsused, label, FileSystem::Luks) + , m_innerFs(nullptr) + , m_isCryptOpen(false) + , m_isMounted(false) { } +luks::~luks() +{ + delete m_innerFs; +} + void luks::init() { m_UpdateUUID = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; @@ -88,39 +103,236 @@ qint64 luks::minCapacity() const QString luks::mountTitle() const { - return i18nc("@title:menu", "Decrypt"); + return i18nc("@title:menu", "Mount"); } QString luks::unmountTitle() const +{ + return i18nc("@title:menu", "Unmount"); +} + +QString luks::cryptOpenTitle() const +{ + return i18nc("@title:menu", "Decrypt"); +} + +QString luks::cryptCloseTitle() const { return i18nc("@title:menu", "Deactivate"); } -bool luks::mount(const QString& deviceNode) +bool luks::canMount(const QString& deviceNode) const { - QPointer dlg = new DecryptLuksDialog(0, deviceNode); //TODO: parent widget instead of 0 + return m_isCryptOpen && + !m_isMounted && + m_innerFs && + m_innerFs->canMount(deviceNode); +} - if (dlg->exec() == QDialog::Accepted) +bool luks::canUnmount(const QString& deviceNode) const +{ + return m_isCryptOpen && + m_isMounted && + m_innerFs && + m_innerFs->canUnmount(deviceNode); +} + +bool luks::isMounted() const +{ + return m_isCryptOpen && m_isMounted; +} + +bool luks::canCryptOpen(const QString&) const +{ + return !m_isCryptOpen && !m_isMounted; +} + +bool luks::canCryptClose(const QString&) const +{ + return m_isCryptOpen && !m_isMounted; +} + +bool luks::isCryptOpen() const +{ + return m_isCryptOpen; +} + +bool luks::cryptOpen(const QString& deviceNode) +{ + if (m_isCryptOpen) { - std::vector commands; - commands.push_back(QStringLiteral("echo")); - commands.push_back(QStringLiteral("cryptsetup")); - std::vector args; - args.push_back(QStringList() << dlg->luksPassphrase().text()); - args.push_back(QStringList() << QStringLiteral("luksOpen") << deviceNode << dlg->luksName().text()); - ExternalCommand cmd(commands, args); - delete dlg; - return cmd.run(-1) && cmd.exitCode() == 0; + if (!mapperName(deviceNode).isEmpty()) + { + qWarning() << "LUKS device" << deviceNode + << "already decrypted." + << "Cannot decrypt again."; + return false; + } + else + { + qWarning() << "LUKS device" << deviceNode + << "reportedly decrypted but mapper node not found." + << "Marking device as NOT decrypted and trying to " + "decrypt again anyway."; + m_isCryptOpen = false; + } } + QPointer dlg = new DecryptLuksDialog(0, deviceNode); //TODO: parent widget instead of 0 + + if (dlg->exec() != QDialog::Accepted) + { + delete dlg; + return false; + } + + std::vector commands; + commands.push_back(QStringLiteral("echo")); + commands.push_back(QStringLiteral("cryptsetup")); + std::vector args; + args.push_back(QStringList() << dlg->luksPassphrase().text()); + args.push_back(QStringList() << QStringLiteral("luksOpen") << deviceNode << dlg->luksName().text()); delete dlg; + + ExternalCommand cmd(commands, args); + if (!(cmd.run(-1) && cmd.exitCode() == 0)) + return false; + + if (m_innerFs) + { + delete m_innerFs; + m_innerFs = nullptr; + } + + QString mapperNode = mapperName(deviceNode); + if (mapperNode.isEmpty()) + return false; + + FileSystem::Type innerFsType = detectFileSystem(mapperNode); + m_innerFs = FileSystemFactory::cloneWithNewType(innerFsType, + *this); + + m_isCryptOpen = (m_innerFs != nullptr); + + if (m_isCryptOpen) + return true; + return false; +} + +bool luks::cryptClose(const QString& deviceNode) +{ + if (!m_isCryptOpen) + { + qWarning() << "Cannot close LUKS device" << deviceNode + << "because it's not open."; + return false; + } + + if (m_isMounted) + { + qWarning() << "Cannot close LUKS device" << deviceNode + << "because the filesystem is mounted."; + return false; + } + + ExternalCommand cmd(QStringLiteral("cryptsetup"), QStringList() << QStringLiteral("luksClose") << mapperName(deviceNode)); + if (!(cmd.run(-1) && cmd.exitCode() == 0)) + return false; + + delete m_innerFs; + m_innerFs = nullptr; + + m_isCryptOpen = (m_innerFs != nullptr); + + if (!m_isCryptOpen) + return true; + return false; +} + +bool luks::mount(const QString& deviceNode, const QString& mountPoint) +{ + if (!m_isCryptOpen) + { + qWarning() << "Cannot mount device" << deviceNode + << "before decrypting it first."; + return false; + } + + if (m_isMounted) + { + qWarning() << "Cannot mount device" << deviceNode + << "because it's already mounted."; + return false; + } + + Q_ASSERT(m_innerFs); + + QString mapperNode = mapperName(deviceNode); + if (mapperNode.isEmpty()) + return false; + + if (m_innerFs->canMount(mapperNode)) + { + if (m_innerFs->mount(mapperNode, mountPoint)) + { + m_isMounted = true; + return true; + } + } + else { + ExternalCommand mountCmd( + QStringLiteral("mount"), + { QStringLiteral("-v"), mapperNode, mountPoint }); + if (mountCmd.run() && mountCmd.exitCode() == 0) + { + m_isMounted = true; + return true; + } + } return false; } bool luks::unmount(const QString& deviceNode) { - ExternalCommand cmd(QStringLiteral("cryptsetup"), QStringList() << QStringLiteral("luksClose") << mapperName(deviceNode)); - return cmd.run(-1) && cmd.exitCode() == 0; + if (!m_isCryptOpen) + { + qWarning() << "Cannot unmount device" << deviceNode + << "before decrypting it first."; + return false; + } + + if (!m_isMounted) + { + qWarning() << "Cannot unmount device" << deviceNode + << "because it's not mounted."; + return false; + } + + Q_ASSERT(m_innerFs); + + QString mapperNode = mapperName(deviceNode); + if (mapperNode.isEmpty()) + return false; + + if (m_innerFs->canUnmount(mapperNode)) + { + if (m_innerFs->unmount(mapperNode)) + { + m_isMounted = false; + return true; + } + } + else { + ExternalCommand unmountCmd( + QStringLiteral("mount"), + { QStringLiteral("-v"), QStringLiteral("-A"), mapperNode }); + if (unmountCmd.run() && unmountCmd.exitCode() == 0) + { + m_isMounted = false; + return true; + } + } + return false; } QString luks::readUUID(const QString& deviceNode) const @@ -140,16 +352,6 @@ bool luks::updateUUID(Report& report, const QString& deviceNode) const return cmd.run(-1) && cmd.exitCode() == 0; } -bool luks::canMount(const QString&) const -{ - return true; -} - -bool luks::canUnmount(const QString&) const -{ - return true; -} - QString luks::mapperName(const QString& deviceNode) { ExternalCommand cmd(QStringLiteral("find"), QStringList() << QStringLiteral("/dev/mapper/") << QStringLiteral("-exec") << QStringLiteral("cryptsetup") << QStringLiteral("status") << QStringLiteral("{}") << QStringLiteral(";")); diff --git a/src/fs/luks.h b/src/fs/luks.h index 2a0b80e..949585c 100644 --- a/src/fs/luks.h +++ b/src/fs/luks.h @@ -1,6 +1,7 @@ /************************************************************************* * Copyright (C) 2012 by Volker Lanz * * Copyright (C) 2013 by Andrius Štikonas * + * Copyright (C) 2015 by Teo Mrnjavac * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * @@ -24,7 +25,8 @@ #include "../fs/filesystem.h" -#include +#include +#include class Report; @@ -39,6 +41,7 @@ class LIBKPMCORE_EXPORT luks : public FileSystem { public: luks(qint64 firstsector, qint64 lastsector, qint64 sectorsused, const QString& label); + virtual ~luks(); public: static void init(); @@ -86,13 +89,24 @@ public: virtual QString readUUID(const QString& deviceNode) const; virtual bool updateUUID(Report& report, const QString& deviceNode) const; + virtual QString mountTitle() const override; + virtual QString unmountTitle() const override; + QString cryptOpenTitle() const; + QString cryptCloseTitle() const; + virtual bool canMount(const QString&) const; virtual bool canUnmount(const QString&) const; + bool isMounted() const; - virtual bool mount(const QString& deviceNode); - virtual bool unmount(const QString& deviceNode); - virtual QString mountTitle() const; - virtual QString unmountTitle() const; + bool canCryptOpen(const QString& deviceNode) const; + bool canCryptClose(const QString& deviceNode) const; + bool isCryptOpen() const; + + bool cryptOpen(const QString& deviceNode); + bool cryptClose(const QString& deviceNode); + + virtual bool mount(const QString& deviceNode, const QString& mountPoint) override; + virtual bool unmount(const QString& deviceNode) override; static QString mapperName(const QString& deviceNode); @@ -115,6 +129,12 @@ public: static CommandSupportType m_SetLabel; static CommandSupportType m_UpdateUUID; static CommandSupportType m_GetUUID; + +private: + FileSystem* m_innerFs; + + bool m_isCryptOpen; + bool m_isMounted; }; } diff --git a/src/plugins/libparted/CMakeLists.txt b/src/plugins/libparted/CMakeLists.txt index ec14b15..3471fa0 100644 --- a/src/plugins/libparted/CMakeLists.txt +++ b/src/plugins/libparted/CMakeLists.txt @@ -29,7 +29,7 @@ file (GLOB pmlibpartedbackendplugin_SRCS *.cpp) add_library(pmlibpartedbackendplugin SHARED ${pmlibpartedbackendplugin_SRCS}) -target_link_libraries(pmlibpartedbackendplugin kpmcore ${LIBPARTED_LIBS} ${BLKID_LIBRARIES} KF5::KIOCore KF5::I18n) +target_link_libraries(pmlibpartedbackendplugin kpmcore ${LIBPARTED_LIBS} KF5::KIOCore KF5::I18n) install(TARGETS pmlibpartedbackendplugin DESTINATION ${KDE_INSTALL_PLUGINDIR}) kcoreaddons_desktop_to_json(pmlibpartedbackendplugin pmlibpartedbackendplugin.desktop) diff --git a/src/plugins/libparted/libpartedbackend.cpp b/src/plugins/libparted/libpartedbackend.cpp index 0560f8d..7021ae5 100644 --- a/src/plugins/libparted/libpartedbackend.cpp +++ b/src/plugins/libparted/libpartedbackend.cpp @@ -1,7 +1,7 @@ /************************************************************************* * Copyright (C) 2008-2012 by Volker Lanz * + * Copyright (C) 2015-2016 by Teo Mrnjavac * * Copyright (C) 2016 by Andrius Štikonas * - * Copyright (C) 2016 by Teo Mrnjavac * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * @@ -50,7 +50,6 @@ #include #include -#include K_PLUGIN_FACTORY_WITH_JSON(LibPartedBackendFactory, "pmlibpartedbackendplugin.json", registerPlugin();) @@ -354,8 +353,10 @@ void LibPartedBackend::scanDevicePartitions(PedDevice*, Device& d, PedDisk* pedD QString mountPoint; bool mounted; if (fs->type() == FileSystem::Luks) { - mountPoint = FS::luks::mapperName(node); - mounted = (mountPoint != QString()) ? true : false; + mounted = dynamic_cast(fs)->isMounted(); + mountPoint = mountPoints.findByDevice(FS::luks::mapperName(node)) ? + mountPoints.findByDevice(FS::luks::mapperName(node))->mountPoint() : + QString(); } else { mountPoint = mountPoints.findByDevice(node) ? mountPoints.findByDevice(node)->mountPoint() : QString(); mounted = ped_partition_is_busy(pedPartition); @@ -486,50 +487,12 @@ FileSystem::Type LibPartedBackend::detectFileSystem(PedPartition* pedPartition) { FileSystem::Type rval = FileSystem::Unknown; - blkid_cache cache; - char* pedPath = nullptr; + char* pedPath = ped_partition_get_path(pedPartition); - if (blkid_get_cache(&cache, nullptr) == 0 && (pedPath = ped_partition_get_path(pedPartition))) { - blkid_dev dev; + if (pedPath) + rval = FileSystem::detectFileSystem(QString::fromUtf8(pedPath)); - if ((dev = blkid_get_dev(cache, pedPath, BLKID_DEV_NORMAL)) != nullptr) { - QString s = QString::fromUtf8(blkid_get_tag_value(cache, "TYPE", pedPath)); - 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", pedPath)); - 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 " << pedPath; - } - - blkid_put_cache(cache); - - free(pedPath); - } + free(pedPath); return rval; } diff --git a/src/plugins/libparted/libpartedbackend.h b/src/plugins/libparted/libpartedbackend.h index 7f1e38a..f4853af 100644 --- a/src/plugins/libparted/libpartedbackend.h +++ b/src/plugins/libparted/libpartedbackend.h @@ -1,5 +1,6 @@ /************************************************************************* * Copyright (C) 2008, 2010 by Volker Lanz * + * Copyright (C) 2015 by Teo Mrnjavac * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index c8b2ea3..443afad 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -1,3 +1,5 @@ +set_source_files_properties( util/ismounted.c PROPERTIES LANGUAGE CXX ) + set(UTIL_SRC util/capacity.cpp util/externalcommand.cpp @@ -5,6 +7,7 @@ set(UTIL_SRC util/helpers.cpp util/htmlreport.cpp util/report.cpp + util/ismounted.c ) set(UTIL_LIB_HDRS diff --git a/src/util/helpers.cpp b/src/util/helpers.cpp index 9a17311..fd81e2e 100644 --- a/src/util/helpers.cpp +++ b/src/util/helpers.cpp @@ -18,6 +18,7 @@ #include "util/helpers.h" #include "../util/globallog.h" +#include "../util/ismounted.h" #include "../ops/operation.h" @@ -67,3 +68,8 @@ void showColumnsContextMenu(const QPoint& p, QTreeWidget& tree) tree.resizeColumnToContents(action->data().toInt()); } } + +bool isMounted(const QString& deviceNode) +{ + return is_mounted(deviceNode.toLatin1().constData()); +} diff --git a/src/util/helpers.h b/src/util/helpers.h index fe033ad..9d549df 100644 --- a/src/util/helpers.h +++ b/src/util/helpers.h @@ -19,11 +19,10 @@ #define HELPERS__H -#include "../util/libpartitionmanagerexport.h" - #include "../fs/filesystem.h" -class KAboutData; +#include "../util/libpartitionmanagerexport.h" + class QString; class QPoint; class QTreeWidget; @@ -36,4 +35,6 @@ LIBKPMCORE_EXPORT void showColumnsContextMenu(const QPoint& p, QTreeWidget& tree LIBKPMCORE_EXPORT bool checkAccessibleDevices(); +LIBKPMCORE_EXPORT bool isMounted(const QString& deviceNode); + #endif