Skip to content

Commit

Permalink
Linux/udisks2/multi-file zip extraction: handle auto-mount better
Browse files Browse the repository at this point in the history
If mounting partition after FAT32 format fails, check if race
occurs in which the Linux distribution was faster in auto-mounting
the partition then we were in manually mounting it.
  • Loading branch information
maxnet committed Nov 20, 2021
1 parent 506330f commit 0f3a6a2
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
43 changes: 43 additions & 0 deletions linux/udisks2api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,16 @@ bool UDisks2Api::formatDrive(const QString &device, bool mountAfterwards)
qDebug() << "Mounted new file system at:" << mp;
return true;
}
else
{
/* Check if already auto-mounted */
auto mps = mountPoints(filesystem);
if (!mps.isEmpty())
{
qDebug() << "Was already auto-mounted at:" << mps;
return true;
}
}

QThread::sleep(1);
}
Expand Down Expand Up @@ -207,3 +217,36 @@ void UDisks2Api::unmountDrive(const QString &device)

_unmountDrive(devpath);
}

QByteArrayList UDisks2Api::mountPoints(const QString &partitionDevice)
{
QString devpath = _resolveDevice(partitionDevice);
if (devpath.isEmpty())
return QByteArrayList();

QDBusInterface filesystem("org.freedesktop.UDisks2", devpath,
"org.freedesktop.UDisks2.Filesystem", QDBusConnection::systemBus());
return mountPoints(filesystem);
}

QByteArrayList UDisks2Api::mountPoints(const QDBusInterface &filesystem)
{
QByteArrayList mps;

QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", filesystem.path(),
"org.freedesktop.DBus.Properties", "Get");
QVariantList args = {"org.freedesktop.UDisks2.Filesystem", "MountPoints"};
msg.setArguments(args);
QDBusMessage reply = QDBusConnection::systemBus().call(msg);
for (auto arg : reply.arguments())
{
arg.value<QDBusVariant>().variant().value<QDBusArgument>() >> mps;
}
for (auto &str : mps)
{
if (!str.isEmpty() && str.back() == '\0')
str.chop(1);
}

return mps;
}
3 changes: 3 additions & 0 deletions linux/udisks2api.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <QObject>
#include <QFile>
#include <QDBusInterface>

class UDisks2Api : public QObject
{
Expand All @@ -18,6 +19,8 @@ class UDisks2Api : public QObject
bool formatDrive(const QString &device, bool mountAfterwards = true);
QString mountDevice(const QString &device);
void unmountDrive(const QString &device);
QByteArrayList mountPoints(const QString &partitionDevice);
QByteArrayList mountPoints(const QDBusInterface &filesystem);

protected:
QString _resolveDevice(const QString &device);
Expand Down

0 comments on commit 0f3a6a2

Please sign in to comment.