From 30eb6751fecf288ecf94ef00772adbd4faaf0c49 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Sat, 24 Nov 2012 14:20:19 -0500 Subject: [PATCH] Add Block:Id property This persistent and unique id is useful for a bunch of things, for example Disks' benchmark dialog can use it as the filename for saving benchmarking data for a block device (Disks is currently deriving the filename from looking at symlinks). Signed-off-by: David Zeuthen --- data/org.freedesktop.UDisks2.xml | 26 ++++++++++++++++ doc/udisks2-sections.txt | 3 ++ src/udiskslinuxblock.c | 64 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/data/org.freedesktop.UDisks2.xml b/data/org.freedesktop.UDisks2.xml index d8c956b..bc1b5fd 100644 --- a/data/org.freedesktop.UDisks2.xml +++ b/data/org.freedesktop.UDisks2.xml @@ -792,6 +792,32 @@ + + + diff --git a/doc/udisks2-sections.txt b/doc/udisks2-sections.txt index 78913cd..af28d7f 100644 --- a/doc/udisks2-sections.txt +++ b/doc/udisks2-sections.txt @@ -1103,6 +1103,7 @@ udisks_block_get_id_uuid udisks_block_get_id_version udisks_block_get_device_number udisks_block_get_preferred_device +udisks_block_get_id udisks_block_get_size udisks_block_get_read_only udisks_block_get_symlinks @@ -1124,6 +1125,7 @@ udisks_block_dup_id_usage udisks_block_dup_id_uuid udisks_block_dup_id_version udisks_block_dup_preferred_device +udisks_block_dup_id udisks_block_dup_symlinks udisks_block_dup_hint_name udisks_block_dup_hint_icon_name @@ -1140,6 +1142,7 @@ udisks_block_set_id_uuid udisks_block_set_id_version udisks_block_set_device_number udisks_block_set_preferred_device +udisks_block_set_id udisks_block_set_size udisks_block_set_read_only udisks_block_set_symlinks diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c index 43ebf37..de9fca3 100644 --- a/src/udiskslinuxblock.c +++ b/src/udiskslinuxblock.c @@ -719,10 +719,13 @@ udisks_linux_block_update (UDisksLinuxBlock *block, const gchar *device_file; const gchar *const *symlinks; const gchar *preferred_device_file; + const gchar *id_device_file; + gboolean media_removable = FALSE; guint64 size; gboolean media_available; gboolean media_change_detected; gboolean read_only; + guint n; drive = NULL; @@ -792,7 +795,6 @@ udisks_linux_block_update (UDisksLinuxBlock *block, preferred_device_file = NULL; if (g_str_has_prefix (device_file, "/dev/dm-")) { - guint n; const gchar *dm_name; gchar *dm_name_dev_file = NULL; const gchar *dm_name_dev_file_as_symlink = NULL; @@ -825,7 +827,6 @@ udisks_linux_block_update (UDisksLinuxBlock *block, md_name = g_udev_device_get_property (device->udev_device, "MD_NAME"); if (md_name != NULL) { - guint n; gchar *md_name_dev_file = NULL; const gchar *sep; const gchar *md_name_dev_file_as_symlink = NULL; @@ -869,6 +870,65 @@ udisks_linux_block_update (UDisksLinuxBlock *block, udisks_block_set_drive (iface, "/"); } + if (drive != NULL) + media_removable = udisks_drive_get_media_removable (drive); + + id_device_file = NULL; + if (media_removable) + { + /* Drive with removable media: determine id by finding a + * suitable /dev/disk/by-uuid symlink (fall back to + * /dev/disk/by-label) + * + * TODO: add features to ata_id / cdrom_id in systemd to extract + * medium identiers (at optical discs have these) and add + * udev rules to create symlinks in something like + * /dev/disk/by-medium. Then use said symlinks to for the + * id_device_file + */ + for (n = 0; symlinks != NULL && symlinks[n] != NULL; n++) + { + if (g_str_has_prefix (symlinks[n], "/dev/disk/by-uuid/")) + { + id_device_file = symlinks[n]; + break; + } + else if (g_str_has_prefix (symlinks[n], "/dev/disk/by-label/")) + { + id_device_file = symlinks[n]; + } + } + } + else + { + /* Drive without removable media: determine id by finding a + * suitable /dev/disk/by-id symlink + */ + for (n = 0; symlinks != NULL && symlinks[n] != NULL; n++) + { + if (g_str_has_prefix (symlinks[n], "/dev/disk/by-id/")) + { + id_device_file = symlinks[n]; + break; + } + } + } + if (id_device_file != NULL) + { + gchar *id = g_strdup (id_device_file + strlen ("/dev/disk/")); + for (n = 0; id[n] != '\0'; n++) + { + if (id[n] == '/' || id[n] == ' ') + id[n] = '-'; + } + udisks_block_set_id (iface, id); + g_free (id); + } + else + { + udisks_block_set_id (iface, NULL); + } + udisks_block_set_id_usage (iface, g_udev_device_get_property (device->udev_device, "ID_FS_USAGE")); udisks_block_set_id_type (iface, g_udev_device_get_property (device->udev_device, "ID_FS_TYPE")); s = udisks_decode_udev_string (g_udev_device_get_property (device->udev_device, "ID_FS_VERSION")); -- 2.7.4