Make the Size property on BlockDevice be 0 if no media is available
authorDavid Zeuthen <davidz@redhat.com>
Thu, 10 Mar 2011 17:19:04 +0000 (12:19 -0500)
committerDavid Zeuthen <davidz@redhat.com>
Thu, 10 Mar 2011 17:19:04 +0000 (12:19 -0500)
Also unify code for determing device size for Lun and BlockDevice.

Signed-off-by: David Zeuthen <davidz@redhat.com>
doc/udisks2-sections.txt
src/types.h
src/udisksdaemonutil.c
src/udisksdaemonutil.h
src/udiskslinuxblock.c
src/udiskslinuxlun.c

index beb80be..7be8755 100644 (file)
@@ -255,4 +255,5 @@ udisks_persistent_store_get_type
 <FILE>udisksdaemonutil</FILE>
 udisks_decode_udev_string
 udisks_safe_append_to_object_path
+udisks_daemon_util_block_get_size
 </SECTION>
index 99b22fc..938359b 100644 (file)
@@ -24,6 +24,7 @@
 #include <gio/gio.h>
 #include <polkit/polkit.h>
 #include <udisks/udisks.h>
+#include <gudev/gudev.h>
 #include <gdbusobjectmanager.h>
 
 #include <sys/types.h>
index 2e2462c..7c1f7ff 100644 (file)
 
 #include "config.h"
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
 #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;
+}
+
index 980349a..31ddc08 100644 (file)
@@ -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
 
index b90b93f..73e3e3d 100644 (file)
@@ -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"))
     {
index 99c0da6..6a1a9af 100644 (file)
 
 #include "config.h"
 
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
 #include <string.h>
 
 #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: