From ca29a38fc08033f6b3e379351b490aa4976e5073 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Thu, 10 Mar 2011 12:19:04 -0500 Subject: [PATCH] Make the Size property on BlockDevice be 0 if no media is available Also unify code for determing device size for Lun and BlockDevice. Signed-off-by: David Zeuthen --- doc/udisks2-sections.txt | 1 + src/types.h | 1 + src/udisksdaemonutil.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ src/udisksdaemonutil.h | 3 +++ src/udiskslinuxblock.c | 2 +- src/udiskslinuxlun.c | 52 +------------------------------------------- 6 files changed, 63 insertions(+), 52 deletions(-) diff --git a/doc/udisks2-sections.txt b/doc/udisks2-sections.txt index beb80be..7be8755 100644 --- a/doc/udisks2-sections.txt +++ b/doc/udisks2-sections.txt @@ -255,4 +255,5 @@ udisks_persistent_store_get_type udisksdaemonutil udisks_decode_udev_string udisks_safe_append_to_object_path +udisks_daemon_util_block_get_size diff --git a/src/types.h b/src/types.h index 99b22fc..938359b 100644 --- a/src/types.h +++ b/src/types.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include diff --git a/src/udisksdaemonutil.c b/src/udisksdaemonutil.c index 2e2462c..7c1f7ff 100644 --- a/src/udisksdaemonutil.c +++ b/src/udisksdaemonutil.c @@ -20,6 +20,10 @@ #include "config.h" +#include +#include +#include + #include "udisksdaemonutil.h" /** @@ -135,3 +139,55 @@ udisks_safe_append_to_object_path (GString *str, } } } + +/** + * udisks_daemon_util_block_get_size: + * @device: A #GUdevDevice for a top-level block device. + * + * Gets the size of the @device top-level block device, checking for media in the process + * + * Returns: The size of @device or 0 if no media is available. + */ +guint64 +udisks_daemon_util_block_get_size (GUdevDevice *device) +{ + gboolean media_available; + + /* figuring out if media is available is a bit tricky */ + media_available = FALSE; + if (g_udev_device_get_sysfs_attr_as_boolean (device, "removable")) + { + /* never try to open optical drives (might cause the door to close) or + * floppy drives (makes noise) + */ + media_available = FALSE; + if (!(g_udev_device_get_property_as_boolean (device, "ID_CDROM") || + g_udev_device_get_property_as_boolean (device, "ID_DRIVE_FLOPPY"))) + { + gint fd; + fd = open (g_udev_device_get_device_file (device), O_RDONLY); + if (fd >= 0) + { + media_available = TRUE; + close (fd); + } + } + else + { + if (g_udev_device_get_property_as_boolean (device, "ID_CDROM_MEDIA")) + media_available = TRUE; + else + media_available = FALSE; + } + } + else + { + media_available = TRUE; + } + + if (media_available) + return g_udev_device_get_sysfs_attr_as_uint64 (device, "size") * 512; + else + return 0; +} + diff --git a/src/udisksdaemonutil.h b/src/udisksdaemonutil.h index 980349a..31ddc08 100644 --- a/src/udisksdaemonutil.h +++ b/src/udisksdaemonutil.h @@ -30,6 +30,9 @@ gchar *udisks_decode_udev_string (const gchar *str); void udisks_safe_append_to_object_path (GString *str, const gchar *s); +guint64 udisks_daemon_util_block_get_size (GUdevDevice *block_device); + + G_END_DECLS diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c index b90b93f..73e3e3d 100644 --- a/src/udiskslinuxblock.c +++ b/src/udiskslinuxblock.c @@ -498,7 +498,7 @@ block_device_update (UDisksLinuxBlock *block, udisks_block_device_set_symlinks (iface, symlinks); udisks_block_device_set_major (iface, major (dev)); udisks_block_device_set_minor (iface, minor (dev)); - udisks_block_device_set_size (iface, g_udev_device_get_sysfs_attr_as_uint64 (block->device, "size") * 512); + udisks_block_device_set_size (iface, udisks_daemon_util_block_get_size (block->device)); if (g_str_has_prefix (g_udev_device_get_name (block->device), "loop")) { diff --git a/src/udiskslinuxlun.c b/src/udiskslinuxlun.c index 99c0da6..6a1a9af 100644 --- a/src/udiskslinuxlun.c +++ b/src/udiskslinuxlun.c @@ -20,10 +20,6 @@ #include "config.h" -#include -#include -#include - #include #include "udisksdaemon.h" @@ -551,52 +547,6 @@ lun_set_media (UDisksLinuxLun *lun, } static void -lun_set_size (UDisksLinuxLun *lun, - UDisksLun *iface, - GUdevDevice *device) -{ - gboolean media_available; - - /* figuring out if media is available is a bit tricky */ - media_available = FALSE; - if (udisks_lun_get_media_removable (iface)) - { - /* never try to open optical drives (might cause the door to close) or - * floppy drives (makes noise) - */ - media_available = FALSE; - if (!(g_udev_device_get_property_as_boolean (device, "ID_CDROM") || - g_udev_device_get_property_as_boolean (device, "ID_DRIVE_FLOPPY"))) - { - gint fd; - fd = open (g_udev_device_get_device_file (device), O_RDONLY); - if (fd >= 0) - { - media_available = TRUE; - close (fd); - } - } - else - { - if (g_udev_device_get_property_as_boolean (device, "ID_CDROM_MEDIA")) - media_available = TRUE; - else - media_available = FALSE; - } - } - else - { - media_available = TRUE; - } - - if (media_available) - udisks_lun_set_size (iface, g_udev_device_get_sysfs_attr_as_uint64 (device, "size") * 512); - else - udisks_lun_set_size (iface, 0); -} - - -static void lun_set_rotation_rate (UDisksLinuxLun *lun, UDisksLun *iface, GUdevDevice *device) @@ -747,7 +697,7 @@ lun_update (UDisksLinuxLun *lun, /* common bits go here */ udisks_lun_set_media_removable (iface, g_udev_device_get_sysfs_attr_as_boolean (device, "removable")); - lun_set_size (lun, iface, device); + udisks_lun_set_size (iface, udisks_daemon_util_block_get_size (device)); lun_set_media (lun, iface, device); lun_set_rotation_rate (lun, iface, device); out: -- 2.7.4