Blob Blame History Raw
From f76e1b0b637e53af64ecd813e8541019e50bb8bb Mon Sep 17 00:00:00 2001
From: Joris Guisson <joris.guisson@gmail.com>
Date: Mon, 24 Sep 2012 11:07:44 +0200
Subject: [PATCH 1/9] Backport to 1.3: Add workaround for broken handling of
 btrfs subvolumes by solid

CCBUG: 306825
---
 ChangeLog            |  3 +++
 src/util/fileops.cpp | 65 ++++++++++++++++++++++++++++++++++------------------
 2 files changed, 46 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fe2cc21..c037d28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+Changes in 1.3.1:
+- Add workaround for broken handling of btrfs subvolumes by solid (306825)
+
 Changes in 1.3:
 - Do not pass link local IPv6 addresses to ip parameter of tracker (305187)
 
diff --git a/src/util/fileops.cpp b/src/util/fileops.cpp
index 637074d..1e5d7d5 100644
--- a/src/util/fileops.cpp
+++ b/src/util/fileops.cpp
@@ -30,12 +30,15 @@
 #include <kio/copyjob.h> 
 #include <solid/device.h>
 #include <solid/storageaccess.h>
+#include <solid/storagedrive.h>
+#include <solid/storagevolume.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <fcntl.h>
-#include <qdir.h>
-#include <qfile.h>
-#include <qstringlist.h>
+#include <QDir>
+#include <QFile>
+#include <QStringList>
+#include <QSet>
 #include "error.h"
 #include "log.h"
 #include "file.h"
@@ -73,12 +76,14 @@ typedef	int64_t		__s64;
 #endif
 
 #ifndef Q_WS_WIN
+#include <mntent.h>
 #include <sys/statvfs.h>
 #endif
 #ifdef CopyFile
 #undef CopyFile
 #endif
 
+
 namespace bt
 {
 	void MakeDir(const QString & dir,bool nothrow)
@@ -619,38 +624,54 @@ namespace bt
 		return ret;
 	}
 	
-	QString MountPoint(const QString& path)
+	QSet<QString> AccessibleMountPoints()
 	{
-		QList<Solid::Device> devs = Solid::Device::listFromType(Solid::DeviceInterface::StorageAccess);
-		QString mountpoint;
+        QSet<QString> result;
+#ifndef Q_WS_WIN
+		FILE* fptr = setmntent("/proc/mounts", "r");
+		if(!fptr)
+			return result;
+
+		struct mntent mnt;
+		char buf[PATH_MAX];
+		while(getmntent_r(fptr, &mnt, buf, PATH_MAX))
+		{
+			result.insert(QString(mnt.mnt_dir));
+		}
 		
+		endmntent(fptr);
+		
+#else
+		QList<Solid::Device> devs = Solid::Device::listFromType(Solid::DeviceInterface::StorageAccess);
 		foreach (Solid::Device dev,devs)
 		{
 			Solid::StorageAccess* sa = dev.as<Solid::StorageAccess>();
-			if (path.startsWith(sa->filePath()))
+			if(!sa->filePath().isEmpty() && sa->isAccessible())
+				result.insert(sa->filePa());
+		}
+#endif
+		return result;
+	}
+	
+	QString MountPoint(const QString& path)
+	{
+        QSet<QString> mount_points = AccessibleMountPoints();
+		QString mount_point;
+		foreach (const QString & mp, mount_points)
+        {
+            if (path.startsWith(mp) && (mount_point.isEmpty() || mp.startsWith(mount_point)))
 			{
-				if (mountpoint.isEmpty() || sa->filePath().startsWith(mountpoint))
-					mountpoint = sa->filePath();
+				mount_point = mp;
 			}
 		}
 		
-		return mountpoint;
+		return mount_point;
 	}
 
+
 	bool IsMounted(const QString& mount_point)
 	{
-		QList<Solid::Device> devs = Solid::Device::listFromType(Solid::DeviceInterface::StorageAccess);
-		
-		foreach (Solid::Device dev,devs)
-		{
-			Solid::StorageAccess* sa = dev.as<Solid::StorageAccess>();
-			if (sa->filePath() == mount_point)
-			{
-				return sa->isAccessible();
-			}
-		}
-		
-		return false;
+		return AccessibleMountPoints().contains(mount_point);
 	}
 
 }
-- 
1.8.0.2