udisks2: add support for 'safely removing storage'
mountutils lacks implemention of ejecting storage on Linux. Add that to our own code (not to mountutils as it is hard to do DBus calls from there).
This commit is contained in:
3
debian/changelog
vendored
3
debian/changelog
vendored
@@ -2,8 +2,9 @@ rpi-imager (1.7.4.1) unstable; urgency=medium
|
||||
|
||||
* Advanced settings: fix creating files on FAT partition that are
|
||||
an exact multiple of cluster size.
|
||||
* Do you want to apply saved settings window: offer no option,
|
||||
* Do you want to apply saved settings window: offer 'no' option,
|
||||
without clearing settings.
|
||||
* Eject storage properly on Linux.
|
||||
|
||||
-- Floris Bos <bos@je-eigen-domein.nl> Fri, 24 Mar 2023 14:16:03 +0100
|
||||
|
||||
|
||||
@@ -775,7 +775,14 @@ void DownloadThread::_writeComplete()
|
||||
#endif
|
||||
|
||||
if (_ejectEnabled)
|
||||
{
|
||||
eject_disk(_filename.constData());
|
||||
#ifdef Q_OS_LINUX
|
||||
/* mountutils only implemented unmount and not eject on Linux. Do so through udisks2 */
|
||||
UDisks2Api udisks;
|
||||
udisks.ejectDrive(_filename);
|
||||
#endif
|
||||
}
|
||||
|
||||
emit success();
|
||||
}
|
||||
|
||||
@@ -244,6 +244,28 @@ void UDisks2Api::unmountDrive(const QString &device)
|
||||
_unmountDrive(devpath);
|
||||
}
|
||||
|
||||
void UDisks2Api::ejectDrive(const QString &device)
|
||||
{
|
||||
QString devpath = _resolveDevice(device);
|
||||
if (devpath.isEmpty())
|
||||
return;
|
||||
|
||||
_unmountDrive(devpath);
|
||||
::sync();
|
||||
|
||||
QDBusInterface blockdevice("org.freedesktop.UDisks2", devpath,
|
||||
"org.freedesktop.UDisks2.Block", QDBusConnection::systemBus());
|
||||
QString drivepath = blockdevice.property("Drive").value<QDBusObjectPath>().path();
|
||||
if (!drivepath.isEmpty() && drivepath != "/")
|
||||
{
|
||||
QDBusInterface drive("org.freedesktop.UDisks2", drivepath,
|
||||
"org.freedesktop.UDisks2.Drive", QDBusConnection::systemBus());
|
||||
QVariantMap ejectOptions;
|
||||
qDebug() << "Ejecting drive: " << drive.property("Id").toString();
|
||||
drive.call("Eject", ejectOptions);
|
||||
}
|
||||
}
|
||||
|
||||
QByteArrayList UDisks2Api::mountPoints(const QString &partitionDevice)
|
||||
{
|
||||
QString devpath = _resolveDevice(partitionDevice);
|
||||
|
||||
@@ -17,6 +17,7 @@ class UDisks2Api : public QObject
|
||||
public:
|
||||
explicit UDisks2Api(QObject *parent = nullptr);
|
||||
int authOpen(const QString &device, const QString &mode = "rw");
|
||||
void ejectDrive(const QString &device);
|
||||
bool formatDrive(const QString &device, bool mountAfterwards = true);
|
||||
QString mountDevice(const QString &device);
|
||||
void unmountDrive(const QString &device);
|
||||
|
||||
Reference in New Issue
Block a user