solid: hack to get storage devices accessibility signal when it is mounted/unmounted by external process

stat() is just useless for files in /proc meaning the only way to know when
/etc/mtab (or /proc/self/mounts) changes is to re-read it, you know who to
blame for that

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2023-06-14 01:53:05 +03:00
parent 044df213ec
commit 4b7d958de5
2 changed files with 38 additions and 1 deletions

View file

@ -28,8 +28,18 @@
using namespace Solid::Backends::UDev;
StorageAccess::StorageAccess(UDevDevice *device)
: DeviceInterface(device)
: DeviceInterface(device),
m_isaccessible(false)
{
m_isaccessible = isAccessible();
// NOTE: stat() always returns the same result for it if actually in /proc/self/mounts
m_mtabfile.setFileName("/etc/mtab");
if (m_mtabfile.open(QFile::ReadOnly)) {
m_mtabtimer.setInterval(2000);
m_mtabtimer.start();
QObject::connect(&m_mtabtimer, SIGNAL(timeout()), this, SLOT(slotEmitSignals()));
}
}
StorageAccess::~StorageAccess()
@ -127,3 +137,18 @@ bool StorageAccess::teardown()
emit teardownDone(replyvalue, Solid::errorString(replyvalue), m_device->udi());
return (replyvalue == Solid::NoError);
}
void StorageAccess::slotEmitSignals()
{
const QByteArray previousmtabdata = m_mtabdata;
m_mtabfile.seek(0);
m_mtabdata = m_mtabfile.readAll();
// qDebug() << Q_FUNC_INFO << m_mtabdata;
if (previousmtabdata != m_mtabdata) {
const bool previousisaccessible = m_isaccessible;
m_isaccessible = isAccessible();
if (previousisaccessible != m_isaccessible) {
emit accessibilityChanged(m_isaccessible, m_device->udi());
}
}
}

View file

@ -24,6 +24,9 @@
#include <solid/ifaces/storageaccess.h>
#include "udevdeviceinterface.h"
#include <QFile>
#include <QTimer>
namespace Solid
{
namespace Backends
@ -51,6 +54,15 @@ Q_SIGNALS:
void teardownDone(Solid::ErrorType error, QVariant data, const QString &udi);
void setupRequested(const QString &udi);
void teardownRequested(const QString &udi);
private Q_SLOTS:
void slotEmitSignals();
private:
QTimer m_mtabtimer;
QFile m_mtabfile;
QByteArray m_mtabdata;
bool m_isaccessible;
};
}
}