Daemon: Add new find_block_*() convenience methods
authorDavid Zeuthen <davidz@redhat.com>
Fri, 4 May 2012 18:19:44 +0000 (14:19 -0400)
committerDavid Zeuthen <davidz@redhat.com>
Fri, 4 May 2012 18:20:58 +0000 (14:20 -0400)
Signed-off-by: David Zeuthen <davidz@redhat.com>
doc/udisks2-sections.txt
src/udisksdaemon.c
src/udisksdaemon.h

index 471b483..f3b9d38 100644 (file)
@@ -93,6 +93,8 @@ UDisksDaemonWaitFunc
 udisks_daemon_wait_for_object_sync
 udisks_daemon_find_object
 udisks_daemon_find_block
+udisks_daemon_find_block_by_device_file
+udisks_daemon_find_block_by_sysfs_path
 udisks_daemon_launch_simple_job
 udisks_daemon_launch_spawned_job
 udisks_daemon_launch_spawned_job_sync
index 00aad6f..8cbc5c0 100644 (file)
@@ -37,6 +37,7 @@
 #include "udisksfstabentry.h"
 #include "udiskscrypttabmonitor.h"
 #include "udiskscrypttabentry.h"
+#include "udiskslinuxblockobject.h"
 
 /**
  * SECTION:udisksdaemon
@@ -983,6 +984,98 @@ udisks_daemon_find_block (UDisksDaemon *daemon,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+static gboolean
+wait_for_device_file_cb (UDisksDaemon  *daemon,
+                         UDisksObject  *object,
+                         gpointer       user_data)
+{
+  const gchar *device_file = user_data;
+  UDisksBlock *block = NULL;
+  gboolean ret = FALSE;
+
+  block = udisks_object_peek_block (object);
+  if (block == NULL)
+    goto out;
+
+  if (g_strcmp0 (udisks_block_get_device (block), device_file) == 0)
+    ret = TRUE;
+
+  /* TODO: check symlinks? */
+
+ out:
+  return ret;
+}
+
+/**
+ * udisks_daemon_find_block_by_device_file:
+ * @daemon: A #UDisksDaemon.
+ * @device_file: A device file.
+ *
+ * Finds a block device with device file given by @device_file.
+ *
+ * Returns: (transfer full): A #UDisksObject or %NULL if not found. Free with g_object_unref().
+ */
+UDisksObject *
+udisks_daemon_find_block_by_device_file (UDisksDaemon *daemon,
+                                         const gchar  *device_file)
+{
+  return udisks_daemon_wait_for_object_sync (daemon,
+                                             wait_for_device_file_cb,
+                                             (gpointer) device_file,
+                                             NULL, /* user_data_free_func */
+                                             0,
+                                             NULL);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static gboolean
+wait_for_sysfs_path_cb (UDisksDaemon  *daemon,
+                        UDisksObject  *object,
+                        gpointer       user_data)
+{
+  const gchar *sysfs_path = user_data;
+  GUdevDevice *device = NULL;
+  gboolean ret = FALSE;
+
+  if (!UDISKS_IS_LINUX_BLOCK_OBJECT (object))
+    goto out;
+
+  device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (object));
+  if (device == NULL)
+    goto out;
+
+  if (g_strcmp0 (g_udev_device_get_sysfs_path (device), sysfs_path) == 0)
+    ret = TRUE;
+
+ out:
+  g_clear_object (&device);
+  return ret;
+}
+
+/**
+ * udisks_daemon_find_block_by_sysfs_path:
+ * @daemon: A #UDisksDaemon.
+ * @sysfs_path: A sysfs path.
+ *
+ * Finds a block device with a sysfs path given by @sysfs_path.
+ *
+ * Returns: (transfer full): A #UDisksObject or %NULL if not found. Free with g_object_unref().
+ */
+UDisksObject *
+udisks_daemon_find_block_by_sysfs_path (UDisksDaemon *daemon,
+                                        const gchar  *sysfs_path)
+{
+  return udisks_daemon_wait_for_object_sync (daemon,
+                                             wait_for_sysfs_path_cb,
+                                             (gpointer) sysfs_path,
+                                             NULL, /* user_data_free_func */
+                                             0,
+                                             NULL);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 /**
  * udisks_daemon_find_object:
  * @daemon: A #UDisksDaemon.
index 8cda8f0..bef3499 100644 (file)
@@ -65,6 +65,12 @@ UDisksObject             *udisks_daemon_wait_for_object_sync  (UDisksDaemon
 UDisksObject             *udisks_daemon_find_block            (UDisksDaemon         *daemon,
                                                                dev_t                 block_device_number);
 
+UDisksObject             *udisks_daemon_find_block_by_device_file (UDisksDaemon *daemon,
+                                                                   const gchar  *device_file);
+
+UDisksObject             *udisks_daemon_find_block_by_sysfs_path (UDisksDaemon *daemon,
+                                                                  const gchar  *sysfs_path);
+
 UDisksObject             *udisks_daemon_find_object           (UDisksDaemon         *daemon,
                                                                const gchar          *object_path);