From e413670183309cbe16fc7ac22e84ccece9787eca Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Fri, 4 May 2012 14:19:44 -0400 Subject: [PATCH] Daemon: Add new find_block_*() convenience methods Signed-off-by: David Zeuthen --- doc/udisks2-sections.txt | 2 ++ src/udisksdaemon.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++ src/udisksdaemon.h | 6 ++++ 3 files changed, 101 insertions(+) diff --git a/doc/udisks2-sections.txt b/doc/udisks2-sections.txt index 471b483..f3b9d38 100644 --- a/doc/udisks2-sections.txt +++ b/doc/udisks2-sections.txt @@ -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 diff --git a/src/udisksdaemon.c b/src/udisksdaemon.c index 00aad6f..8cbc5c0 100644 --- a/src/udisksdaemon.c +++ b/src/udisksdaemon.c @@ -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. diff --git a/src/udisksdaemon.h b/src/udisksdaemon.h index 8cda8f0..bef3499 100644 --- a/src/udisksdaemon.h +++ b/src/udisksdaemon.h @@ -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); -- 2.7.4