summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2012-04-22 11:48:19 -0400
committerDavid Zeuthen <davidz@redhat.com>2012-04-22 12:00:03 -0400
commitc241b86cc74ce8ca13d9ee2b8d0b7cf15850cf71 (patch)
tree71df2dfd7af4a3796a8e96117e5cad41a41e6c97
parenta1f285ff0b5583b56b349303f42579f84add6c78 (diff)
downloadgvfs-c241b86cc74ce8ca13d9ee2b8d0b7cf15850cf71.tar.gz
udisks2: don't show drives from other seats and special-case seat "all"
If Drive:seat is "all" it means the drive is available on all seats. Signed-off-by: David Zeuthen <davidz@redhat.com>
-rw-r--r--monitor/udisks2/gvfsudisks2utils.c83
-rw-r--r--monitor/udisks2/gvfsudisks2utils.h2
-rw-r--r--monitor/udisks2/gvfsudisks2volume.c74
-rw-r--r--monitor/udisks2/gvfsudisks2volumemonitor.c47
4 files changed, 123 insertions, 83 deletions
diff --git a/monitor/udisks2/gvfsudisks2utils.c b/monitor/udisks2/gvfsudisks2utils.c
index 0dc8abe8..43d583ab 100644
--- a/monitor/udisks2/gvfsudisks2utils.c
+++ b/monitor/udisks2/gvfsudisks2utils.c
@@ -511,3 +511,86 @@ gvfs_udisks2_utils_spawn_finish (GAsyncResult *res,
return ret;
}
+/* ---------------------------------------------------------------------------------------------------- */
+
+#if defined(HAVE_LIBSYSTEMD_LOGIN)
+#include <systemd/sd-login.h>
+
+static const gchar *
+get_seat (void)
+{
+ static gsize once = 0;
+ static char *seat = NULL;
+
+ if (g_once_init_enter (&once))
+ {
+ char *session = NULL;
+ if (sd_pid_get_session (getpid (), &session) == 0)
+ {
+ sd_session_get_seat (session, &seat);
+ free (session);
+ /* we intentionally leak seat here... */
+ }
+ g_once_init_leave (&once, (gsize) 1);
+ }
+ return seat;
+}
+
+#else
+
+static const gchar *
+get_seat (void)
+{
+ return NULL;
+}
+
+#endif
+
+gboolean
+gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive)
+{
+ gboolean ret = FALSE;
+ const gchar *seat;
+ const gchar *drive_seat = NULL;
+
+ /* assume our own seat if we don't have seat-support or it doesn't work */
+ seat = get_seat ();
+ if (seat == NULL)
+ {
+ ret = TRUE;
+ goto out;
+ }
+
+ /* If the device is not tagged, assume that udisks does not have
+ * working seat-support... so just assume it's available at our
+ * seat.
+ *
+ * Note that seat support was added in udisks 1.95.0 (and so was the
+ * UDISKS_CHECK_VERSION macro) - for now, be compatible with older
+ * versions instead of bumping requirement in configure.ac
+ */
+#ifdef UDISKS_CHECK_VERSION
+# if UDISKS_CHECK_VERSION(1,95,0)
+ drive_seat = udisks_drive_get_seat (drive);
+# endif
+#endif
+ if (drive_seat == NULL || strlen (drive_seat) == 0)
+ {
+ ret = TRUE;
+ goto out;
+ }
+
+ /* "all" is special, it means the device is available on any seat */
+ if (g_strcmp0 (drive_seat, "all") == 0)
+ {
+ ret = TRUE;
+ goto out;
+ }
+
+ /* Otherwise, check if it's on our seat */
+ if (g_strcmp0 (seat, drive_seat) == 0)
+ ret = TRUE;
+
+ out:
+ return ret;
+}
diff --git a/monitor/udisks2/gvfsudisks2utils.h b/monitor/udisks2/gvfsudisks2utils.h
index 2b6dc3c2..1965883a 100644
--- a/monitor/udisks2/gvfsudisks2utils.h
+++ b/monitor/udisks2/gvfsudisks2utils.h
@@ -50,6 +50,8 @@ gboolean gvfs_udisks2_utils_spawn_finish (GAsyncResult *res,
gchar **out_standard_error,
GError **error);
+gboolean gvfs_udisks2_utils_is_drive_on_our_seat (UDisksDrive *drive);
+
G_END_DECLS
diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c
index 243dc148..a1c7fa41 100644
--- a/monitor/udisks2/gvfsudisks2volume.c
+++ b/monitor/udisks2/gvfsudisks2volume.c
@@ -36,41 +36,6 @@
#include "gvfsudisks2mount.h"
#include "gvfsudisks2utils.h"
-
-#if defined(HAVE_LIBSYSTEMD_LOGIN)
-#include <systemd/sd-login.h>
-
-static const gchar *
-get_seat (void)
-{
- static gsize once = 0;
- static char *seat = NULL;
-
- if (g_once_init_enter (&once))
- {
- char *session = NULL;
- if (sd_pid_get_session (getpid (), &session) == 0)
- {
- sd_session_get_seat (session, &seat);
- /* we intentionally leak seat here... */
- }
- g_once_init_leave (&once, (gsize) 1);
- }
- return seat;
-}
-
-#else
-
-static const gchar *
-get_seat (void)
-{
- return NULL;
-}
-
-#endif
-
-
-
typedef struct _GVfsUDisks2VolumeClass GVfsUDisks2VolumeClass;
struct _GVfsUDisks2VolumeClass
@@ -213,43 +178,6 @@ apply_options_from_fstab (GVfsUDisks2Volume *volume,
}
static gboolean
-drive_is_on_our_seat (UDisksDrive *drive)
-{
- gboolean ret = FALSE;
- const gchar *seat;
- const gchar *drive_seat = NULL;
-
- /* assume our own seat if we don't have seat-support or it doesn't work */
- seat = get_seat ();
- if (seat == NULL)
- {
- ret = TRUE;
- goto out;
- }
-
- /* Assume seat0 if a) device is not tagged; or b) udisks does not
- * have seat-support.
- *
- * Note that seat support was added in udisks 1.95.0 (and so was the
- * UDISKS_CHECK_VERSION macro) - for now, be compatible with older
- * versions instead of bumping requirement in configure.ac
- */
-#ifdef UDISKS_CHECK_VERSION
-# if UDISKS_CHECK_VERSION(1,95,0)
- drive_seat = udisks_drive_get_seat (drive);
-# endif
-#endif
- if (drive_seat == NULL || strlen (drive_seat) == 0)
- drive_seat = "seat0";
-
- if (g_strcmp0 (seat, drive_seat) == 0)
- ret = TRUE;
-
- out:
- return ret;
-}
-
-static gboolean
update_volume (GVfsUDisks2Volume *volume)
{
gboolean changed;
@@ -387,7 +315,7 @@ update_volume (GVfsUDisks2Volume *volume)
g_object_unref (media_icon);
/* Only automount drives attached to the same seat as we're running on */
- if (drive_is_on_our_seat (udisks_drive))
+ if (gvfs_udisks2_utils_is_drive_on_our_seat (udisks_drive))
{
/* Only automount filesystems from drives of known types/interconnects:
*
diff --git a/monitor/udisks2/gvfsudisks2volumemonitor.c b/monitor/udisks2/gvfsudisks2volumemonitor.c
index 1ea86b20..2826164e 100644
--- a/monitor/udisks2/gvfsudisks2volumemonitor.c
+++ b/monitor/udisks2/gvfsudisks2volumemonitor.c
@@ -805,6 +805,9 @@ should_include_volume_check_configuration (GVfsUDisks2VolumeMonitor *monitor,
return ret;
}
+static gboolean should_include_drive (GVfsUDisks2VolumeMonitor *monitor,
+ UDisksDrive *drive);
+
static gboolean
should_include_volume (GVfsUDisks2VolumeMonitor *monitor,
UDisksBlock *block,
@@ -813,12 +816,23 @@ should_include_volume (GVfsUDisks2VolumeMonitor *monitor,
gboolean ret = FALSE;
GDBusObject *object;
UDisksFilesystem *filesystem;
+ UDisksDrive *udisks_drive = NULL;
const gchar* const *mount_points;
/* Block:Ignore trumps everything */
if (udisks_block_get_hint_ignore (block))
goto out;
+ /* ignore the volume if the drive is ignored */
+ udisks_drive = udisks_client_get_drive_for_block (monitor->client, block);
+ if (udisks_drive != NULL)
+ {
+ if (!should_include_drive (monitor, udisks_drive))
+ {
+ goto out;
+ }
+ }
+
/* show encrypted volumes... */
if (g_strcmp0 (udisks_block_get_id_type (block), "crypto_LUKS") == 0)
{
@@ -879,6 +893,7 @@ should_include_volume (GVfsUDisks2VolumeMonitor *monitor,
ret = TRUE;
out:
+ g_clear_object (&udisks_drive);
return ret;
}
@@ -888,17 +903,26 @@ static gboolean
should_include_drive (GVfsUDisks2VolumeMonitor *monitor,
UDisksDrive *drive)
{
- /* NOTE: For now, we just include all detected drives. This is
- * probably wrong - non-removable drives without anything visible
- * (such RAID components) should probably not be shown. Then again,
- * the GNOME 3 user interface doesn't really show GDrive instances
- * except for in the computer:/// location in Nautilus.
- *
- * Therefore, if device is non-removable, maybe only show it, if it
- * has more visible devices... this is the gdu volume monitor
- * behavior.
+ gboolean ret = TRUE;
+
+ /* Don't include drives on other seats */
+ if (!gvfs_udisks2_utils_is_drive_on_our_seat (drive))
+ {
+ ret = FALSE;
+ goto out;
+ }
+
+ /* NOTE: For now, we just include a drive no matter its
+ * content. This may be wrong ... for example non-removable drives
+ * without anything visible (such RAID components) should probably
+ * not be shown. Then again, the GNOME 3 user interface doesn't
+ * really show GDrive instances except for in the computer:///
+ * location in Nautilus....
*/
- return TRUE;
+
+ out:
+
+ return ret;
}
/* ---------------------------------------------------------------------------------------------------- */
@@ -1743,6 +1767,9 @@ update_discs (GVfsUDisks2VolumeMonitor *monitor,
if (udisks_drive == NULL)
continue;
+ if (!should_include_drive (monitor, udisks_drive))
+ continue;
+
/* only consider blank and audio discs */
if (!(udisks_drive_get_optical_blank (udisks_drive) ||
udisks_drive_get_optical_num_audio_tracks (udisks_drive) > 0))