diff --git a/soliduiserver/soliduiserver.cpp b/soliduiserver/soliduiserver.cpp index 33d67924..480a407e 100644 --- a/soliduiserver/soliduiserver.cpp +++ b/soliduiserver/soliduiserver.cpp @@ -188,6 +188,7 @@ int SolidUiServer::mountDevice(const QString &udi) mountaction.setHelperID("org.kde.soliduiserver.mountunmounthelper"); mountaction.addArgument("device", devicenode); mountaction.addArgument("mountpoint", mountpoint); + mountaction.addArgument("fstype", storagevolume->fsType()); KAuth::ActionReply mountreply = mountaction.execute(); // qDebug() << "mount" << mountreply.errorCode() << mountreply.errorDescription(); diff --git a/soliduiserver/soliduiserver_helper.cpp b/soliduiserver/soliduiserver_helper.cpp index 6b3e36f5..4b40b2d3 100644 --- a/soliduiserver/soliduiserver_helper.cpp +++ b/soliduiserver/soliduiserver_helper.cpp @@ -26,7 +26,12 @@ #include #include -KAuth::ActionReply SolidUiServerHelper::cryptopen(QVariantMap parameters) +#ifdef Q_OS_LINUX +# include +# include +#endif + +KAuth::ActionReply SolidUiServerHelper::cryptopen(const QVariantMap ¶meters) { if (!parameters.contains("device") || !parameters.contains("name") || !parameters.contains("password")) { return KAuth::ActionReply::HelperErrorReply; @@ -64,7 +69,7 @@ KAuth::ActionReply SolidUiServerHelper::cryptopen(QVariantMap parameters) return errorreply; } -KAuth::ActionReply SolidUiServerHelper::cryptclose(QVariantMap parameters) +KAuth::ActionReply SolidUiServerHelper::cryptclose(const QVariantMap ¶meters) { if (!parameters.contains("name")) { return KAuth::ActionReply::HelperErrorReply; @@ -98,14 +103,50 @@ KAuth::ActionReply SolidUiServerHelper::cryptclose(QVariantMap parameters) return errorreply; } -KAuth::ActionReply SolidUiServerHelper::mount(QVariantMap parameters) +KAuth::ActionReply SolidUiServerHelper::mount(const QVariantMap ¶meters) { - if (!parameters.contains("device") || !parameters.contains("mountpoint")) { + if (!parameters.contains("device") || !parameters.contains("mountpoint") + || !parameters.contains("fstype")) { return KAuth::ActionReply::HelperErrorReply; } const QString device = parameters.value("device").toString(); const QString mountpoint = parameters.value("mountpoint").toString(); + const QString fstype = parameters.value("fstype").toString(); + +#ifdef Q_OS_LINUX + // NOTE: if the filesystem is not listed in /proc/filesystems then mount() will fail + bool isknownfs = false; + const QByteArray fstypebytes = fstype.toLocal8Bit(); + QFile filesystemsfile(QString::fromLatin1("/proc/filesystems")); + if (filesystemsfile.open(QFile::ReadOnly)) { + while (!filesystemsfile.atEnd()) { + const QByteArray filesystemsline = filesystemsfile.readLine().trimmed(); + if (filesystemsline.endsWith(QByteArray(" ") + fstypebytes)) { + isknownfs = true; + break; + } + } + } + if (isknownfs) { + const QByteArray devicebytes = device.toLocal8Bit(); + const QByteArray mountpointbytes = mountpoint.toLocal8Bit(); + const int mountresult = ::mount( + devicebytes.constData(), mountpointbytes.constData(), fstypebytes.constData(), + 0, NULL + ); + if (mountresult == 0) { + return KAuth::ActionReply::SuccessReply; + } + const int savederrno = errno; + // qDebug() << Q_FUNC_INFO << qt_error_string(savederrno); + KAuth::ActionReply errorreply(KAuth::ActionReply::HelperError); + errorreply.setErrorDescription(qt_error_string(savederrno)); + errorreply.setErrorCode(savederrno); + return errorreply; + } +#endif // Q_OS_LINUX + const QStringList mountargs = QStringList() << device << mountpoint; QProcess mountproc; mountproc.start("mount", mountargs); @@ -125,13 +166,26 @@ KAuth::ActionReply SolidUiServerHelper::mount(QVariantMap parameters) return errorreply; } -KAuth::ActionReply SolidUiServerHelper::unmount(QVariantMap parameters) +KAuth::ActionReply SolidUiServerHelper::unmount(const QVariantMap ¶meters) { if (!parameters.contains("mountpoint")) { return KAuth::ActionReply::HelperErrorReply; } const QString mountpoint = parameters.value("mountpoint").toString(); + +#ifdef Q_OS_LINUX + const QByteArray mountpointbytes = mountpoint.toLocal8Bit();; + const int umountresult = ::umount2(mountpointbytes.constData(), MNT_DETACH); + if (umountresult == 0) { + return KAuth::ActionReply::SuccessReply; + } + const int savederrno = errno; + KAuth::ActionReply errorreply(KAuth::ActionReply::HelperError); + errorreply.setErrorDescription(qt_error_string(savederrno)); + errorreply.setErrorCode(savederrno); + return errorreply; +#else const QStringList umountargs = QStringList() << mountpoint; QProcess umountproc; umountproc.start("umount", umountargs); @@ -149,6 +203,7 @@ KAuth::ActionReply SolidUiServerHelper::unmount(QVariantMap parameters) errorreply.setErrorDescription(umounterror); errorreply.setErrorCode(umountproc.exitCode()); return errorreply; +#endif // Q_OS_LINUX } KDE4_AUTH_HELPER_MAIN("org.kde.soliduiserver.mountunmounthelper", SolidUiServerHelper) diff --git a/soliduiserver/soliduiserver_helper.h b/soliduiserver/soliduiserver_helper.h index 8fcd41b4..49606413 100644 --- a/soliduiserver/soliduiserver_helper.h +++ b/soliduiserver/soliduiserver_helper.h @@ -29,10 +29,10 @@ class SolidUiServerHelper : public QObject { Q_OBJECT public Q_SLOTS: - ActionReply cryptopen(QVariantMap parameters); - ActionReply cryptclose(QVariantMap parameters); - ActionReply mount(QVariantMap parameters); - ActionReply unmount(QVariantMap parameters); + ActionReply cryptopen(const QVariantMap ¶meters); + ActionReply cryptclose(const QVariantMap ¶meters); + ActionReply mount(const QVariantMap ¶meters); + ActionReply unmount(const QVariantMap ¶meters); }; #endif // SOLIDUISERVER_HELPER_H