File thunar-volman-use-udisks-hints.diff of Package thunar-volman
diff --git a/thunar-volman/tvm-block-device.c b/thunar-volman/tvm-block-device.c
index edb6cad..5397bbc 100644
--- a/thunar-volman/tvm-block-device.c
+++ b/thunar-volman/tvm-block-device.c
@@ -754,7 +754,44 @@ tvm_block_device_mount (TvmContext *context)
return FALSE;
}
-
+static gboolean
+tvm_block_device_removable (TvmContext *context)
+{
+ /* traverse sysfs to find out if the device has the removable flag set */
+ /* this would be much easier with udisks, but udisks2 dropped the udev */
+ /* property settings... */
+ const gchar *partn;
+ gchar *devpath;
+ gchar *removable;
+ gboolean ret = TRUE; /* default to handling the device */
+ partn = g_udev_device_get_property (context->device, "PARTN");
+ devpath = g_strdup(g_udev_device_get_property (context->device, "DEVPATH"));
+ if (! devpath)
+ goto out;
+ if (partn)
+ { /* partition, one directory up */
+ gchar *p = strrchr(devpath, '/');
+ if (! p)
+ goto out;
+ *p = 0;
+ }
+ removable = g_strdup_printf("/sys%s/removable", devpath);
+ if (removable)
+ {
+ gchar *contents;
+ if (g_file_get_contents(removable, &contents, NULL, NULL))
+ {
+ ret = (*contents == '1');
+ g_free (contents);
+ }
+ else
+ g_message("%s: g_file_get_contents of %s failed", __func__, removable);
+ g_free(removable);
+ }
+out:
+ g_free(devpath);
+ return ret;
+}
void
tvm_block_device_added (TvmContext *context)
@@ -763,11 +800,13 @@ tvm_block_device_added (TvmContext *context)
const gchar *id_type;
const gchar *media_state;
const gchar *id_fs_usage;
+ const gchar *udisks_nopolicy;
gboolean is_cdrom;
gboolean is_partition;
gboolean is_volume;
gboolean automount;
gboolean autoplay;
+ gboolean u_nopolicy;
guint64 audio_tracks;
guint64 data_tracks;
GError *error = NULL;
@@ -779,12 +818,28 @@ tvm_block_device_added (TvmContext *context)
devtype = g_udev_device_get_property (context->device, "DEVTYPE");
id_type = g_udev_device_get_property (context->device, "ID_TYPE");
id_fs_usage = g_udev_device_get_property (context->device, "ID_FS_USAGE");
+ udisks_nopolicy = g_udev_device_get_property (context->device, "UDISKS_PRESENTATION_NOPOLICY");
/* distinguish device types */
is_cdrom = (g_strcmp0 (id_type, "cd") == 0);
is_partition = (g_strcmp0 (devtype, "partition") == 0);
is_volume = (g_strcmp0 (devtype, "disk") == 0)
&& (g_strcmp0 (id_fs_usage, "filesystem") == 0);
+ u_nopolicy = (g_strcmp0 (udisks_nopolicy, "1") == 0);
+
+ /* if udisks properties are avaible, use them; if not, check the removable flag in sysfs */
+ if (udisks_nopolicy == NULL && !tvm_block_device_removable(context))
+ {
+ g_message("%s: non-removable device ignored", __func__);
+ tvm_device_handler_finished (context);
+ return;
+ }
+ if (u_nopolicy)
+ {
+ g_message("%s: ignoring device with UDISKS_PRESENTATION_NOPOLICY=1", __func__);
+ tvm_device_handler_finished (context);
+ return;
+ }
if (is_cdrom)
{